码迷,mamicode.com
首页 > 其他好文 > 详细

PyTorch 神经网络学习(官方教程中文版)(一、利用Pytorch搭建神经网络)

时间:2021-03-31 12:17:16      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:一个   art   ima   Dimension   optimize   就是   init   png   lazy   

利用Pytorch搭建神经网络    

         在完成李宏毅2020机器学习图像分类(hw3)时,需要具备会使用pytorch的能力,通过pytorch的官方教程进行学习https://pytorch123.com/

训练神经网络的步骤如下:

技术图片

 

 

 1.定义神经网络(普通CNN为例)

     这里的size = x.size()[1:]有点理解不太清楚。理解如下:以32*32的数据输入,经conv1后得到6*32*32→maxpool1(6*16*16)→conv2(16*16*16)→maxpool2(16*8*8),size = x.size()[1:]取得是8*8,那么num_flat_features返回的便是64,经过 

x = x.view(-1, self.num_flat_features(x))后得到的x应为16*64,并没有展开成一维数据。

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        # 一个图片输入通道,6个输出通道,即共6个卷积核,卷积核为5*5,若是正方形,只写5即可
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 全连接神经网络需要训练的权重,共三层,400(卷积得到得到的)→120→84→10
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # Max pooling 为2*2,同样若是正方形,只写2即可
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        # -1是指根据self.num_flat_features(x)的值自动算出的
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

输出如下:

技术图片

 

 一个模型可训练的参数可以通过调用 net.parameters() 返回,

params = list(net.parameters())   # 一个模型可训练的参数可以通过调用 net.parameters() 返回:
print(len(params))
print(params[0].size())

共10个参数,依次输出每个参数的尺寸,第一个和第三个为所用卷积核的参数,第五、七、九为神经网络间的参数,其他一维的参数应该是bias,如下所示:

技术图片

 

 2.通过神经网络输入

让我们尝试随机生成一个 32x32 的输入。

input = torch.randn(1, 1, 32, 32)
output = net(input)
print(output)

得到的结果为:

技术图片

 

 3.计算损失

一个损失函数需要一对输入:模型输出和目标,然后计算一个值来评估输出距离目标有多远。有一些不同的损失函数在 nn 包中。一个简单的损失函数就是 nn.MSELoss ,这计算了均方误差。分类问题多用交叉熵nn.CrossEntropyLoss()

target = torch.randn(10)  # 给予标签随机值
target = target.view(1, -1)  # 保证标签与预测值同尺寸
criterion = nn.MSELoss()
loss = criterion(output, target)
print(loss)

结果:技术图片

 

 Autograd与计算图的原理见:https://blog.csdn.net/joseph__lagrange/article/details/109339878

4.反向传播

为了实现反向传播损失,我们所有需要做的事情仅仅是使用 loss.backward()。你需要清空现存的梯度,要不然将会和现存的梯度累计到一起。这也是loss的作用,现在我们调用 loss.backward() ,然后看一下 con1 的偏置项在反向传播之前和之后的变化。

net.zero_grad()
print(conv1.bias.grad before backward)
print(net.conv1.bias.grad)

loss.backward()

print(conv1.bias.grad after backward)
print(net.conv1.bias.grad)

结果如下:

技术图片

 

5.参数更新

 普通梯度更新:

learning_rate = 0.01
for f in net.parameters():
    f.data.sub_(f.grad.data * learning_rate

SGD:

import torch.optim as optim

optimizer = optim.SGD(net.parameters(), lr=0.01)

optimizer.zero_grad()   # 置零
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()

 

PyTorch 神经网络学习(官方教程中文版)(一、利用Pytorch搭建神经网络)

标签:一个   art   ima   Dimension   optimize   就是   init   png   lazy   

原文地址:https://www.cnblogs.com/lccxqk/p/14598000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!