PyTorch - 17 - CNN层 - PyTorch深度神经网络架构
Our CNN Layers
在上一篇文章中,我们通过扩展PyTorch神经网络模块类并定义一些图层作为类属性来开始构建CNN。 通过在构造函数中指定它们,我们定义了两个卷积层和三个线性层。
class Network(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(in_channels=1, 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*4*4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=10)
def forward(self, t):
# implement the forward pass
return t
我们的每一层都扩展了PyTorch的神经网络模块类。 对于每一层,内部封装了两个主要项目,一个正向函数定义和一个权重张量。
每层内部的权重张量包含随着训练过程中网络学习而更新的权重值,这就是我们将各层指定为Network类中的属性的原因。
PyTorch的神经网络模块类跟踪每层内部的重量张量。 进行此跟踪的代码位于nn.Module类内部,并且由于我们正在扩展神经网络模块类,因此我们会自动继承此功能。
请记住,继承是我们上次讨论的那些面向对象的概念之一。 为了利用此功能,我们要做的就是将图层分配为网络模块内的属性,而Module基类将看到此并将权重注册为网络的可学习参数。
CNN Layer Parameters
我们在这篇文章中的目标是更好地了解我们已定义的层。 为此,我们将学习有关参数以及在层构造函数中为这些参数传递的值。
Parameter Vs Argument
首先,让我们澄清一些与参数有关的术语。 我们经常听到参数和自变量这两个词,但是两者之间有什么区别?
参数将在函数定义中用作占位符,而参数是传递给函数的实际值。 可以将参数视为函数内部的局部变量。
在我们的网络中,名称是参数,而我们指定的值是参数。
Two Types Of Parameters
为了更好地理解这些参数的参数值,让我们考虑在构造图层时使用的两种类型的参数。
- 超参数
- 数据相关的超参数
深度学习中的许多术语被松散使用,单词形参就是其中之一。 尽量不要让它通过你。 关于任何类型的参数要记住的主要事情是,该参数是一个占位符,它将最终保存或具有一个值。
这些特定类别的目的是帮助我们记住如何确定每个参数的值。
构造图层时,我们将每个参数的值传递给图层的构造函数。 对于我们的卷积层,有三个参数,线性层有两个参数。
卷积层
- in_channels
- out_channels
- kernel_size
线性层
- in_features
- out_features
让我们看看如何确定参数的值。 我们将从查看超参数开始,然后,我们将查看相关超参数如何落入适当位置。
Hyperparameters
通常,超参数是其值是手动和任意选择的参数。
作为神经网络程序员,我们主要根据反复试验来选择超参数值,并且越来越多地利用过去证明有效的值来选择超参数值。为了构建CNN图层,这些是我们手动选择的参数。
- kernel_size
- out_channels
- out_features
这意味着我们只需选择这些参数的值即可。在神经网络编程中,这很普遍,我们通常会测试和调整这些参数以找到最合适的值。
参数 | 说明 |
---|---|
kernel_size | 设置过滤器的大小。内核和过滤器一词可以互换。 |
out_channels | 设置过滤器的数量。一个滤波器产生一个输出通道。 |
out_features | 设置输出张量的大小。 |
经常出现的模式是,随着添加其他转换层,我们增加了out_channels;切换到线性层后,我们缩小了out_features,因为我们向下过滤了输出类的数量。
所有这些参数都会影响我们的网络架构。具体而言,这些参数直接影响层内部的重量张量。在下一篇文章中,当我们讨论可学习的参数并检查权重张量时,我们将更深入地探讨这一点,但是现在,让我们讨论依赖的超参数。
Data Dependent Hyperparameters
数据相关的超参数是其值取决于数据的参数。突出显示的前两个与数据相关的超参数是第一卷积层的in_channels和输出层的out_features。
您会看到,第一卷积层的in_channels取决于构成训练集的图像中存在的颜色通道的数量。由于我们正在处理灰度图像,因此我们知道此值应为1。
输出层的out_features取决于我们的训练集中存在的类的数量。由于我们在Fashion-MNIST数据集中有10类服装,因此我们知道我们需要10个输出要素。
通常,一层的输入是前一层的输出,因此conv层中的所有in_channels和线性层中的in_features都取决于来自前一层的数据。
从转换层切换到线性层时,必须拉平张量。这就是为什么我们有12 * 4 * 4。十二个来自上一层输出通道的数量,但是为什么我们有两个四个?我们将在以后的文章中介绍如何获得这些价值。
Summary Of Layer Parameters
当我们实现forward()函数时,我们将详细了解网络的内部工作原理以及张量如何在网络中流动。 现在,请务必查看描述每个参数的表格,以确保您可以了解如何确定每个参数的值。
self.conv1 = nn.Conv2d(in_channels=1, 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 * 4 * 4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=10)
图层 | 参数名称 | 参数值 | 参数值为 |
---|---|---|---|
conv1 | in_channels | 1 | 输入图像中颜色通道的数量。 |
conv1 | kernel_size | 5 | 一个超参数。 |
conv1 | out_channels | 6 | 一个超参数。 |
conv2 | in_channels | 6 | 上一层的out_channels数。 |
conv2 | kernel_size | 5 | 一个超参数。 |
conv2 | out_channels | 12 | 一个超参数(高于先前的conv层)。 |
fc1 | in_features | 12 * 4 * 4 | 来自上一层的平坦输出的长度。 |
fc1 | out_features | 120 | 一个超参数。 |
fc2 | in_features | 120 | 上一层的out_features数。 |
fc2 | out_features | 60 | 一个超参数(低于先前的线性层)。 |
out | in_features | 60 | 上一层中的out_channels数。 |
out | out_features | 10 | 预测类的数量。 |
Wrapping Up
在下一篇文章中,我们将学习可学习的参数,这些参数的值是在训练过程中学习的。 到时候那里见!