939 字
5 分钟
Java实现简单多层感知器神经网络
使用 Java 实现一个简单的神经网络模型可以通过以下步骤完成。我们将实现一个基本的多层感知器(MLP)神经网络,用于解决简单的分类问题。以下是一个简单的实现示例:
1. 导入必要的库
首先,确保你已经安装了 Java 开发环境(JDK)。我们将使用 Java 的标准库来实现神经网络。
2. 定义神经网络结构
我们将实现一个简单的三层神经网络(输入层、隐藏层、输出层)。
public class NeuralNetwork { private int inputNodes; private int hiddenNodes; private int outputNodes; private double[][] weightsInputHidden; private double[][] weightsHiddenOutput; private double[] hiddenBias; private double[] outputBias;
public NeuralNetwork(int inputNodes, int hiddenNodes, int outputNodes) { this.inputNodes = inputNodes; this.hiddenNodes = hiddenNodes; this.outputNodes = outputNodes;
// Initialize weights with random values this.weightsInputHidden = new double[hiddenNodes][inputNodes]; this.weightsHiddenOutput = new double[outputNodes][hiddenNodes]; this.hiddenBias = new double[hiddenNodes]; this.outputBias = new double[outputNodes];
randomizeWeights(weightsInputHidden); randomizeWeights(weightsHiddenOutput); randomizeBiases(hiddenBias); randomizeBiases(outputBias); }
private void randomizeWeights(double[][] weights) { for (int i = 0; i < weights.length; i++) { for (int j = 0; j < weights[i].length; j++) { weights[i][j] = Math.random() - 0.5; } } }
private void randomizeBiases(double[] biases) { for (int i = 0; i < biases.length; i++) { biases[i] = Math.random() - 0.5; } }
public double[] feedForward(double[] input) { double[] hiddenOutputs = new double[hiddenNodes]; double[] finalOutputs = new double[outputNodes];
// Calculate hidden layer outputs for (int i = 0; i < hiddenNodes; i++) { double sum = 0; for (int j = 0; j < inputNodes; j++) { sum += input[j] * weightsInputHidden[i][j]; } sum += hiddenBias[i]; hiddenOutputs[i] = sigmoid(sum); }
// Calculate output layer outputs for (int i = 0; i < outputNodes; i++) { double sum = 0; for (int j = 0; j < hiddenNodes; j++) { sum += hiddenOutputs[j] * weightsHiddenOutput[i][j]; } sum += outputBias[i]; finalOutputs[i] = sigmoid(sum); }
return finalOutputs; }
private double sigmoid(double x) { return 1 / (1 + Math.exp(-x)); }
private double sigmoidDerivative(double x) { return x * (1 - x); }
public void train(double[] input, double[] target, double learningRate) { double[] hiddenOutputs = new double[hiddenNodes]; double[] finalOutputs = new double[outputNodes];
// Feed forward for (int i = 0; i < hiddenNodes; i++) { double sum = 0; for (int j = 0; j < inputNodes; j++) { sum += input[j] * weightsInputHidden[i][j]; } sum += hiddenBias[i]; hiddenOutputs[i] = sigmoid(sum); }
for (int i = 0; i < outputNodes; i++) { double sum = 0; for (int j = 0; j < hiddenNodes; j++) { sum += hiddenOutputs[j] * weightsHiddenOutput[i][j]; } sum += outputBias[i]; finalOutputs[i] = sigmoid(sum); }
// Backpropagation double[] outputErrors = new double[outputNodes]; for (int i = 0; i < outputNodes; i++) { outputErrors[i] = target[i] - finalOutputs[i]; }
double[] hiddenErrors = new double[hiddenNodes]; for (int i = 0; i < hiddenNodes; i++) { double error = 0; for (int j = 0; j < outputNodes; j++) { error += outputErrors[j] * weightsHiddenOutput[j][i]; } hiddenErrors[i] = error; }
// Update weights and biases for output layer for (int i = 0; i < outputNodes; i++) { for (int j = 0; j < hiddenNodes; j++) { weightsHiddenOutput[i][j] += learningRate * outputErrors[i] * sigmoidDerivative(finalOutputs[i]) * hiddenOutputs[j]; } outputBias[i] += learningRate * outputErrors[i] * sigmoidDerivative(finalOutputs[i]); }
// Update weights and biases for hidden layer for (int i = 0; i < hiddenNodes; i++) { for (int j = 0; j < inputNodes; j++) { weightsInputHidden[i][j] += learningRate * hiddenErrors[i] * sigmoidDerivative(hiddenOutputs[i]) * input[j]; } hiddenBias[i] += learningRate * hiddenErrors[i] * sigmoidDerivative(hiddenOutputs[i]); } }}3. 使用神经网络
现在我们可以使用这个神经网络来进行训练和预测。
public class Main { public static void main(String[] args) { // Create a neural network with 2 input nodes, 3 hidden nodes, and 1 output node NeuralNetwork nn = new NeuralNetwork(2, 3, 1);
// Training data (XOR problem) double[][] inputs = { {0, 0}, {0, 1}, {1, 0}, {1, 1} }; double[][] targets = { {0}, {1}, {1}, {0} };
// Train the network int epochs = 10000; double learningRate = 0.1; for (int i = 0; i < epochs; i++) { for (int j = 0; j < inputs.length; j++) { nn.train(inputs[j], targets[j], learningRate); } }
// Test the network for (double[] input : inputs) { double[] output = nn.feedForward(input); System.out.println("Input: " + input[0] + ", " + input[1] + " Output: " + output[0]); } }}4. 运行程序
编译并运行上述代码,你将看到神经网络在训练后能够正确预测 XOR 问题的输出。
5. 进一步改进
这个简单的神经网络实现可以进一步改进,例如:
- 增加更多的隐藏层。
- 使用不同的激活函数(如 ReLU)。
- 实现更复杂的优化算法(如 Adam)。
- 增加正则化技术(如 dropout)。
- 使用更复杂的损失函数。
通过这些改进,你可以构建更强大和灵活的神经网络模型。