构建数据加载器
传入模型训练的数据常用DataLoader类封装(torch.utils.data.DataLoader),它能一次生成n条数据,即一个batch,n即设置的batch_size的大小,输出数据类型时Tensor,一般包含数据和对应的标签。同时可以设置是否乱序生成数据。如果数据集大小不能被batch_size整除,默认最后一个batch会取剩余的数据,如果想让剩余的省去来使每个batch数据量相同,可通过设置参数drop_last=True来实现。
1 | data_loader = torch.utils.data.DataLoader(dataset=dataset,batch_size=batch_size, shuffle=True) |
如果只需要训练数据,上面传入的dataset可以直接用list或者np.ndarray,如果要同时获得训练数据和标签,则需要对dataset用下面的方式构建一下:
1 | class GetLoader(torch.utils.data.Dataset): |
参考链接:https://chenllliang.github.io/2020/02/04/dataloader/
搭建模型
- 构建模型类,继承nn.Module
__init__
方法里初始化父类init,然后定义模型需要的层,如线性、卷积- 重写父类的forward方法,此方法传入模型输入,返回模型的输出。里面是利用init里定义的层来搭建网络。
模型类里还可以定义一些其他需要的运算函数,在forward里面可以调用。哪些运算定义在init里,哪些运算定义在forward里没有明确规定,通常的约定是网络的层写在init里,forward里用这些层来搭建网络。
调用很简单:y = model(x),因为是继承的类,forward函数会在父类里面自动被调用,我们无需关心细节。返回的y是Tensor 类型。
print(model) 可以来查看模型的结构。
一个CNN例子:
1 | class Net(nn.Module): |
1 | net = Net() |
训练模型
首先定义要训练的epoch数、batch_size大小、学习率learning_rate。
检查否有可用的GPU,有的话就用GPU训练:
1 | if torch.cuda.is_available(): |
定义损失函数和优化器,这些在pytorch中都有实现,选择合适的来用就行,想要自己定义损失函数也可以。
训练的主要步骤如下:
1 | for i in range(epochs): |
保存模型
1 | torch.save(model.state_dict(), './model_.pth') |
加载、使用模型
1 | model = Net() |
要注意的是从csv中读取时设定数据类型为np.float32,应为np读取默认为float64,而模型中参数为float32,不同类型无法运算。
同时需要将数据转换为torch.Tensor()类型才能运算。