小白学习之pytorch框架,3-模型训练三要素+torch.nn.Linear

 模型训练的三要素:数据处理、损失函数、优化算法 

数据处理(模块torch.utils.data)

从线性回归的的简洁实现-初始化模型参数(模块torch.nn.init)开始

from torch.nn import init   # pytorch的init模块提供了多中参数初始化方法init.normal_(net[0].weight, mean=0, std=0.01)    #初始化net[0].weight的期望为0,标准差为0.01的正态分布tensor
init.constant_(net[0].bias, val=0)  #初始化net[0].bias,值为0的常数tensor
# 此外还封装了好多
# init.ones_(w) 初始化一个形状如w的全1分布的tensor,如w是3行5列,则初始化为3行5列的全1tensor
# init.zeros_(w) 初始化一个形状如w的全0分布的tensor
# init.eye_(w) 初始化一个形状如w的对角线为1,其余为0的tensor
# init.sparse_(w,sparsity=0.1) 初始化一个形状如w稀疏性为0.1的稀疏矩阵

 损失函数(模块torch.nn含有大量的神经网络层)

 pytorch的nn模块中定义了各种损失函数,这些损失函数可以看成一种特殊的网络层 

loss = nn.MSELoss()  # 均方误差损失函数
# torch.nn.MSELoss(reduce=True, size_average=True)
# reduce=True,返回标量形式的loss,reduce=False,返回向量形式的loss
# size_average=True,返回loss.mean(),size_average=False,返回loss.sum()
# 默认两者皆为True

 优化算法(模块torch.optim)

torch.optim模块定义了很多的优化算法,如SGD、Adam、RMSProp等

import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.03)
print(optimizer)
# 对不同的子网络设置不同的学习率
optimizer = optim.SGD([
# 如果对某个参数不指定学习率,就使用最外层的默认学习率
{'params':net.subnet1.parameters()}, # lr=0.03
{'params':net.subnet2.parameters(),'lr':0.01}
],lr=0.03)

  设置动态学习率,不是固定一个常数

  方法1、修改optimizer.param_groups中的学习率

#调整学习率
for param_group in optimizer.param_groups:
    param_group['lr'] *= 0.1   # 学习率是之前的0.1倍

  方法2、新建优化器,即构建新的optimizer。使用动量的优化器(如Adam),可能会丢失动量等状态信息,可能会造成损失函数的收敛出现震荡等情况。

optimizer = optim.SGD([
                {'param':net.subnet1.parameters()},
                {'param':net.subnet2.parameters(),'lr':old_lr*0.1}],lr=0.03)

  上述代码若不理解net.subnet1.parameters(),可参考博客 https://www.cnblogs.com/hellcat/p/8496727.html 万分感谢博主

view(-1,1) # -1是不确定几行的意思,在这就是我不确定要取几行,但是肯定是一列,故view(-1,1);

  torch.view()和numpy.reshape()效果一样,view操作的是tensor,且view后的tensor和原tensor共享内存,修改其中一个,另一个也会改变,reshape()操作的是nparray。

  线性回归  

  torch.nn.Linear(in_features,out_features,bias)

  参数解析:

    in_features:输入特征的数量(或称为特征数特征向量X的维度),即在房价预测中仅和房龄与面积有关,则in_features=2

    out_features:输出特征的数量(同in_features)

    bias:偏置,默认为True

  例子请参考 https://www.cnblogs.com/Archer-Fang/p/10645473.html 感谢博主