你是否曾好奇人工智能背后的“大脑”是如何工作的?其实,神经网络并不神秘!本教程将带你用C语言从零开始实现一个简单的神经网络。无论你是编程新手还是有一定基础的开发者,只要跟着步骤走,都能掌握C语言神经网络的核心原理与实现方法。
神经网络是一种模拟人脑神经元工作方式的计算模型。它由输入层、隐藏层和输出层组成,通过调整连接权重来“学习”数据中的模式。在本教程中,我们将实现一个最简单的前馈神经网络(Feedforward Neural Network),用于解决如 XOR 逻辑问题。
我们先定义一个包含输入层、一个隐藏层和输出层的简单网络。假设输入为2个特征,隐藏层有4个神经元,输出为1个值。
#include <stdio.h>#include <stdlib.h>#include <math.h>#define INPUT_SIZE 2#define HIDDEN_SIZE 4#define OUTPUT_SIZE 1#define LEARNING_RATE 0.1typedef struct { double weights_input_hidden[INPUT_SIZE][HIDDEN_SIZE]; double weights_hidden_output[HIDDEN_SIZE][OUTPUT_SIZE]; double bias_hidden[HIDDEN_SIZE]; double bias_output[OUTPUT_SIZE];} NeuralNetwork; 激活函数让神经网络具备非线性表达能力。我们使用经典的 Sigmoid 函数:
double sigmoid(double x) { return 1.0 / (1.0 + exp(-x));}double sigmoid_derivative(double x) { return x * (1 - x);} 前向传播是将输入数据通过网络计算出预测结果的过程:
void forward_propagate(NeuralNetwork* nn, double input[INPUT_SIZE], double hidden_output[HIDDEN_SIZE], double final_output[OUTPUT_SIZE]) { // 计算隐藏层输出 for (int i = 0; i < HIDDEN_SIZE; i++) { double sum = nn->bias_hidden[i]; for (int j = 0; j < INPUT_SIZE; j++) { sum += input[j] * nn->weights_input_hidden[j][i]; } hidden_output[i] = sigmoid(sum); } // 计算输出层 for (int i = 0; i < OUTPUT_SIZE; i++) { double sum = nn->bias_output[i]; for (int j = 0; j < HIDDEN_SIZE; j++) { sum += hidden_output[j] * nn->weights_hidden_output[j][i]; } final_output[i] = sigmoid(sum); }} 通过反向传播算法,我们可以根据预测误差调整权重,这就是“学习”的过程:
void train(NeuralNetwork* nn, double inputs[][INPUT_SIZE], double targets[][OUTPUT_SIZE], int n_samples, int epochs) { double hidden_out[HIDDEN_SIZE]; double output_out[OUTPUT_SIZE]; for (int epoch = 0; epoch < epochs; epoch++) { for (int s = 0; s < n_samples; s++) { // 前向传播 forward_propagate(nn, inputs[s], hidden_out, output_out); // 计算输出层误差 double output_error[OUTPUT_SIZE]; for (int i = 0; i < OUTPUT_SIZE; i++) { output_error[i] = targets[s][i] - output_out[i]; } // 更新输出层权重 for (int i = 0; i < HIDDEN_SIZE; i++) { for (int j = 0; j < OUTPUT_SIZE; j++) { double delta = output_error[j] * sigmoid_derivative(output_out[j]); nn->weights_hidden_output[i][j] += LEARNING_RATE * delta * hidden_out[i]; nn->bias_output[j] += LEARNING_RATE * delta; } } // 更新隐藏层权重 for (int i = 0; i < INPUT_SIZE; i++) { for (int j = 0; j < HIDDEN_SIZE; j++) { double hidden_error = 0.0; for (int k = 0; k < OUTPUT_SIZE; k++) { hidden_error += output_error[k] * nn->weights_hidden_output[j][k]; } double delta = hidden_error * sigmoid_derivative(hidden_out[j]); nn->weights_input_hidden[i][j] += LEARNING_RATE * delta * inputs[s][i]; nn->bias_hidden[j] += LEARNING_RATE * delta; } } } }} 现在,让我们用 XOR 数据集来训练网络。XOR 是一个经典非线性问题,单层感知机无法解决,但我们的多层网络可以!
int main() { // 初始化网络(这里简化:用随机数初始化) NeuralNetwork nn; for (int i = 0; i < INPUT_SIZE; i++) for (int j = 0; j < HIDDEN_SIZE; j++) nn.weights_input_hidden[i][j] = (double)rand() / RAND_MAX; for (int i = 0; i < HIDDEN_SIZE; i++) for (int j = 0; j < OUTPUT_SIZE; j++) nn.weights_hidden_output[i][j] = (double)rand() / RAND_MAX; for (int i = 0; i < HIDDEN_SIZE; i++) nn.bias_hidden[i] = 0.0; for (int i = 0; i < OUTPUT_SIZE; i++) nn.bias_output[i] = 0.0; // XOR 训练数据 double inputs[4][2] = {{0,0}, {0,1}, {1,0}, {1,1}}; double targets[4][1] = {{0}, {1}, {1}, {0}}; // 训练10000轮 train(&nn, inputs, targets, 4, 10000); // 测试 for (int i = 0; i < 4; i++) { double hidden[HIDDEN_SIZE], output[OUTPUT_SIZE]; forward_propagate(&nn, inputs[i], hidden, output); printf("Input: %d %d → Output: %.4f\n", (int)inputs[i][0], (int)inputs[i][1], output[0]); } return 0;} 恭喜你!你已经用 C语言实现神经网络 完成了一个可训练的模型。虽然这个例子很简单,但它包含了神经网络算法教程中最核心的概念:前向传播、激活函数、反向传播和权重更新。
通过本教程,你不仅掌握了从零开始学神经网络的方法,还理解了底层原理——这比直接调用深度学习框架更有价值。下一步,你可以尝试增加层数、使用不同激活函数(如 ReLU),或解决更复杂的分类问题。
提示:完整代码可在 GitHub 上找到开源示例,搜索 “C language neural network from scratch” 即可。
本文由主机测评网于2025-12-08发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124757.html