一、minibatch的概念
在机器学习算法的训练过程中,大量的数据需要被处理和学习,而这些数据可能会非常大,如果一次性将全部数据送到计算系统中进行计算,不仅计算时间长,而且还会占用大量的存储空间。为解决这个问题,就引入了minibatch这个概念。
简言之,minibatch 就是一次训练中且分批次处理的训练数据集。每个批次包含了一定量的训练数据,同时一次训练中涉及的数据,就被分成若干个小批次进行处理和学习。
二、minibatch的优势
1、降低内存压力。
import numpy as np
from sklearn.datasets import load_boston
from sklearn.utils import resample
data = load_boston()
X, y = data.data, data.target
# 随机采样得到256个样本点
X_, y_ = resample(X, y, n_samples=256, replace=False)
# 读取全部的数据集开销大
# X, y = data.data, data.target
由于计算机内存的限制,如果使用梯度下降训练神经网络的时候,通常只能一次输入一个小批次数据,而不能一次性地输入所有数据。minibatch 可以通过分批次处理训练数据,解决内存不足的问题,同时提高了训练的效率。
2、有效提高计算速度。
当数据增大时,迭代次数越多,训练越耗时。minibatch的应用可以提高计算速度,提升训练效率。
三、minibatch的实现方式
1、手动生成minibatch。
import numpy as np
def gen_minibatch(inputs, targets, batch_size):
'''
inputs和targets为输入的数据和对应的数据标签
batch_size为每个batch的大小
'''
input_batches = inputs.reshape(-1, batch_size, inputs.shape[1])
target_batches = targets.reshape(-1, batch_size, targets.shape[1])
for i in range(len(input_batches)):
yield input_batches[i], target_batches[i]
# 输入数据和标记
X = np.random.rand(40, 4)
y = np.random.randint(0, 2, 40)
# 批大小
batch_size = 10
for minibatch in gen_minibatch(X, y, batch_size):
input_data, target_data = minibatch
# do something
手动生成minibatch是一种非常基础的方式。该方式是根据batch_size将训练数据集手动分割成小批次,然后将小批次输入到深度神经网络中进行训练。
2、使用深度学习框架进行数据处理和训练。
import torch
from torch.utils.data import DataLoader, TensorDataset
# 定义数据集并转化为 DataLoader
train_dataset = TensorDataset(torch.Tensor(X_train), torch.Tensor(y_train))
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
# 训练模型
for i, (X_batch, y_batch) in enumerate(train_dataloader):
# do something with X_batch and y_batch
Pytorch是一个常用的深度学习框架,可以帮我们自动生成数据批次,并且加速训练任务。在使用Pytorch进行模型训练时,我们可以使用DataLoader类结合TensorDataset自动生成minibatch。
四、minibatch的使用建议
1、合理设置批次大小。
我们通常需要根据计算机性能、模型复杂度、训练数据大小等因素来确定合适的batch_size参数。批次大小的不同,可能会影响模型性能,因此我们需要选择适当的 batch_size。
2、打乱数据集。
在进行训练之前,建议将训练数据集打乱,以减少训练误差,提高模型的性能。同时还可以避免所选取的训练集的先后顺序带来的影响。
shuffled_X, shuffled_y = shuffle(X_train, y_train)
train_dataset = TensorDataset(torch.Tensor(shuffled_X), torch.Tensor(shuffled_y))
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
小结
minibatch 是一种非常常用的深度学习训练技巧,它通过分批次进行数据处理和训练,不仅可以降低内存压力,还可以提高计算速度。我们需要注意批次大小、打乱数据集等一些细节信息,才能在深度学习模型的训练过程中更好地应用 minibatch 技术。