/tmp/ipykernel_1056/23656431.py in SGD(self, training_data, epochs, mini_batch_size, eta, test_data) 23 training_data[k:k+ mini_batch_size] 24 for k in range(0,n,mini_batch_size)] ---> 25 for mini.batch in mini_batches: 26 self.update_mini_batch(mini_batch, eta) 27 if test_data: NameError: name 'mini' is not defined
时间: 2024-02-28 18:53:37 浏览: 132
看起来你的代码中有一个笔误。在第25行,你写成了 `mini.batch` 而不是 `mini_batch`,所以 Python 不知道 `mini` 是什么。尝试将第25行改为以下代码:
```
for mini_batch in mini_batches:
```
这应该可以解决你的问题。
相关问题
随机梯度下降(sgd)原理
### 随机梯度下降(SGD)工作原理
#### 定义与概述
随机梯度下降(Stochastic Gradient Descent, SGD)是深度学习中广泛使用的优化方法之一。作为一种基于梯度的优化技术,SGD旨在通过迭代方式调整模型参数以最小化给定的目标函数或损失函数[^1]。
#### 工作机制
在每次迭代过程中,不是像传统批量梯度下降那样使用整个数据集来估计梯度并更新权重,而是仅选取单一样本或者少量样本构成的小批次(batch),以此为基础计算当前时刻下的近似梯度方向,并据此修正权值向量。这种方法不仅降低了每步运算所需资源消耗,而且引入了一定量噪声有助于跳出局部最优解陷阱[^3]。
具体来说:
- **初始化**: 设定初始的学习率以及参数初值。
- **循环遍历训练集**:
对于每一个epoch(即一次完整的数据扫描),执行如下操作直到满足停止条件为止:
- 打乱顺序读取输入特征矩阵X及其对应标签y;
- 将其划分为若干个小batch;
```python
import numpy as np
def create_batches(X, y, batch_size):
indices = np.random.permutation(len(X))
X_shuffled = X[indices]
y_shuffled = y[indices]
batches = []
for i in range(0, len(X), batch_size):
X_batch = X_shuffled[i:i + batch_size]
y_batch = y_shuffled[i:i + batch_size]
batches.append((X_batch, y_batch))
return batches
```
- 计算这些子集中目标函数关于各未知数的一阶导数值;
- 更新规则遵循下述公式\[ w := w - \eta * g(w; x_i,y_i)\], 其中\(w\)代表待估参数,\(\eta\)表示预先指定好的正实数——也就是常说的学习速率(gain factor or step size)[^4];
```python
learning_rate = 0.01
def update_parameters(params, gradients, lr=learning_rate):
updated_params = params.copy()
for key in params.keys():
updated_params[key] -= lr * gradients[key]
return updated_params
```
- **终止准则**
当达到预定的最大epochs数目、连续几次迭代间性能指标变化幅度小于阈值或者其他自定义标准时结束流程.
阅读全文