目录
前言
这个是按照B站up主的教程学习这方面知识的时候自己做的的笔记和总结,可能有点乱,主要是按照我自己的记录习惯
参考内容来自:
- up主的b站链接:https://space.bilibili.com/18161609/channel/series
- up主将代码和ppt都放在了github:https://github.com/WZMIAOMIAO
- up主的csdn博客:https://blog.csdn.net/qq_37541097/article/details/103482003
pytorch官方demo
1. 环境
2. LeNet介绍
3. 具体demo搭建
3.1 demo下载
- 下载来源:下载来源
3.2 demo的流程
- model.py——定义LeNet模型
- train.py——加载数据集并训练,训练集计算loss,测试集计算accuracy,保存训练好的网络参数
- predict.py——得到训练好的网络参数后,用自己找的图像进行分类测试(调用模型进行预测的一个脚本)
3.3 demo-model.py
import torch.nn as nn
import torch.nn.functional as F
'''
模型
1.定义一个类
· 1.初始化函数:搭建中需要使用的网络层结构
2.forward函数:定义正向传播的过程
'''
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
# 使用super函数:因为在定义类的过程中继承了nn.Module这个类
# super():解决在多层继承中调用父类方法中可能出现的一系列问题——继承父类的构造函数
self.conv1 = nn.Conv2d(3, 16, 5)
# 定义卷积层 3:输入特征的深度// 16:16个卷积核// 5:卷积核尺度5*5
self.pool1 = nn.MaxPool2d(2, 2)
# 池化层大小2*2 步距也为2的池化操作(池化层只改变特征矩阵的高和宽,不影响深度)
self.conv2 = nn.Conv2d(16, 32, 5)
# 第二个卷积层 输入深度为16,因为第一个输出深度为16
# 此处为32个卷积核,卷积核的尺度为5*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) # 此处的10需要根据训练集进行修改,这里使用的cifar-10是具有10个类别的分类任务,所以这里是10
def forward(self, x):
x = F.relu(self.conv1(x)) # input(3, 32, 32) output(16, 28, 28)
# 经过卷积后的矩阵尺寸大小计算公式:N = (W - F + 2P)/S + 1
# 输入图片大小W*W// Filter大小为F*F// 步长S// padding的像素数P
# W = 32// 故此处计算(32- 5 + 2*0)/1 + 1 = 28 因为上面设置了conv1为16的卷积核所以是(16, 28, 28)
x = self.pool1(x) # output(16, 14, 14) # 经过下采样,宽度和高度缩减一半
x = F.relu(self.conv2(x)) # output(32, 10, 10)
# 输入为14*14 (14 - 5 + 2*0)/1 + 1 = 10 输出10*10