小批量梯度下降法matlab实例
时间: 2023-07-13 18:25:51 浏览: 85
梯度下降法的matlab程序,已检查过,没有错误
5星 · 资源好评率100%
以下是一个使用小批量梯度下降法训练神经网络的Matlab实例:
```
% 加载数据
load('train_data.mat'); % X为训练数据,y为标签
% 初始化网络参数
input_size = size(X, 2); % 输入层大小
hidden_size = 25; % 隐藏层大小
output_size = 10; % 输出层大小
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); % 输出层偏置
% 定义超参数
alpha = 0.1; % 学习率
batch_size = 64; % 小批量大小
max_iter = 1000; % 最大迭代次数
% 训练网络
for i = 1:max_iter
% 分割小批量
idx = randperm(size(X, 1));
X_batch = X(idx(1:batch_size), :);
y_batch = y(idx(1:batch_size), :);
% 前向传播
z1 = X_batch * W1 + repmat(b1, batch_size, 1);
a1 = sigmoid(z1);
z2 = a1 * W2 + repmat(b2, batch_size, 1);
y_pred = softmax(z2);
% 计算损失
loss = -1/batch_size * sum(sum(y_batch .* log(y_pred)));
% 反向传播
delta3 = y_pred - y_batch;
delta2 = delta3 * W2' .* sigmoidGradient(z1);
% 计算梯度
grad_W2 = 1/batch_size * a1' * delta3;
grad_b2 = 1/batch_size * sum(delta3);
grad_W1 = 1/batch_size * X_batch' * delta2;
grad_b1 = 1/batch_size * sum(delta2);
% 更新参数
W1 = W1 - alpha * grad_W1;
b1 = b1 - alpha * grad_b1;
W2 = W2 - alpha * grad_W2;
b2 = b2 - alpha * grad_b2;
% 输出损失
fprintf('Iteration %d, Loss: %f\n', i, loss);
end
% 预测结果
z1 = X * W1 + repmat(b1, size(X, 1), 1);
a1 = sigmoid(z1);
z2 = a1 * W2 + repmat(b2, size(X, 1), 1);
y_pred = softmax(z2);
[~, y_pred_label] = max(y_pred, [], 2); % 取出每行中最大值的索引
accuracy = sum(y_pred_label == y) / length(y); % 计算准确率
fprintf('Accuracy: %f\n', accuracy);
```
其中,sigmoid函数和softmax函数的实现如下:
```
function g = sigmoid(z)
g = 1./(1+exp(-z));
end
function g = softmax(z)
g = exp(z) ./ repmat(sum(exp(z), 2), 1, size(z, 2));
end
function g = sigmoidGradient(z)
g = sigmoid(z) .* (1 - sigmoid(z));
end
```
这个例子中使用了一个基本的两层神经网络进行手写数字识别,通过小批量梯度下降法进行训练,并计算准确率。
阅读全文