实现一个图像分类器
pytorch官方demo
TRAINING A CLASSIFIER
PytorchDemo—LeNet 介绍
Convolutions – 卷积 Subsampling – 下采样 Full connection – 全连接
LeNet 结构就是 一个卷积 一个下采样 一个卷积 一个下采样 接三个全连接层
图中显示的INPUT是一个灰度图像,只有一个维度
pytorch中的Tensor通道排列顺序是:[batch, channel, height, width]
demo的流程
- model.py ——定义LeNet网络模型
- train.py ——加载数据集并训练,训练集计算loss,测试集计算accuracy,保存训练好的网络参数
- predict.py——得到训练好的网络参数后,用自己找的图像进行分类测试
1. model.py
# 使用torch.nn包来构建神经网络.
import torch.nn as nn
import torch.nn.functional as F
class LeNet(nn.Module): # 定义一个类LeNet,继承于nn.Module这个父类
def __init__(self): # 初始化网络结构
super(LeNet, self).__init__() # 多继承需用到super函数
self.conv1 = nn.Conv2d(3, 16, 5) # 定义第一个卷积层
self.pool1 = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(16, 32, 5)
self.pool2 = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(32*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x): # 正向传播过程
x = F.relu(self.conv1(x)) # input(3, 32, 32) output(16, 28, 28) N=(32-5+0)/1+1 = 28
x = self.pool1(x) # output(16, 14, 14) N=(28-2+0)/2+1 = 14
x = F.relu(self.conv2(x)) # output(32, 10, 10) N=(14-5+0)/1+1 = 10
x = self.pool2(x) # output(32, 5, 5) N=(10-2+0)/2+1 = 5
x = x.view(-1, 32*5*5) # output(32*5*5)
x = F.relu(self.fc1(x)) # output(120)
x = F.relu(self.fc2(x)) # output(84)
x = self.fc3(x) # output(10)
return x
1.1 卷积 Conv2d
常用的卷积(Conv2d)在pytorch中对应的函数是:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
in_channels参数代表输入特征矩阵的深度即channel,比如输入一张RGB彩色图像,那in_channels=3
out_channels参数代表卷积核的个数,使用n个卷积核输出的特征矩阵深度即channel就是n
kernel_size参数代表卷积核的尺寸,输入可以是int类型如3 代表卷积核的height=width=3,也可以是tuple类型如(3, 5)代表卷积核的height=3,width=5
stride参数代表卷积核的步距默认为1,和kernel_size一样输入可以是int类型,也可以是tuple类型
padding参数代表在输入特征矩阵四周补零的情况默认为0,同样输入可以为int型如1 代表上下方向各补一行0元素,左右方向各补一列0像素(即补一圈0),如果输入为tuple型如(2, 1) 代表在上方补两行下方补两行,左边补一列,右边补一列。padding[0]是在H高度方向两侧填充的,padding[1]是在W宽度方向两侧填充的
bias参数表示是否使用偏置(默认使用)
dilation、groups是高阶用法这里不做讲解,如有需要可以参看官方文档
1.2 池化 MaxPool2d
最大池化(MaxPool2d)在 pytorch 中对应的函数是: