文章目录
官网教材 搭建一个最简单的神经网络
时间:2019年6月21日16:59:08
官网链接:
https://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html
1. 结构顺序通常是 卷积>激活>池化,或全连接>激活。BN好像在卷积或者激活之后都是可以的,影响不大。
2. 卷积、全连接有参数,需要现在__init__()中定义,再在forward() 中使用。
3. python 中函数可以先使用后定义。
4. self.fc1 = nn.Linear(16 * 6 * 6, 120) 第一个全连接输入中 6 是如何计算出来的。
- 6 * 6 from image dimension 将前面卷积产生的所有数据(16 * 6 * 6 中的16 是16个通道,6 * 6 是每个图片的尺寸(这个尺寸是图片多次卷积池化之后的尺寸,是需要通过一步一步的计算的)))。view 之后输入全连接层,所以全连接的输入大小应须和最后一个卷积之后的所有通道的点的数目之和相同。 120 是人为设定的,可以更改。
5. LeNet-5,的卷积层和全连接一共有5层,权重就应该有10层,因为每一层之后有偏置。
ReLU激活层 和 池化层 是没有参数的。
后续还要学习的BN不需要设置偏置。
1. 定义网路结构
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 input image channel, 6 output channels, 3x3 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 3) # 输入一张图片,产生6个通道(图片),是通过3 * 3的卷积得到的6个通道。6 和 3 都是人为设定的参数,可以改变。(参数3,指的是filter的大小是(3*3))
self.conv2 = nn.Conv2d(6, 16, 3) # 第二词卷积核输入大小须和第一次卷积大小的输出相同。16 和 3 是人为设定的,可更改。
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6 from image dimension 将前面卷积产生的所有数据(16 * 6 * 6 中的16 是16个通道,6 * 6 是每个图片的尺寸(这个尺寸是图片多次卷积池化之后的尺寸,是需要通过一步一步的计算的)))。view 之后输入全连接层,所以全连接的输入大小应须和最后一个卷积之后的所有通道的点的数目之和相同。 120 是人为设定的,可以更改。
self.fc2 = nn.Linear(120, 84) # 120 是由前一个全连接的输出决定的,84是人为设定的,可以更改。
self.fc3 = nn.Linear(84, 10) # 84 是由前一个全连接的输出决定的,10是人为设定的,可以更改。因为这个网络最终的目的是进行一个10分类的图像分类任务所以,最后作者定义全连接层的输出是10个点。
def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) # 卷积、激活、池化,一行写。
# If the size is a square you can only specify a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2) # 这里池化的 2 和(2, 2)等价, 4合1,改变图片的分辨率,缩小图片。
x = x.view(-1, self