生成一段C语言实现的BP神经网络算法
时间: 2023-05-11 15:05:00 浏览: 76
以下是一段C语言实现的BP神经网络算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define INPUT_NUM 2
#define HIDDEN_NUM 3
#define OUTPUT_NUM 1
#define LEARNING_RATE 0.5
#define EPOCHS 10000
double sigmoid(double x) {
return 1.0 / (1.0 + exp(-x));
}
double sigmoid_derivative(double x) {
return x * (1.0 - x);
}
int main() {
double inputs[INPUT_NUM][4] = {{0, 0, 1, 1}, {0, 1, 0, 1}};
double outputs[OUTPUT_NUM][4] = {{0, 1, 1, 0}};
double hidden_weights[HIDDEN_NUM][INPUT_NUM + 1];
double output_weights[OUTPUT_NUM][HIDDEN_NUM + 1];
double hidden_outputs[HIDDEN_NUM];
double output;
double error;
double delta_output;
double delta_hidden[HIDDEN_NUM];
double delta_weight;
// initialize weights
for (int i = 0; i < HIDDEN_NUM; i++) {
for (int j = 0; j < INPUT_NUM + 1; j++) {
hidden_weights[i][j] = ((double) rand() / RAND_MAX) * 2.0 - 1.0;
}
}
for (int i = 0; i < OUTPUT_NUM; i++) {
for (int j = 0; j < HIDDEN_NUM + 1; j++) {
output_weights[i][j] = ((double) rand() / RAND_MAX) * 2.0 - 1.0;
}
}
// train
for (int epoch = 0; epoch < EPOCHS; epoch++) {
for (int i = 0; i < 4; i++) {
// forward pass
for (int j = 0; j < HIDDEN_NUM; j++) {
double sum = hidden_weights[j][0];
for (int k = 0; k < INPUT_NUM; k++) {
sum += hidden_weights[j][k + 1] * inputs[k][i];
}
hidden_outputs[j] = sigmoid(sum);
}
double sum = output_weights[0][0];
for (int j = 0; j < HIDDEN_NUM; j++) {
sum += output_weights[0][j + 1] * hidden_outputs[j];
}
output = sigmoid(sum);
// backward pass
error = outputs[0][i] - output;
delta_output = error * sigmoid_derivative(output);
for (int j = 0; j < HIDDEN_NUM; j++) {
delta_hidden[j] = delta_output * output_weights[0][j + 1] * sigmoid_derivative(hidden_outputs[j]);
}
for (int j = 0; j < HIDDEN_NUM; j++) {
delta_weight = LEARNING_RATE * delta_hidden[j];
hidden_weights[j][0] += delta_weight;
for (int k = 0; k < INPUT_NUM; k++) {
hidden_weights[j][k + 1] += delta_weight * inputs[k][i];
}
}
delta_weight = LEARNING_RATE * delta_output;
output_weights[0][0] += delta_weight;
for (int j = 0; j < HIDDEN_NUM; j++) {
output_weights[0][j + 1] += delta_weight * hidden_outputs[j];
}
}
}
// test
for (int i = 0; i < 4; i++) {
for (int j = 0; j < HIDDEN_NUM; j++) {
double sum = hidden_weights[j][0];
for (int k = 0; k < INPUT_NUM; k++) {
sum += hidden_weights[j][k + 1] * inputs[k][i];
}
hidden_outputs[j] = sigmoid(sum);
}
double sum = output_weights[0][0];
for (int j = 0; j < HIDDEN_NUM; j++) {
sum += output_weights[0][j + 1] * hidden_outputs[j];
}
output = sigmoid(sum);
printf("Input: %lf %lf, Output: %lf\n", inputs[0][i], inputs[1][i], output);
}
return 0;
}
```
这段代码实现了一个简单的BP神经网络,用于解决异或问题。它包括了前向传播、反向传播和权重更新三个步骤,以及一个简单的测试过程。