神经网络java代码
时间: 2023-07-08 22:16:41 浏览: 33
以下是一个简单的神经网络Java代码示例:
```java
public class NeuralNetwork {
private double[] input; // 输入层
private double[][][] weights; // 权重
private double[][] bias; // 偏置
private double[][] output; // 输出层
private int[] layerSizes; // 每层神经元数量
public NeuralNetwork(int... layerSizes) {
this.layerSizes = layerSizes;
this.weights = new double[layerSizes.length - 1][][];
this.bias = new double[layerSizes.length - 1][];
this.output = new double[layerSizes.length][];
this.input = new double[layerSizes[0]];
// 初始化权重和偏置
for (int i = 0; i < layerSizes.length - 1; i++) {
weights[i] = new double[layerSizes[i + 1]][layerSizes[i]];
bias[i] = new double[layerSizes[i + 1]];
for (int j = 0; j < layerSizes[i + 1]; j++) {
for (int k = 0; k < layerSizes[i]; k++) {
weights[i][j][k] = Math.random() * 2 - 1; // 随机初始化权重
}
bias[i][j] = Math.random() * 2 - 1; // 随机初始化偏置
}
}
// 初始化输出层
for (int i = 0; i < layerSizes.length; i++) {
output[i] = new double[layerSizes[i]];
}
}
// 激活函数,这里使用sigmoid函数
private double sigmoid(double x) {
return 1 / (1 + Math.exp(-x));
}
// 前向传播
public double[] feedForward(double... input) {
if (input.length != layerSizes[0]) {
throw new IllegalArgumentException("输入层大小错误");
}
this.input = input;
for (int i = 0; i < layerSizes.length - 1; i++) {
for (int j = 0; j < layerSizes[i + 1]; j++) {
double sum = 0;
for (int k = 0; k < layerSizes[i]; k++) {
sum += weights[i][j][k] * input[k];
}
sum += bias[i][j];
output[i + 1][j] = sigmoid(sum);
}
input = output[i + 1];
}
return output[layerSizes.length - 1];
}
// 训练网络
public void train(double[] input, double[] targetOutput, double learningRate) {
if (input.length != layerSizes[0]) {
throw new IllegalArgumentException("输入层大小错误");
}
if (targetOutput.length != layerSizes[layerSizes.length - 1]) {
throw new IllegalArgumentException("目标输出层大小错误");
}
// 前向传播
feedForward(input);
// 反向传播
double[][] delta = new double[layerSizes.length][];
for (int i = layerSizes.length - 1; i >= 1; i--) {
delta[i] = new double[layerSizes[i]];
if (i == layerSizes.length - 1) {
for (int j = 0; j < layerSizes[i]; j++) {
delta[i][j] = (output[i][j] - targetOutput[j]) * output[i][j] * (1 - output[i][j]);
}
} else {
for (int j = 0; j < layerSizes[i]; j++) {
double sum = 0;
for (int k = 0; k < layerSizes[i + 1]; k++) {
sum += weights[i][k][j] * delta[i + 1][k];
}
delta[i][j] = sum * output[i][j] * (1 - output[i][j]);
}
}
}
// 更新权重和偏置
for (int i = 0; i < layerSizes.length - 1; i++) {
for (int j = 0; j < layerSizes[i + 1]; j++) {
for (int k = 0; k < layerSizes[i]; k++) {
weights[i][j][k] -= learningRate * delta[i + 1][j] * input[k];
}
bias[i][j] -= learningRate * delta[i + 1][j];
}
input = output[i + 1];
}
}
}
```
这个神经网络有一个输入层,一个输出层和任意数量的隐藏层。可以使用`NeuralNetwork`类的构造函数指定每个层的神经元数量。`feedForward`方法将输入传递到网络并返回输出,`train`方法用于训练网络并更新权重和偏置。