请生成一个输入层4个节点,第一个隐藏层5个节点,第二个隐藏层4个节点,输出层1个节点,激活函数为tanh,全连接的BP神经网络matlab训练代码
时间: 2024-06-10 08:05:37 浏览: 67
好的,我可以为您生成一个输入层为4个节点,第一个隐藏层为5个节点,第二个隐藏层为4个节点,输出层为1个节点,激活函数为tanh,全连接的BP神经网络matlab训练代码。下面是代码:
%% 准备数据
X = rand(4,100); % 输入数据
Y = rand(1,100); % 输出数据
%% 神经网络参数设置
input_layer_size = 4; % 输入层节点数
hidden_layer1_size = 5; % 第一个隐藏层节点数
hidden_layer2_size = 4; % 第二个隐藏层节点数
output_layer_size = 1; % 输出层节点数
%% 随机初始化权重参数
Theta1 = rand(hidden_layer1_size,input_layer_size+1)*2-1;
Theta2 = rand(hidden_layer2_size,hidden_layer1_size+1)*2-1;
Theta3 = rand(output_layer_size,hidden_layer2_size+1)*2-1;
%% 反向传播训练
learning_rate = 0.1; % 学习率
lambda = 0.001; % 正则化系数
for i = 1:10000 % 迭代次数
% 前向传播计算预测值
a1 = [ones(1,size(X,2)); X]; % 加上偏置单位
z2 = Theta1*a1;
a2 = [ones(1,size(z2,2)); tanh(z2)]; % 加上偏置单位
z3 = Theta2*a2;
a3 = [ones(1,size(z3,2)); tanh(z3)]; % 加上偏置单位
z4 = Theta3*a3;
h = tanh(z4); % 预测值
% 计算代价函数和正则化项
J = sum(sum((h-Y).^2))/2/size(X,2);
reg = sum(sum(Theta1(:,2:end).^2))+...
sum(sum(Theta2(:,2:end).^2))+...
sum(sum(Theta3(:,2:end).^2));
J = J+lambda/2/size(X,2)*reg;
% 反向传播计算梯度
delta4 = (h-Y).*sech(z4).^2; % 输出层误差项
delta3 = (Theta3(:,2:end)'*delta4).*sech(z3).^2; % 第二个隐藏层误差项
delta2 = (Theta2(:,2:end)'*delta3).*sech(z2).^2; % 第一个隐藏层误差项
Delta1 = delta2*a1'; % 第一个权重梯度
Delta2 = delta3*a2'; % 第二个权重梯度
Delta3 = delta4*a3'; % 第三个权重梯度
% 正则化梯度
Theta1_grad = Delta1/size(X,2)+lambda/size(X,2)*...
[zeros(size(Theta1,1),1) Theta1(:,2:end)];
Theta2_grad = Delta2/size(X,2)+lambda/size(X,2)*...
[zeros(size(Theta2,1),1) Theta2(:,2:end)];
Theta3_grad = Delta3/size(X,2)+lambda/size(X,2)*...
[zeros(size(Theta3,1),1) Theta3(:,2:end)];
% 更新权重参数
Theta1 = Theta1-learning_rate*Theta1_grad;
Theta2 = Theta2-learning_rate*Theta2_grad;
Theta3 = Theta3-learning_rate*Theta3_grad;
end
% 测试预测性能
X_test = rand(4,10);
a1_test = [ones(1,size(X_test,2)); X_test]; % 加上偏置单位
z2_test = Theta1*a1_test;
a2_test = [ones(1,size(z2_test,2)); tanh(z2_test)]; % 加上偏置单位
z3_test = Theta2*a2_test;
a3_test = [ones(1,size(z3_test,2)); tanh(z3_test)]; % 加上偏置单位
z4_test = Theta3*a3_test;
h_test = tanh(z4_test);
disp(h_test); % 输出预测结果
阅读全文