基本内容:
批训练就是把你的数据分批训练,像之前回归的时候100个点可以分成两批训练,可以是50,50,也可以是80,20。分批有啥好处呢?我想到的就是可以用多线程并行计算。
莫烦这篇博客就是说在torch.utils.data这个库里面(暂且称这个库为Data)有一个函数,也就是Data.DataLoader(),这个函数可以帮你实现批训练。它包括下面几个参数:dataset数据集,batch_size每批数量,shuffle是否打乱(一般是True),num_workers线程数。其中,dataset要先用Data.TensorDataset(<data>,<target>)变成dataset对象。然后用俩循环(一个epoch一个dataloader),就能实现分epoch再分批训练
报错:
- Data.TensorDataset()参数问题,报错TypeError: __init__() got an unexpected keyword argument 'data_tensor'
把教程里的argument也就是data_tensor和target_tensor去了就好了
- 下面试一试单纯输出类似莫烦那样的每一个epoch,batch以及batch内容,报错出了一大堆错误,从中揪出一行比较显眼的:
好像是因为有关线程的得写。。if __name__ == '__main__':这个东西。。?讲真的不太懂..先记住了。加上那个开头就ok了,下面是代码:
代码:
import torch
import torch.utils.data as Data
if __name__ == '__main__':
x = torch.linspace(1, 10, 10)
y = torch.linspace(10, 1, 10)
Batch_Size = 5
torch_dataset = Data.TensorDataset(x, y)
loader = Data.DataLoader(
dataset=torch_dataset,
batch_size=Batch_Size,
shuffle=True,
num_workers=2
)
a=1
for epoch in range(3):
for (step, (data, target)) in enumerate(loader):
print(
'epoch:', epoch, 'step:', step,
'\n\tbatch_x:', data.numpy(), 'batch_y:', target.numpy()
)
输出也就是:
1 epoch: 0 step: 0
batch_x: [8. 4. 2. 3. 5.] batch_y: [3. 7. 9. 8. 6.]
1 epoch: 0 step: 1
batch_x: [ 7. 1. 9. 6. 10.] batch_y: [ 4. 10. 2. 5. 1.]
1 epoch: 1 step: 0
batch_x: [ 2. 1. 10. 6. 4.] batch_y: [ 9. 10. 1. 5. 7.]
1 epoch: 1 step: 1
batch_x: [5. 8. 7. 9. 3.] batch_y: [6. 3. 4. 2. 8.]
1 epoch: 2 step: 0
batch_x: [4. 9. 5. 6. 1.] batch_y: [ 7. 2. 6. 5. 10.]
1 epoch: 2 step: 1
batch_x: [ 7. 10. 2. 3. 8.] batch_y: [4. 1. 9. 8. 3.]