pytorch入门2.x构建回归模型系列:
pytorch入门2.0构建回归模型初体验(数据生成)
pytorch入门2.1构建回归模型初体验(模型构建)
pytorch入门2.2构建回归模型初体验(开始训练)html
通过上面两个部分,咱们完成了数据生成、网络结构定义,下面咱们终于能够小试牛刀,训练模型了!
首先,咱们先定义一些训练时要用到的参数:python
EPOCH = 1000 # 就是要把数据用几遍 LR = 0.1 # 优化器的学习率,相似登山的时候应该迈多大的步子。 # BATCH_SIZE=50
其次,按照定义的模型类实例化一个网络:git
if torch.cuda.is_available(): # 检查机器是否支持GPU计算,若是支持GPU计算,那么就用GPU啦,快! model = LinearRegression().cuda() # 这里的这个.cuda操做就是把模型放到GPU上 else: model = LinearRegression() # 若是不支持,那么用cpu也能够哦 # 定义损失函数,要有个函数让模型的输出知道他作的对、仍是错,对到什么程度或者错到什么程度,这就是损失函数。 loss_fun = nn.MSELoss() # loss function # 定义优化器,就是告诉模型,改如何优化内部的参数、还有该迈多大的步子(学习率LR)。 optimizer = torch.optim.SGD(model.parameters(), lr=LR) # opimizer
下面终于能够开始训练了,可是训练以前解释一下EPOCH,好比咱们有300个样本,训练的时候咱们不会把300个样本放到模型里面训练一遍,就中止了。即在模型中咱们每一个样本不会只用一次,而是会使用屡次。这300个样本到底要用多少次呢,就是EPOCH的值的意义。github
for epoch in range(EPOCH): # 此处相似前面实例化模型是,咱们把模型放到GPU上来跑道理是同样的。此处,咱们要把变量放到GPU上,跑的快!若是不行, 那就放到CPU上吧。 # 其中x是输入数据,y是训练集的groundtruth。为何要有y呢?由于咱们要知道咱们算的对不对,到底有多对(这里由损失函数控制) if torch.cuda.is_available(): x = Variable(x_train).cuda() y = Variable(y_train).cuda() else: x = Variable(x_train) y = Variable(y_train) # 咱们把x丢进模型,获得输出y。哇,是否是好简单,这样咱们就获得结果了呢?可是不要高兴的太早,咱们只是把输入数据放到一个啥都不懂(参数没有训练)的模型中,获得的结果确定不许啊。不许的结果怎么办,看下一步。 out = model(x) # 拿到模型输出的结果,咱们就要看看模型算的准不许,就是计算损失函数了。 loss = loss_fun(out,y) # 好了好了,我已经知道模型算的准不许了,那么就该让模型本身去朝着好的方向优化了。模型,你已是个大孩子了,应该会本身优化的。 optimizer.zero_grad() # 在优化以前,咱们首先要清空优化器的梯度。由于每次循环都要靠这个优化器呢,不能翻旧帐,就只算此次咱们怎么优化。 loss.backward() # 优化开始,首先,咱们要把算出来的偏差、损失倒着传回去。(是大家这些模块给我算的这个值,如今这个值有错误,错了这么多,返回给大家,大家本身看看本身错哪了) optimizer.step() # 按照优化器的方式,一步一步优化吧。 if (epoch+1)%100==0: # 中间每循环100次,偷偷看看结果咋样。 print('Epoch[{}/{}],loss:{:.6f}'.format(epoch+1,EPOCH,loss.data.item()))
上面咱们训练了1000(EPOCH=1000)次,应该差很少了。是时候看看训练的咋样啦!其实咱们已经知道训练的咋样了,就是上面输出的损失值,只不过是在训练集上的。
下面咱们就要看看在测试集上表现咋样呢?网络
model.eval() # 开启模型的测试模式 # 拿到测试集中x的值,放到GPU上 if torch.cuda.is_available(): x = x_test.cuda() #经过把x的值输入模型,获得预测结果 predict = model(x) # 那预测结果的值取出来,由于预测结果是封装好的,如今h只要它的值。 predict = predict.cpu().data.numpy() #画个图看看,到底拟合成啥样了? plt.plot(x.cpu().numpy(),y_test.cpu().numpy(),'ro',label='original data') plt.plot(sorted(x.cpu().numpy()),sorted(predict),label='fitting line') plt.show()
看看图,结果还凑合吧,要想结果更好须要进一步对模型的结构、超参数进行设置,咱们以后在学。
到此为止,咱们用pytorch就已经创建完,而且训练完一个线性回归模型了,咱们能够回顾下,多看几遍,仔细回想一下这里面到底发生了什么。
完整的代码地址以下:github函数