请生成一个输入层4个节点,第一个隐藏层5个节点,第二个隐藏层4个节点,输出层1个节点,激活函数为ReLU,全连接的BP神经网络matlab训练代码,并且最后还要输出每一层的最终权值矩阵和偏置量
时间: 2023-06-09 18:02:42 浏览: 121
3入2出公路运量预测模型_3个节点输入2个节点输出_预测_
您好,根据您的要求,以下是所需的MATLAB代码:
%% 数据集生成
input = [0 0 1 1; 0 1 0 1; 1 1 1 1]; % 输入层数据
output = [0 1 1 0]; % 输出层数据
[l, w] = size(input); % 获取样本数和维数
%% 网络参数初始化
wh1 = rand(5, l); % 第一个隐藏层权值矩阵
bh1 = rand(5, 1); % 第一个隐藏层偏置量
wh2 = rand(4, 5); % 第二个隐藏层权值矩阵
bh2 = rand(4, 1); % 第二个隐藏层偏置量
wo = rand(1, 4); % 输出层权值矩阵
bo = rand(1, 1); % 输出层偏置量
%% 训练参数设置
alpha = 0.1; % 学习率
iteration = 10000; % 迭代次数
%% 网络训练
for i = 1 : iteration
%% 前向传播
zh1 = wh1 * input + bh1; % 第一个隐藏层输入
ah1 = max(zh1, 0); % 第一个隐藏层激活
zh2 = wh2 * ah1 + bh2; % 第二个隐藏层输入
ah2 = max(zh2, 0); % 第二个隐藏层激活
zo = wo * ah2 + bo; % 输出层输入
ao = max(zo, 0); % 输出层激活
%% 计算误差
error = 0.5 * sum((output - ao) .^ 2);
%% 反向传播
deltao = (ao - output) .* (zo > 0); % 输出层误差
deltah2 = (wo' * deltao) .* (zh2 > 0); % 第二个隐藏层误差
deltah1 = (wh2' * deltah2) .* (zh1 > 0); % 第一个隐藏层误差
%% 更新权值和偏置量
wo = wo - alpha * deltao * ah2'; % 输出层权值更新
bo = bo - alpha * sum(deltao, 2); % 输出层偏置量更新
wh2 = wh2 - alpha * deltah2 * ah1'; % 第二个隐藏层权值更新
bh2 = bh2 - alpha * sum(deltah2, 2); % 第二个隐藏层偏置量更新
wh1 = wh1 - alpha * deltah1 * input'; % 第一个隐藏层权值更新
bh1 = bh1 - alpha * sum(deltah1, 2); % 第一个隐藏层偏置量更新
%% 输出每一层最终权值矩阵和偏置量
if mod(i, 1000) == 0
fprintf('第 %d 次迭代:\n', i);
disp(['wh1 = ', num2str(wh1)]);
disp(['bh1 = ', num2str(bh1)]);
disp(['wh2 = ', num2str(wh2)]);
disp(['bh2 = ', num2str(bh2)]);
disp(['wo = ', num2str(wo)]);
disp(['bo = ', num2str(bo)]);
fprintf('误差:%.4f\n', error);
end
end
%% 测试代码
test_input = [1 0 0 1; 0 1 1 0; 1 0 1 0]; % 测试数据
test_output = [0 1 1 0]; % 测试标签
test_ah1 = max(wh1 * test_input + bh1, 0); % 第一个隐藏层测试结果
test_ah2 = max(wh2 * test_ah1 + bh2, 0); % 第二个隐藏层测试结果
test_ao = max(wo * test_ah2 + bo, 0); % 输出层测试结果
fprintf('测试误差:%.4f\n', 0.5 * sum((test_output - test_ao) .^ 2));
阅读全文