接PyTorch框架:(3)
1、最基本的方法
(1)使用模块
模块1:TensorDataset、模块2:DataLoader
自己去构造数据集,然后一个batch一个batch的取数据,自己去写构造数据太麻烦,可以自动让其把数据源给我们构建好,这两个模块就是来帮我们完成这个事的。
第一步把x_train和y_train传进去,使用TensorDataset自动的帮我们组件dataset即(train_ds);
DataLoader是得搭配一下,先把数据转化为TensorDataset所支持的格式,然后采用DataLoader读进来,DataLoader的意思就是你把数据交给我,然后你告诉我一个batch_size有多少,然后你要取数据的时候我就帮你一个batch一个batch的取数据,这样方便一些。shuffle=True表示要不要重新洗牌;
(2)定义一个get_data方法,需要传进来当前的数据集,后边做了一个return,就是按照一个Batch取数据就完事了;
(3)训练函数
自己定义一个训练方法,def fit方法,实际的去执行训练的操作。传进来的参数:
steps:一共迭代多少次。
model:就是定义的model,就是自己写个类,把model传进来。
loss_func:使用的f.中的损失。
opt:优化器是什么。
train_dl:实际数据传进来。
valid_dl:实际数据传进来。
Batch Normalization和Dropout在训练的时候一般都会加这两项,让模型过拟合的更低;在测试的时候一般就不加这两个东西了。所以为了有这两个区分,如果此时是训练,那么在训练的时候加上model.train();下边不是训练就是走一次前向传播,看一下对于当前模型来说他的一个效果,他的损失等于多少,把损失拿过来,我也不需要进行参数更新,不需要计算梯度,也不需要训练的过程,所以这一块我再额外的指定一下,这块不需要加Batch Normalization和Dropout,他不是一个训练的过程,所以在前边加上model.eval()。
所以见到这两个就是表示:model.train()强调的是你的训练过程,把该加的加进去;model.eval()强调的是测试过程,只需要得到结果,不需要把没用的都加进去。
loss_batch做的事情:如果你传进来一个优化器,优化器求梯度,求完梯度更新,更新完之后置0,然后返回结果。这里不光计算一个loss值还要去计算他实际的梯度值是多少,要进行参数的更新。
上述相当于把每个模块都准备好了,实际训练模型的时候不用把每个函数都也在一个sell当中,下面三行就搞定了:
第一步:拿到数据getdata。
第二步:拿到模型和优化器。(模型就是自己的类Mnist_NN)
第三步:执行fit函数。(fit函数的第三个参数表示损失函数是如何计算的,在损失函数计算当中还加入了梯度的更新,第四个使用什么样的优化器去更新我当前的结果)
2、复杂的方法
暂定