美文网首页
STEP-1:Pytorch-LR,Softmax,MLP

STEP-1:Pytorch-LR,Softmax,MLP

作者: 可恶小林子 | 来源:发表于2020-02-14 13:48 被阅读0次
感谢伯禹学习平台,本次学习将记录记录如何使用Pytorch高效实现网络,熟练掌握Pytorch的基础知识,记录不包含理论知识的细节展开。

一:线性回归-Pytorch实现

#导入相关的包
import torch
from torch import nn
#pytorch网络需要继承 nn.Module,定义结果,完成前向forward
class LinearNet(nn.Module):
    def __init__(self, n_feature):
        #继承父类
        super(LinearNet, self).__init__() 
        # 线性层,n_feature表示输入X的特征数目,1表示输出Y的维度只有1
        self.linear = nn.Linear(n_feature, 1)  
        #也可以如下定义,init后面加入o_feature实现输出维度自定义
        #self.linear = nn.Linear(n_feature, o_feature)
    def forward(self, x):
        y = self.linear(x)
        return y
# 调用网络只需要新建一个该网络的对象即可
net = LinearNet(n_feature)
# 损失函数和优化算子,源代码里有很多,可自行查看
loss = nn.loss = nn.MSELoss()
import torch.optim as optim
# SGD最常用,注意net.parameters()可以有很多种写法,分层学习率也可以在此设置,lr表示学习率
optimizer = optim.SGD(net.parameters(), lr=0.03) 
训练网络的基本步骤
num_epochs  =3
for epoch in range(1, num_epochs + 1):
    #data_iter参考pytorch定义的Dataloader
    for X, y in data_iter:
        output = net(X)
        l = loss(output, y.view(-1, 1))
        # 以下三步比较主要,zero_grad防止梯度累计,清空上个batch的梯度影响
        optimizer.zero_grad() 
        # 反向传播
        l.backward()
        optimizer.step()
    print('epoch %d, loss: %f' % (epoch, l.item()))

二:Softmax-Pytorch实现

Softmax只不过是定义了最后的输出加权求和为1,通常是将回归转到一个多分类问题,其本身也有很多限制。因此其相对于LR网络本身的区别在于最后一层的输出,而Pytorch则更加简便实现。
#原有的线性网络可以不做太多改变
class LinearNet(nn.Module):
    def __init__(self, n_feature,o_feature):
        super(LinearNet, self).__init__() 
        # Pytorch通常直到线性层,因为Softmax可以在损失函数里计算
        self.linear = nn.Linear(n_feature, o_feature)  
    def forward(self, x):
        # 如果输入x的维度为 [batch_size,28,28], 则需要对x重新reshape
        y = self.linear(x.view(x.shape[0], -1))
        return y
定义损失函数
# CrossEntropyLoss 真实标签不使用one-hot编码
loss = nn.CrossEntropyLoss()

三:MLP(多层感知机)-Pytorch实现

MLP的定义不同的的地方略有差异。我理解其本身实在LR的基础上多引入层数,在层后面可以连接不同的激活函数,以增强网络的拟合能力。虽然网络很简单有时候直接使用Sequential更快,但是Pytorch用多了就会发现类还是比较顺手(个人观点)。
class MLPNet(nn.Module):
    def __init__(self, num_inputs, num_outputs):
        super(LinearNet, self).__init__()
        self.linear1 = nn.Linear(num_inputs, 256)
        #relu可以重复调用,或者直接使用F.relu()
        self.relu = nn.ReLU()
        self.linear2 = nn.Linear(256, num_outputs)
    def forward(self, x):
        x = self.linear1(x.view(x.shape[0], -1))
        x = self.relu(x)
        x = self.linear2(x)
        x = self.relu(x)
        return x
net = LinearNet(num_inputs,num_outputs)
除了Relu还有很多别的激活函数,sigmoid,tanh等等。

相关文章

网友评论

      本文标题:STEP-1:Pytorch-LR,Softmax,MLP

      本文链接:https://www.haomeiwen.com/subject/tfudfhtx.html