图像分类
- 图片的输入一般是224224,
一开始对于数据集的读取,是把一张图片拉成224224*3长度的向量,但这样即使一层全连接,如果有1000个分类,就会导致参数爆炸。
用卷积核来代替神经元,卷积核的大小就是神经元的感受野。我们通过卷积核,提取特定的局部特征。
每个卷积核的深度一定等于这一层输入的深度。
2.卷积核数量一多,发现参数量还是很大
方法一:扩大步长
卷出来的特征图大小为 O= (I-K+2P)/S+1 I为输入,K为卷积核大小,P为padding,S为步长
缺点:丢失信息
方法二:池化
最大池化,平均池化
一般选择最大池化,因为更加简单,不用计算 - 实际中卷积和池化结合起来。
![0c51d712f09802bc3c92e4ab24b3c443]()
卷积以及池化后的特征图拉直展开,开始全连接

4.分类的loss
对于linear的输出再使用softmax求出模型预测的概率分布。
对于loss使用交叉熵损失来

再写代码的时候可以直接将样本的output和label输入进交叉熵函数,函数会自动对output进行softmax以及把label转化为对应的tensor
5.分类神经网络

6.Conv2d的五个参数分别是:输入特征图数量,输出特征图数量,卷积核大小,步长,padding
MaxPool的两个参数分别是池化窗口大小和步幅
AdaptiveAvgPool2d的参数为输出特征图的大小
view() 是 PyTorch 张量的一个重要方法,用于改变张量的形状(reshape),而不改变其底层数据。
例如:tensor.view(2, 3) 或 tensor.view((2, 3)) 都试图将张量重塑为一个 2 行 3 列的矩阵。
view() 方法要求新形状的总元素数量必须与原张量的总元素数量完全相同。这是 view 能够成功执行的前提。当你在一个维度上指定 -1 时,PyTorch 会自动推断出该维度应该具有的大小,以满足总元素数不变的约束。
import torch
x = torch.randn(2, 3) # 形状为 (2, 3),共 6 个元素
print("Original shape:", x.shape) # Output: torch.Size([2, 3])
# 1. 明确指定新形状
y = x.view(3, 2) # 重塑为 (3, 2),3 * 2 = 6,符合条件
print("Reshaped to (3, 2):", y.shape) # Output: torch.Size([3, 2])
# 2. 使用 -1 自动推断
z1 = x.view(-1, 1) # 第一维未知,第二维为 1。PyTorch 推断第一维为 6。 (6 * 1 = 6)
print("Reshaped to (-1, 1):", z1.shape) # Output: torch.Size([6, 1])
z2 = x.view(1, -1) # 第一维为 1,第二维未知。PyTorch 推断第二维为 6。 (1 * 6 = 6)
print("Reshaped to (1, -1):", z2.shape) # Output: torch.Size([1, 6])
z3 = x.view(-1) # 所有维度都未知(只有一个 -1)。PyTorch 将其展平为一维。 (6,)
print("Flattened with (-1):", z3.shape) # Output: torch.Size([6])
- 学完这节课一定要学会计算参数
比如self.conv1 = nn.Conv2d(3, 64, 11, 4, 2)是3111164+64(64个卷积核每个卷积核有一个偏置项,这个别漏掉)
比如self.fc1 = nn.Linear(9216, 4096)是92164096+4096
8.alexnet会使用大的卷积核 比如说是self.conv2 = nn.Conv2d(64, 192, 5, 1, 2)的每一个卷积核参数量是25深度+1
而VGG会选择用两个33的卷积核代替55的,因为前者参数量为2(33深度+1)=18*深度+2
VGG的创新 : 更深 , 更大。 用小卷积核代替大的卷积核

注意由于VGG的前面5个模块都很相似,每个都是两个卷积+一个池化,所以写代码的时候可以单独写一个vgglayer模块这个类(其实就是把这个模块也当作一个模型来写,对它也要写forward)
9.resnet 发现了模型越深,效果越差 ,创新是11乘积和残差连接
残差连接就是 out = f(x)+x
11乘积就可以减少参数量

左边参数量为25625633+256=590,080
右边为2566411+64+646433+64+6425611+256=70016
10.为什么残差连接有用?

如图,如果网络一定很深比如50多层,可能接近输出的那些层求导还行,到了前面因为太多小于1的数相乘而导致梯度接近于0,以至于前面的参数更新不动,使用了残差,就相当于链式求导的那一项一定是大于1的数,缓解了梯度消失
至于梯度爆炸,如果导数算出来很大就会裁下来,具体李哥没讲,一般不会梯度爆炸
relu的导数为1,也能缓解梯度消失问题。但sigmoid函数有很严重的梯度消失问题


卷积既不是不跟全连接一样,每个神经元都会连接前面的输出,并且每个神经元只有一个参数,一个卷积核共用一个偏置参数
所以卷积是一种参数共享的不全连接
- 图片的特征图之后的下一层输出即为分类结果。


浙公网安备 33010602011771号