PyTorch|构建自己的卷积神经网络——nn.Sequential()

之前在构建神经网络时,我们一般是采用这种方式,就像这样:

复制代码
class Network1(nn.Module):    def __init__(self):        super(Network1,self).__init__()        self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5)        self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)        self.fc1 = nn.Linear(in_features= 12*20*20, out_features=120)        self.out = nn.Linear(in_features=120, out_features=10)        def forward(self, t):        t=self.conv1(t)        t=self.conv2(t)        t=t.flatten(start_dim=1)        t=self.fc1(t)        t=self.out(t)        return t

在__init__()模块中,一系列的层被定义,比如卷积层,全连接层...在forward()方法中,我们对这些层进行操作,使得数据在网络中进行传播。

随着层的增加,以及池化操作,激活函数操作的增加,代码似乎变得很复杂。

在PyTorch中,提供了一种序列容器,叫做nn.Sequential(),它可以按照网络模块被添加的顺序依次执行。

于是上面的代码可以以这样的方式重写:​​​​​​​

复制代码
class Network2(nn.Module):    def __init__(self):        super(Network2,self).__init__()        self.layer1=nn.Sequential(nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5),                                      nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5),                                      nn.Flatten(),                                      nn.Linear(in_features= 12*20*20, out_features=120),                                      nn.Linear(in_features=120, out_features=10)                                         )    def forward(self,t):        t=self.layer1(t)        return t

让我们将一张图片输入到这两个网络中,看看会发生什么?​​​​​​​

复制代码
path="E:\\3-10\\input1.jpg"img=Image.open(path)img=img.resize((28,28))#改变图片尺寸img=np.array(img)#转换为ndarrayimg=torch.tensor(img,dtype=torch.float32)#转换为张量img=img.permute(2,0,1)#改变维度顺序
img=img.unsqueeze(0)#增加批次维度img.size()​​​​​​

torch.manual_seed(10)#随机数种子net1=Network1()torch.manual_seed(10)net2=Network2()net1(img),net2(img)
(tensor([[  8.6586,   5.6796, -10.6183, -14.5155,  -5.1435,  -1.2218, -35.0356,            9.9759, -15.0035, -31.1104]], grad_fn=<AddmmBackward0>), tensor([[  8.6586,   5.6796, -10.6183, -14.5155,  -5.1435,  -1.2218, -35.0356,            9.9759, -15.0035, -31.1104]], grad_fn=<AddmmBackward0>))

注:由于每次初始化网络时,权重是随机的,所以要设置一个随机数种子,使得两个网络以一种固定的权重初始化,以确保两个网络在接受数据输入前完全相同。

结果很显然,两种网络输出了同样的结果!

第一种构建网络的方法让层和操作隔离开来,使得我们在构建网络时不同部分时专注于一点即可,而第二种方法则是直接按照顺序直接构建了网络,看起来似乎更简洁。

当然,以什么方式构建网络完全取决于习惯,这并不会对结果造成任何影响!

相关推荐
过期的秋刀鱼!2 分钟前
机器学习-正则化线性回归
人工智能·深度学习·机器学习·大模型·线性回归·过拟合和欠拟合·大模型调参
roman_日积跬步-终至千里6 分钟前
【AI for Energy】论文分析:ChatBattery——LLM引导的电池材料发现方法
人工智能
CoderJia程序员甲11 分钟前
GitHub 热榜项目 - 日榜(2026-01-18)
人工智能·ai·大模型·github·ai教程
DatGuy13 分钟前
Week 33: 量子深度学习入门:参数化量子电路与混合模型构建
人工智能·深度学习
啊阿狸不会拉杆13 分钟前
《数字图像处理》第 12 章 - 目标识别
图像处理·人工智能·算法·计算机视觉·数字图像处理
biyezuopinvip20 分钟前
基于深度学习的眼底图像分割方法研究与实现(论文)
人工智能·深度学习·毕业设计·论文·毕业论文·基于深度学习的·眼底图像分割方法研究与实现
老蒋每日coding23 分钟前
AI Agent 设计模式系列(九)——学习和适应模式
人工智能·学习·设计模式
Das124 分钟前
【机器学习】05_决策树
人工智能·决策树·机器学习
学习3人组26 分钟前
大模型轻量化调优(昇腾平台方向)岗位技术名词拆解
人工智能·python
知乎的哥廷根数学学派27 分钟前
基于物理引导和不确定性量化的轻量化神经网络机械退化预测算法(Python)
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习