我们在训练神经网络模型时,最常用的就是梯度下降,接下俩主要介绍下mini-batch gradient descent。关于Batch gradient descent(批梯度下降,BGD)就不细说了(一次迭代训练所有样本),因为这个大家都很熟悉,通常接触梯队下降后用的都是这个。这里主要介绍Mini-batch gradient descent和stochastic gradient descent(SGD)以及对比下Batch gradient descent、mini-batch gradient descent和stochastic gradient descent的效果。
- Batch gradient descent
Batch gradient descent 就是一次迭代训练所有样本,就这样不停的迭代。
- stochastic gradient descent
为了加快收敛速度,并且解决大数据量无法一次性塞入内存(显存)的问题,stochastic gradient descent(SGD)就被提出来了,SGD的思想是每次只训练一个样本去更新参数。
- Mini-batch gradient descent
mini-batch gradient descent 是batch gradient descent和stochastic gradient descent的折中方案,就是mini-batch gradient descent每次用一部分样本来更新参数。因此,若则变成了SGD,若则变成了batch gradient descent。
通常设置为2的幂次方,通常设置(很少设置大于512)。因为设置成2的幂次方,更有利于GPU加速。 现在深度学习中,基本上都是用 mini-batch gradient descent,(在深度学习中,很多直接把mini-batch gradient descent(a.k.a stochastic mini-batch gradient descent)简称为SGD,所以当你看到深度学习中的SGD,一般指的就是mini-batch gradient descent)。
接下来,进入代码部分。
def create_mini_batches(X, Y, mini_batch_size=64, seed=0):
"""
X--输入数据, shape = (m, H, W, C)
Y--真实值, shape = (m, n_y)
返回:
mini_batches--同步列表(mini_batch_X, mini_batch_Y)
"""
m = X.shape[0]
mini_batches = []
np.random.seed(seed)
#Step1: Shuffle (X, Y)
permutation = list(np.random.permutation(m))
shuffled_X = X[permutation, :, :, :]
shuffled_Y = Y[permutation, :]
#Step2: Partition
num_complete_minibatches = math.floor(m/mini_batch_size)
for k in range(0, num_complete_minibatches):
mini_batch_X = shuffled_X[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:,:,:]
mini_batch_Y = shuffled_Y[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:]
mini_batch = (mini_batch_X, mini_batch_Y)
mini_batches.append(mini_batch)
if m%mini_batch_size != 0:
mini_batch_X = shuffled_X[num_complete_minibatches * mini_batch_size : m,:,:,:]
mini_batch_Y = shuffled_Y[num_complete_minibatches * mini_batch_size : m,:]
mini_batch = (mini_batch_X, mini_batch_Y)
mini_batches.append(mini_batch)
return mini_batches
网友评论