一、minibatch的概念
在機器學習算法的訓練過程中,大量的數(shù)據(jù)需要被處理和學習,而這些數(shù)據(jù)可能會非常大,如果一次性將全部數(shù)據(jù)送到計算系統(tǒng)中進行計算,不僅計算時間長,而且還會占用大量的存儲空間。為解決這個問題,就引入了minibatch這個概念。
簡言之,minibatch 就是一次訓練中且分批次處理的訓練數(shù)據(jù)集。每個批次包含了一定量的訓練數(shù)據(jù),同時一次訓練中涉及的數(shù)據(jù),就被分成若干個小批次進行處理和學習。
二、minibatch的優(yōu)勢
1、降低內(nèi)存壓力。
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)
# 讀取全部的數(shù)據(jù)集開銷大
# X, y = data.data, data.target
由于計算機內(nèi)存的限制,如果使用梯度下降訓練神經(jīng)網(wǎng)絡(luò)的時候,通常只能一次輸入一個小批次數(shù)據(jù),而不能一次性地輸入所有數(shù)據(jù)。minibatch 可以通過分批次處理訓練數(shù)據(jù),解決內(nèi)存不足的問題,同時提高了訓練的效率。
2、有效提高計算速度。
當數(shù)據(jù)增大時,迭代次數(shù)越多,訓練越耗時。minibatch的應(yīng)用可以提高計算速度,提升訓練效率。
三、minibatch的實現(xiàn)方式
1、手動生成minibatch。
import numpy as np
def gen_minibatch(inputs, targets, batch_size):
'''
inputs和targets為輸入的數(shù)據(jù)和對應(yīng)的數(shù)據(jù)標簽
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]
# 輸入數(shù)據(jù)和標記
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是一種非常基礎(chǔ)的方式。該方式是根據(jù)batch_size將訓練數(shù)據(jù)集手動分割成小批次,然后將小批次輸入到深度神經(jīng)網(wǎng)絡(luò)中進行訓練。
2、使用深度學習框架進行數(shù)據(jù)處理和訓練。
import torch
from torch.utils.data import DataLoader, TensorDataset
# 定義數(shù)據(jù)集并轉(zhuǎn)化為 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是一個常用的深度學習框架,可以幫我們自動生成數(shù)據(jù)批次,并且加速訓練任務(wù)。在使用Pytorch進行模型訓練時,我們可以使用DataLoader類結(jié)合TensorDataset自動生成minibatch。
四、minibatch的使用建議
1、合理設(shè)置批次大小。
我們通常需要根據(jù)計算機性能、模型復(fù)雜度、訓練數(shù)據(jù)大小等因素來確定合適的batch_size參數(shù)。批次大小的不同,可能會影響模型性能,因此我們需要選擇適當?shù)?batch_size。
2、打亂數(shù)據(jù)集。
在進行訓練之前,建議將訓練數(shù)據(jù)集打亂,以減少訓練誤差,提高模型的性能。同時還可以避免所選取的訓練集的先后順序帶來的影響。
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)
小結(jié)
minibatch 是一種非常常用的深度學習訓練技巧,它通過分批次進行數(shù)據(jù)處理和訓練,不僅可以降低內(nèi)存壓力,還可以提高計算速度。我們需要注意批次大小、打亂數(shù)據(jù)集等一些細節(jié)信息,才能在深度學習模型的訓練過程中更好地應(yīng)用 minibatch 技術(shù)。