MATLAB 实现 BP 算法 ReLu 神经网络
% 设置训练数据 X = [0 0 1 1; 0 1 0 1]; % 输入 Y = [0 1 1 0]; % 目标输出
% 设置神经网络结构 n_input = size(X,1); % 输入层节点数 n_hidden = 2; % 隐藏层节点数 n_output = 1; % 输出层节点数
% 初始化网络权重和偏置 W1 = randn(n_hidden,n_input); % 输入层到隐藏层的权重 b1 = randn(n_hidden,1); % 隐藏层的偏置 W2 = randn(n_output,n_hidden); % 隐藏层到输出层的权重 b2 = randn(n_output,1); % 输出层的偏置
% 设置训练参数 learning_rate = 0.1; % 学习率 n_epoch = 10000; % 训练轮数
% 训练神经网络 for epoch = 1:n_epoch % 前向传播计算网络输出 Z1 = W1X + b1; % 隐藏层输入 A1 = max(0,Z1); % 隐藏层输出(ReLu 激活函数) Z2 = W2A1 + b2; % 输出层输入 Y_pred = 1./(1+exp(-Z2)); % 输出层输出(sigmoid 激活函数)
% 计算损失函数
loss = sum((Y-Y_pred).^2)/size(Y,2);
% 反向传播更新权重和偏置
dZ2 = Y_pred - Y; % 输出层误差
dW2 = dZ2*A1'/size(Y,2); % 隐藏层到输出层的权重梯度
db2 = sum(dZ2,2)/size(Y,2); % 输出层的偏置梯度
dZ1 = (W2'*dZ2).*(Z1>0); % 隐藏层误差(ReLu 激活函数的导数)
dW1 = dZ1*X'/size(Y,2); % 输入层到隐藏层的权重梯度
db1 = sum(dZ1,2)/size(Y,2); % 隐藏层的偏置梯度
% 更新权重和偏置
W2 = W2 - learning_rate*dW2;
b2 = b2 - learning_rate*db2;
W1 = W1 - learning_rate*dW1;
b1 = b1 - learning_rate*db1;
% 打印训练进度
if mod(epoch,1000) == 0
fprintf('Epoch %d, Loss %.4f
',epoch,loss); end end
% 使用训练好的神经网络进行预测 Z1 = W1X + b1; % 隐藏层输入 A1 = max(0,Z1); % 隐藏层输出(ReLu 激活函数) Z2 = W2A1 + b2; % 输出层输入 Y_pred = 1./(1+exp(-Z2)); % 输出层输出(sigmoid 激活函数)
% 打印预测结果 fprintf('Predictions: %s ',num2str(Y_pred));
原文地址: https://www.cveoy.top/t/topic/nu7I 著作权归作者所有。请勿转载和采集!