本文主要是介绍Pytorch打怪路(一)pytorch进行CIFAR-10分类(2)定义卷积神经网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
注:官方文档地址-- http://pytorch.org/docs/0.3.0/index.html
我的系列博文
Pytorch打怪路(一)pytorch进行CIFAR-10分类(1)CIFAR-10数据加载和处理
Pytorch打怪路(一)pytorch进行CIFAR-10分类(2)定义卷积神经网络(本文)
Pytorch打怪路(一)pytorch进行CIFAR-10分类(3)定义损失函数和优化器
Pytorch打怪路(一)pytorch进行CIFAR-10分类(4)训练
Pytorch打怪路(一)pytorch进行CIFAR-10分类(5)测试
1、简述
所以我在这里也就简要地、根据此例所给的代码,来讲解一下即可,更多的内容还是参考官方文档更实在,虽然更费时……
2.代码
# 首先是调用Variable、 torch.nn、torch.nn.functional
from torch.autograd import Variable # 这一步还没有显式用到variable,但是现在写在这里也没问题,后面会用到
import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module): # 我们定义网络时一般是继承的torch.nn.Module创建新的子类def __init__(self): super(Net, self).__init__() # 第二、三行都是python类继承的基本操作,此写法应该是python2.7的继承格式,但python3里写这个好像也可以self.conv1 = nn.Conv2d(3, 6, 5) # 添加第一个卷积层,调用了nn里面的Conv2d()self.pool = nn.MaxPool2d(2, 2) # 最大池化层self.conv2 = nn.Conv2d(6, 16, 5) # 同样是卷积层self.fc1 = nn.Linear(16 * 5 * 5, 120) # 接着三个全连接层self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x): # 这里定义前向传播的方法,为什么没有定义反向传播的方法呢?这其实就涉及到torch.autograd模块了,# 但说实话这部分网络定义的部分还没有用到autograd的知识,所以后面遇到了再讲x = self.pool(F.relu(self.conv1(x))) # F是torch.nn.functional的别名,这里调用了relu函数 F.relu()x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5) # .view( )是一个tensor的方法,使得tensor改变size但是元素的总数是不变的。# 第一个参数-1是说这个参数由另一个参数确定, 比如矩阵在元素总数一定的情况下,确定列数就能确定行数。# 那么为什么这里只关心列数不关心行数呢,因为马上就要进入全连接层了,而全连接层说白了就是矩阵乘法,# 你会发现第一个全连接层的首参数是16*5*5,所以要保证能够相乘,在矩阵乘法之前就要把x调到正确的size# 更多的Tensor方法参考Tensor: http://pytorch.org/docs/0.3.0/tensors.htmlx = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x# 和python中一样,类定义完之后实例化就很简单了,我们这里就实例化了一个net
net = Net()
3.涉及知识点
①神经网络工具箱 torch.nn
a. Container中的Module,也即nn.Module
b. convolution layers
c. pooling layers
d. Linear layer
e. Non-linear Activations
②torch.nn.functional
这篇关于Pytorch打怪路(一)pytorch进行CIFAR-10分类(2)定义卷积神经网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!