编写含有三层网络BP神经网络matlab代码实现MNIST手写数字集分类
时间: 2023-07-29 18:09:07 浏览: 114
基于BP神经网络和卷积神经网络的MNIST手写数字识别
以下是三层BP神经网络的MATLAB代码实现,用于分类MNIST手写数字集:
```
% 加载MNIST数据集
load mnist.mat
% 将训练数据和测试数据分别存储在X_train, Y_train, X_test, Y_test中
X_train = double(train_X') / 255;
Y_train = double(train_labels');
X_test = double(test_X') / 255;
Y_test = double(test_labels');
% 设定网络参数
input_size = size(X_train, 2);
hidden_size = 100;
output_size = 10;
learning_rate = 0.1;
num_epochs = 50;
batch_size = 100;
% 初始化权重和偏置
W1 = randn(input_size, hidden_size) * 0.01;
b1 = zeros(1, hidden_size);
W2 = randn(hidden_size, output_size) * 0.01;
b2 = zeros(1, output_size);
% 开始训练
for epoch = 1:num_epochs
% 将训练数据随机打乱
idx = randperm(size(X_train, 1));
X_train = X_train(idx, :);
Y_train = Y_train(idx, :);
% 按照batch_size进行训练
for i = 1:batch_size:size(X_train, 1)
% 获取一个batch的数据
X_batch = X_train(i:i+batch_size-1, :);
Y_batch = Y_train(i:i+batch_size-1, :);
% 前向传播
Z1 = X_batch * W1 + b1;
A1 = sigmoid(Z1);
Z2 = A1 * W2 + b2;
A2 = softmax(Z2);
% 计算损失和梯度
loss = cross_entropy(A2, Y_batch);
dZ2 = A2 - Y_batch;
dW2 = A1' * dZ2 / batch_size;
db2 = sum(dZ2, 1) / batch_size;
dA1 = dZ2 * W2';
dZ1 = dA1 .* sigmoid_grad(A1);
dW1 = X_batch' * dZ1 / batch_size;
db1 = sum(dZ1, 1) / batch_size;
% 更新权重和偏置
W1 = W1 - learning_rate * dW1;
b1 = b1 - learning_rate * db1;
W2 = W2 - learning_rate * dW2;
b2 = b2 - learning_rate * db2;
end
% 计算训练集和测试集的准确率
train_acc = compute_accuracy(X_train, Y_train, W1, b1, W2, b2);
test_acc = compute_accuracy(X_test, Y_test, W1, b1, W2, b2);
fprintf('Epoch %d: loss = %f, train_acc = %f, test_acc = %f\n', epoch, loss, train_acc, test_acc);
end
% 定义sigmoid函数
function y = sigmoid(x)
y = 1 ./ (1 + exp(-x));
end
% 定义sigmoid函数的导数
function y = sigmoid_grad(x)
y = sigmoid(x) .* (1 - sigmoid(x));
end
% 定义softmax函数
function y = softmax(x)
exp_scores = exp(x);
y = exp_scores ./ sum(exp_scores, 2);
end
% 定义交叉熵损失函数
function loss = cross_entropy(y_pred, y_true)
N = size(y_pred, 1);
loss = -sum(log(y_pred(sub2ind(size(y_pred), 1:N, y_true')))) / N;
end
% 定义计算准确率的函数
function acc = compute_accuracy(X, Y, W1, b1, W2, b2)
Z1 = X * W1 + b1;
A1 = sigmoid(Z1);
Z2 = A1 * W2 + b2;
A2 = softmax(Z2);
[~, pred] = max(A2, [], 2);
acc = mean(pred == Y);
end
```
该代码实现了一个三层的BP神经网络,包括一个输入层、一个隐藏层和一个输出层。其中,输入层和输出层的大小分别为784和10,对应MNIST数据集中每张图片的像素数和标签数。隐藏层的大小为100,可以根据需要调整。学习率、训练轮数和batch大小也可以根据需要进行调整。
在训练过程中,使用随机梯度下降法更新权重和偏置。每个epoch都对训练集进行一次遍历,将训练数据随机打乱,并按照batch_size进行训练。计算损失和梯度时使用交叉熵损失函数和softmax函数。在每个epoch结束后,计算训练集和测试集的准确率。
最后,定义了一些辅助函数,包括sigmoid函数、sigmoid函数的导数、softmax函数、交叉熵损失函数和计算准确率的函数。
阅读全文