深度学习 | 学习第一个卷积神经网络结构

共 4946字,需浏览 10分钟

 ·

2024-04-11 08:41

Hey 朋友,点击蓝字关注吗?

ec50f893c4e1b7cf1829e8993ed10618.webp


深度学习




学习第一个卷积神经网络结构



Hi~ 大家好。


今天学习了第一个深度学习的小程序,为了加深理解,对程序进行了逐行解析,并在此进行记录分享,欢迎感兴趣的朋友一起讨论学习。


# 1

先给出完整程序:


          
            import torch.nn as nn
          
          
            import torch.nn.functional as F
          
          
            
              

class Net(nn.Module): def __init__(self): # nn.Module子类的函数必须在构造函数中执行父类的构造函数 # 下式等价于nn.Module.__init__(self) super(Net, self).__init__()

# 卷积层 '1'表示输入图片为单通道, '6'表示输出通道数,'5'表示卷积核为5*5 self.conv1 = nn.Conv2d(1, 6, 5) # 卷积层 self.conv2 = nn.Conv2d(6, 16, 5) # 仿射层/全连接层,y = Wx + b self.fc1 = nn.Linear(16*5*5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10)

def forward(self, x): # 卷积 -> 激活 x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) x = F.max_pool2d(F.relu(self.conv2(x)), 2) # reshape,‘-1’表示自适应 x = x.view(x.size()[0], -1) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x

net = Net() print(net)




# 2


下面进行程序分析:


首先导入必需的库


          
            import torch.nn as nn
          
          
            import torch.nn.functional as F
          
        


torch.nn: 这个模块包含了构建神经网络所需的所有构件,比如层结构(线性层、卷积层等)和一些激活函数。每个模块都是nn.Module的子类,并且是为了方便模型构建而抽象出的高级接口。

torch.nn.functional: 提供了一些函数式的接口,用于直接对输入进行操作,如激活函数(ReLU等)、池化函数等。这些函数通常是无状态的,即不包含可训练参数。


定义神经网络


          
            
              class Net(nn.Module):
            
          
        


这里定义了一个名为Net的类,它继承自nn.Module。在PyTorch中,自定义的网络模型都应该继承自nn.Module类,这个基类提供了模型需要的大部分功能,如参数管理、模型保存与加载等。


构造函数


          
            def __init__(self):    
          
          
            super(Net, self).__init__()
          
        


在Net的构造函数中,首先调用super(Net, self).__init__()以确保父类nn.Module的构造函数被正确执行。这是初始化继承自其他Python类的自定义类的标准做法。


定义层结构


          
            self.conv1 = nn.Conv2d(1, 6, 5) 
          
          
            self.conv2 = nn.Conv2d(6, 16, 5) 
          
          
            self.fc1 = nn.Linear(16*5*5, 120) 
          
          
            self.fc2 = nn.Linear(120, 84) 
          
          
            self.fc3 = nn.Linear(84, 10)
          
        


self.conv1和self.conv2定义了两个卷积层。nn.Conv2d的参数分别代表输入通道数、输出通道数和卷积核的尺寸。例如,self.conv1接收单通道图像,输出6个通道的特征映射,使用5x5的卷积核。

self.fc1, self.fc2, self.fc3定义了三个全连接层(也称线性层)。nn.Linear的参数分别代表输入特征数和输出特征数。例如,self.fc1接收1655大小的输入(来自前一层的输出),并输出120个特征。


前向传播


          
            
              def forward(self, x)
              :
            
          
        

forward函数定义了数据通过网络的方式。x是输入数据。


解释

          
            x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) 
          
          
            x = F.max_pool2d(F.relu(self.conv2(x)), 2)x = x.view(x.size()[0], -1) 
          
          
            x = F.relu(self.fc1(x)) 
          
          
            x = F.relu(self.fc2(x)) 
          
          
            x = self.fc3(x)
          
        


在每个卷积层后,使用ReLU函数作为激活函数,随后应用最大池化(F.max_pool2d)以减少特征维度和增强模型的泛化能力。池化层的参数指定了池化窗口的大小。


x.view(x.size()[0], -1)这行代码将多维特征图转换(或称为扁平化)为一维向量,以便全连接层可以处理。这是从卷积层到全连接层过渡的常见做法。


数据通过全连接层序列,其中前两层使用ReLU激活函数,最后一层的输出可以用于计算分类任务的概率分布(通常在此之后会加上Softmax层进行多分类问题的概率输出)。



总结:这个网络架构是一个经典的卷积神经网络结构,适合处理图像数据。通过两个卷积层提取空间特征,然后通过全连接层进行分类。每一层都有其特定的作用和配置,例如卷积层用于提取图像特征,全连接层用于将这些特征映射到最终的输出类别。这种结构的网络在图像识别、分类任务中非常有效。






494969dc27418c36723257c982198330.webp


声明:转载或者引用本文内容请联系本文作者。



  - end -  


视觉选型|机器人选型|手眼标定

图像处理|视觉软件开发|案例应用分享



浏览 18
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报