深度学习训练网络的时候数据往往是十分庞大的.有一组数据,一次性的将数据输入给计算机几乎是不可能的(小样本可采用full batch learning),常常需要把数据分成小块,一块一块的传递给计算机,在每一块执行前向反向,末尾更新一次神经网络的权重,拟合给定的数据.
Epoch:
当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个 epoch。
epoch size:
一般在pytorch里为train_loader的大小,即数据集分batch之后的number of batches
Batch
batch是批。在不能将数据一次性通过神经网络的时候,就需要将数据集分成几个 batch,每个batch作为一组进行一次训练(迭代)。
batch size:
一个 batch 中的样本总数(一次迭代使用的样本数目)。记住:batch size 和 number of batches 是不同的。
iteration
迭代是按照batch最终完成一个 epoch 需要的次数(或者说需要的batch个数),一个batch训练一次称为一次迭代,每次迭代更新1次网络结构的参数。记住:在一个 epoch 中,batch 数和迭代数是相等的。
在一个epoch下,number of batches==iteration==epoch_sizenumber\ of\ batches==iteration==epoch\_sizenumber of batches==iteration==epoch_sizeiteration×batch size=len(data)iteration×batch\ size=len(data
)iteration×batch size=len(data)
代码上:
def SGD(self, training_data, epochs, mini_batch_size, eta,):
n = len(training_data) # 数据集总大小
# 进行epochs次主循环来计算weights和biases
for j in xrange(epochs):
# 每个主循环走一遍所有训练数据,并shuffle一下提供好的随机性
random.shuffle(training_data)
# 对于每个计算随机梯度的具体事件,设置一个mini_batch,用这mini_batch_size个样本来计算随机梯度
mini_batches = [
training_data[k:k+mini_batch_size]
for k in xrange(0, n, mini_batch_size)]#[0,n)步长为batch_size,k的个数即为一个epoch内iteration数
# 计算随机梯度,更新weights和biases,eta是学习率
for mini_batch in mini_batches:
self.update_mini_batch(mini_batch, eta)