深度学习 | 学习第一个卷积神经网络结构
共 4946字,需浏览 10分钟
·
2024-04-11 08:41
Hey 朋友,点击蓝字关注吗?
深度学习
学习第一个卷积神经网络结构
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层进行多分类问题的概率输出)。
总结:这个网络架构是一个经典的卷积神经网络结构,适合处理图像数据。通过两个卷积层提取空间特征,然后通过全连接层进行分类。每一层都有其特定的作用和配置,例如卷积层用于提取图像特征,全连接层用于将这些特征映射到最终的输出类别。这种结构的网络在图像识别、分类任务中非常有效。
声明:转载或者引用本文内容请联系本文作者。
- end -
视觉选型|机器人选型|手眼标定
图像处理|视觉软件开发|案例应用分享