机器学习中如何将数据集拆分为mini_batch?numpy代码实现

什么是mini_batch?

对机器学习来讲,梯度下降是一个很重要的概念。每次更新参数时,都需要一定数量的样本,假设m是样本的总数,那么mini_batch就是样本的一个子集,也就是说,把m个样本拆分成很多子集,每一个子集里面都有一些样本数。

为什么需要mini_batch?

传统的机器学习,完成一次梯度更新,迭代参数,需要所有的样本去计算损失函数,随着数据集越来越大,这样会使得模型训练的速度越来越慢。

mini_batch numpy代码实现

from keras.datasets import cifar10 #导入caifar10数据
data = cifar10.load_data() #读取数据
X_train = data[0][0] #取到训练集
y_train = data[0][1] #取训练集标签

#定义函数实现mini_batch
def mini_batches(X,Y,mini_batch_size=64,seed=0):
    np.random.seed(seed)
    m = X.shape[0] #m是样本数
    
    mini_batches = [] #用来存放一个一个的mini_batch
    permutation = list(np.random.permutation(m)) #打乱标签
    shuffle_X = X[permutation,:,:,:] #将打乱后的数据重新排列
    shuffle_Y = Y[permutation,:]
    
    
    num_complete_minibatches = int(m //mini_batch_size) #样本总数除以每个batch的样本数量
    for i in range(num_complete_minibatches):
        mini_batch_X = shuffle_X[i*mini_batch_size:(i+1)*mini_batch_size,:,:,:]
        mini_batch_Y = shuffle_Y[i*mini_batch_size:(i+1)*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 = shuffle_X[num_complete_minibatches*mini_batch_size:,:,:,:]
        mini_batch_Y = shuffle_Y[num_complete_minibatches*mini_batch_size,:]
        mini_batch = (mini_batch_X,mini_batch_Y)
        mini_batches.append(mini_batch)
    return mini_batches
mini_batches=mini_batches(X_train,y_train,mini_batch_size=64,seed=0)

mini_batches[780][0].shape
(64, 32, 32, 3)

你可能感兴趣的:(深度学习,机器学习,拆分训练集,人工智能,训练数据的拆分,numpy代码实现)