反向传播算法的MATLAB实现程序
时间: 2023-11-07 10:54:31 浏览: 35
下面是一个简单的反向传播算法的MATLAB实现程序,该程序用于训练一个多层感知器(MLP)来学习XOR逻辑运算。
```matlab
% 训练数据
X = [0,0;0,1;1,0;1,1];
Y = [0;1;1;0];
% 网络参数
input_layer_size = 2; % 输入层节点数
hidden_layer_size = 4; % 隐藏层节点数
output_layer_size = 1; % 输出层节点数
% 随机初始化权重和偏置
Theta1 = rand(hidden_layer_size, input_layer_size + 1) * 2 - 1;
Theta2 = rand(output_layer_size, hidden_layer_size + 1) * 2 - 1;
% 训练参数
alpha = 0.1; % 学习率
epoch = 10000; % 迭代次数
% 反向传播算法
for i = 1:epoch
% 前向传播
a1 = [ones(size(X, 1), 1), X];
z2 = a1 * Theta1';
a2 = [ones(size(z2, 1), 1), sigmoid(z2)];
z3 = a2 * Theta2';
a3 = sigmoid(z3);
J = -mean(Y .* log(a3) + (1 - Y) .* log(1 - a3));
if rem(i, 1000) == 0
fprintf('迭代次数:%d,误差:%f\n', i, J);
end
% 反向传播
delta3 = a3 - Y;
delta2 = delta3 * Theta2 .* sigmoidGradient([ones(size(z2, 1), 1), z2]);
delta2 = delta2(:, 2:end);
Theta2_grad = delta3' * a2 / size(X, 1);
Theta1_grad = delta2' * a1 / size(X, 1);
% 更新权重和偏置
Theta2 = Theta2 - alpha * Theta2_grad;
Theta1 = Theta1 - alpha * Theta1_grad;
end
% 测试模型
test = [0,0;0,1;1,0;1,1];
result = sigmoid([ones(size(test, 1), 1), sigmoid([ones(size(test, 1), 1), test] * Theta1')] * Theta2')
```
上述程序中,我们首先定义了XOR问题的训练数据X和标签Y,然后随机初始化了两个权重矩阵Theta1和Theta2。接下来,我们使用反向传播算法进行训练,将训练数据传入神经网络中,进行前向传播和反向传播。在每次迭代中,我们计算误差J,并输出迭代次数和误差信息。最后,我们使用训练好的模型进行测试,并输出测试结果。