欢迎光临
我们一直在努力

pytorch12->Sequential的简单应用

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter # 导入放最上面

# 1. 定义模型
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
# 使用 Sequential 容器按顺序装层
self.model1 = Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10)
)

def forward(self, x):
x = self.model1(x)
return x

# 2. 创建模型实例
tudui = Tudui()
print(tudui)

# 3. 验证网络尺寸
input = torch.ones((64, 3, 32, 32))
output = tudui(input)
print(f"输出形状: {output.shape}") # torch.Size([64, 10])

# 4. TensorBoard 可视化
writer = SummaryWriter("logs_seq")
writer.add_graph(tudui, input) # 把模型结构画出来
writer.close()

print("完成!运行 tensorboard –logdir=logs_seq 查看模型结构")

一.Sequential是顺序执行容器

不用Sequential:

self.conv1 = Conv2d(3, 32, 5, padding=2)
self.pool1 = MaxPool2d(2)

用Sequential就不用self.:

self.model1 = Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),

二.

self.model1 = Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10)
)

1.Conv2d(3, 32, 5, padding=2)
#              ↑    ↑   ↑      ↑
#              │   │   │     └── 第4个参数:padding(填充)
#              │   │   └──────── 第3个参数:kernel_size(卷积核大小)
#              │   └──────────── 第2个参数:out_channels(输出通道数)
#              └──────────────── 第1个参数:in_channels(输入通道数)

第一次二维卷积,输入RGB3个通道,用32个卷积核扫描,输出32个通道,这32个通道,可以理解为32种不同的“特征视角”,每一张特征图都对应一个卷积核。

可以大致理解为:

  • 卷积核1:专门找“横着的边缘”

  • 卷积核2:专门找“竖着的边缘”

  • 卷积核3:专门找“45度斜线”

  • 卷积核4:专门找“亮斑”(比如灯光、眼睛反射)

  • 卷积核5:专门找“暗斑”(比如阴影、深色纹理)

  • 卷积核6:专门找“红色与绿色的分界处”

  • ……

  • 卷积核32:专门找某种特殊的纹理(比如鱼鳞状、网格状)

  • 这32张特征图,就是网络对这张图片的 “初印象总结”,它把原始图片从“红绿蓝三色像素”的视角,转换为“32种不同特征强度”的视角,为后续的识别任务提供了更丰富的“原材料”。

5是卷积核大小,5*5。

2.        padding是2,填充的意思,上下左右边各填充2行,原来是32*32的像素点,现在是36*36的像素点

输出尺寸 = (输入尺寸 – 卷积核大小 + 2×padding) / 步长 + 1

这道题是        输出尺寸 = (32 – 5 + 2×2) / 1 + 1 = 32,这样能保证输出的尺寸和输入的尺寸一边大

为什么需要填充?

假设原图是32*32,卷积核是5*5,原来总共就是0~31行,如果不填充,卷积核只能在2~29行取到数,上下左右边缘的2行都被损失掉了,如果补上两行,padding=2的话,卷积核才能取到原来的32*32

没写步长stride,默认就是1

3. MaxPool2d(2),最大池化2*2,

例如:

[1,2]

[3,4]

取4个像素中的最大值4,拿到其中最明显的特征

4.卷积的操作是扫描固定大小的局部,池化是缩小,把原来4个像素取最大值留一个,原来的32*32池化一次之后就是16*16

5. Conv2d(32, 32, 5, padding=2),

     MaxPool2d(2),

  • 第一次卷积的 32 张图:识别线条、边缘、颜色变化(基础特征)

  • 第二次卷积的 32 张图:识别角、形状、纹理等(组合特征)

第二次卷积卷的是第一次卷积的结果,在原有基础的情况下再进一步识别出组合的特征

第二次池化后图片从16*16变成8*8

6. Conv2d(32, 64, 5, padding=2),

    MaxPool2d(2),

第三次卷积输出变成 64 张 特征图,它不再看“边缘”或“角”,而是看 “这些形状是怎么组合成完整部件的”。

比如:

  • 多个弧线 + 一个圆形 → 可能是一个眼睛

  • 几条直线围成一个矩形 → 可能是一个车窗

  • 两条弧线 + 一条横线 → 可能是一个猫耳朵

第三次池化把8*8*变成4*4

7. Flatten():一张图片64个通道(特征图)每个通道4*4个像素(这里说像素不准确,一次卷据之后的图他都不能叫像素,应该叫特征的值,叫像素为了方便理解),

flatten把64*4*4全都展平成1维即1*1024,因为后面linear线性层只接受一维的

8. Linear(1024, 64),

    Linear(64, 10)

通过全连接层的两次线性变换,最终输出一个10维的特征,因为cifar10有10个物体,看他们最后的权重大小,看这图片最像什么

三.

1.

torch.ones((64, 3, 32, 32))
#     ↑ ↑ ↑ ↑
# │ │ │ └── 图片宽 = 32 像素
# │ │ └────── 图片高 = 32 像素
# │ └───────── 通道数 = 3(彩色图 RGB)
# └───────────── 图片张数 = 64张

ones意思是每个像素都是1,也就是64张纯白图片,用来测试

赞(0)
未经允许不得转载:171主机测评 » pytorch12->Sequential的简单应用
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址