pytorch:批量数据分割(batch)
·
深度学习训练时,用相关的数据进行训练会让训练的数据局限于满足一小撮数据,缺少实用性,因此数据间相互独立才能训练出较好的模型。而更多的现实情况是数据之间或多或少存在着相关性,所以深度学习常常选择海量数据来弥补数据间相关产生的训练模型相关。在大批量数据学习中,使用小批量梯度学习是一种比较好的方式,每次选取一小部分数据进行梯参数更新,既能沿着较好的方向更新,又能兼顾训练的效率。另外,还有一种方法可以减弱数据相关性的影响,就是从数据集中随机抽取数据。
pytorch中引入了对数据进行切分分组的机制,下面通过代码说明pytorch如何将数据分成多个batch。
import torch
import torch.utils.data as Data
torch.manual_seed(1) # reproducible
BATCH_SIZE = 8 # 每个batch的大小,取5或者8
# 生成测试数据
x = torch.linspace(0, 9, 10) # x(torch tensor)
y = torch.linspace(9, 0, 10) # y(torch tensor)
# 将输入和输出封装进Data.TensorDataset()类对象
torch_dataset = Data.TensorDataset(x, y)
# 把 dataset 放入 DataLoader
loader = Data.DataLoader(
dataset=torch_dataset, # 数据,封装进Data.TensorDataset()类的数据
batch_size=BATCH_SIZE, # 每块的大小
shuffle=True, # 要不要打乱数据 (打乱比较好)
num_workers=2, # 多进程(multiprocess)来读数据
)
if __name__ == '__main__': # 注意:如果loader中设置了num_workers!=0,即采用多进程来处理数据,运行含loader的操作必须在‘__main__’的范围内
# 进行3轮训练(每次拿全部的数据进行训练)
for epoch in range(3):
# 在一轮中迭代获取每个batch(把全部的数据分成小块一块块的训练)
for step, (batch_x, batch_y) in enumerate(loader):
# 假设这里就是你训练的地方...
# print出来一些数据
print('Epoch: ', epoch, '| Step: ', step, '| batch x: ',
batch_x, '| batch y: ', batch_y)
'''
BATCH_SIZE = 5 时的结果
Epoch: 0 | Step: 0 | batch x: tensor([4., 6., 9., 2., 3.]) | batch y: tensor([5., 3., 0., 7., 6.])
Epoch: 0 | Step: 1 | batch x: tensor([1., 0., 7., 8., 5.]) | batch y: tensor([8., 9., 2., 1., 4.])
Epoch: 1 | Step: 0 | batch x: tensor([3., 5., 6., 9., 7.]) | batch y: tensor([6., 4., 3., 0., 2.])
Epoch: 1 | Step: 1 | batch x: tensor([4., 2., 1., 0., 8.]) | batch y: tensor([5., 7., 8., 9., 1.])
Epoch: 2 | Step: 0 | batch x: tensor([3., 1., 4., 5., 9.]) | batch y: tensor([6., 8., 5., 4., 0.])
Epoch: 2 | Step: 1 | batch x: tensor([2., 8., 0., 7., 6.]) | batch y: tensor([7., 1., 9., 2., 3.])
'''
# 当无法均等分成若干块时,先按每块BATCH_SIZE大小提取,最后剩下的不足BATCH_SIZE留作最后一块
'''
BATCH_SIZE = 8 时的结果
Epoch: 0 | Step: 0 | batch x: tensor([4., 6., 9., 2., 3., 1., 0., 7.]) | batch y: tensor([5., 3., 0., 7., 6., 8., 9., 2.])
Epoch: 0 | Step: 1 | batch x: tensor([8., 5.]) | batch y: tensor([1., 4.])
Epoch: 1 | Step: 0 | batch x: tensor([3., 5., 6., 9., 7., 4., 2., 1.]) | batch y: tensor([6., 4., 3., 0., 2., 5., 7., 8.])
Epoch: 1 | Step: 1 | batch x: tensor([0., 8.]) | batch y: tensor([9., 1.])
Epoch: 2 | Step: 0 | batch x: tensor([3., 1., 4., 5., 9., 2., 8., 0.]) | batch y: tensor([6., 8., 5., 4., 0., 7., 1., 9.])
Epoch: 2 | Step: 1 | batch x: tensor([7., 6.]) | batch y: tensor([2., 3.])
'''
DataLoader是torch中用来包装数据的工具,所以要将数据(numpy array或者其他)数据形式转换成Tensor,然后再放进包装器中。使用DataLoader可以有效地迭代数据。
更多推荐



所有评论(0)