给我一段BP神经网络的Matlab代码
时间: 2024-06-03 20:08:10 浏览: 125
下面是一个简单的BP神经网络的Matlab代码:
% 设置训练数据
X = [0 0 1 1; 0 1 0 1]; % 输入数据
Y = [0 1 1 0]; % 目标数据
% 设置网络参数
inputSize = 2; % 输入层大小
hiddenSize = 4; % 隐层大小
outputSize = 1; % 输出层大小
learningRate = 0.1; % 学习率
maxEpochs = 10000; % 最大迭代次数
tolerance = 1e-5; % 收敛容差
% 初始化权重和偏置
W1 = randn(hiddenSize, inputSize); % 输入层到隐层权重矩阵
W2 = randn(outputSize, hiddenSize); % 隐层到输出层权重矩阵
b1 = randn(hiddenSize, 1); % 隐层偏置向量
b2 = randn(outputSize, 1); % 输出层偏置向量
% 训练网络
for epoch = 1:maxEpochs
% 前向传播
Z1 = W1*X + b1; % 隐层输入
A1 = tanh(Z1); % 隐层输出
Z2 = W2*A1 + b2; % 输出层输入
Yhat = sigmoid(Z2); % 输出层输出
% 计算代价函数和误差
J = (1/length(Y))*sum((Y-Yhat).^2); % 均方误差代价函数
delta2 = (Yhat-Y).*sigmoidGradient(Z2); % 输出层误差
delta1 = (W2'*delta2).*tanhGradient(Z1); % 隐层误差
% 反向传播更新权重和偏置
dW2 = (1/length(Y))*delta2*A1'; % 隐层到输出层权重梯度
db2 = (1/length(Y))*sum(delta2, 2); % 输出层偏置梯度
dW1 = (1/length(Y))*delta1*X'; % 输入层到隐层权重梯度
db1 = (1/length(Y))*sum(delta1, 2); % 隐层偏置梯度
W2 = W2 - learningRate*dW2; % 更新隐层到输出层权重
b2 = b2 - learningRate*db2; % 更新输出层偏置
W1 = W1 - learningRate*dW1; % 更新输入层到隐层权重
b1 = b1 - learningRate*db1; % 更新隐层偏置
% 判断是否收敛
if J < tolerance
break;
end
end
% 测试网络
Xtest = [1 1 0 0; 1 0 1 0]; % 测试数据
Z1test = W1*Xtest + b1; % 隐层输入
A1test = tanh(Z1test); % 隐层输出
Z2test = W2*A1test + b2; % 输出层输入
Yhattest = sigmoid(Z2test); % 输出层输出
disp(Yhattest); % 打印预测结果
阅读全文