文 |AI_study
在上一篇文章中,我们通过扩展PyTorch神经网络模块类并定义一些层作为类属性来开始构建CNN。通过在构造函数中指定它们,我们定义了两个卷积层和三个线性层。
面向对象编程的方式搭建CNN网络 | PyTorch系列(十三)
代码语言:javascript复制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的神经网络Module 类。对于每一层,内部封装了两个主要项目,即forward函数定义和权重张量。
每层内部的权重张量包含随着网络在训练过程中学习而更新的权重值,这就是我们将各层指定为Network类中的属性的原因。
PyTorch的神经网络Module 类跟踪每层内部的权重张量。进行此跟踪的代码位于nn.Module类内部,并且由于我们正在扩展神经网络模块类,因此我们会自动继承此功能。
请记住,继承是我们上次讨论的那些面向对象的概念之一。为了利用此功能,我们要做的就是在网络模块中将各层分配为属性,而Module基类将看到这一点并将权重作为网络的可学习参数。
CNN层参数
我们在这篇文章中的目标是更好地了解我们已定义的层。为此,我们将学习有关参数以及在层构造函数中为这些参数传递的值。
一、Parameter Vs Argument
首先,让我们澄清一些与参数有关的术语。我们经常听到 parameter 和 argument,这两个词,但是两者之间有什么区别?
parameters将在函数定义中用作占位符,而arguments 是传递给函数的实际值。可以将parameters 视为函数内部的局部变量。
在我们的网络中,名称是 parameters 数,而我们指定的值是arguments。
二、Two Types Of Parameters
为了更好地理解这些parameters的参数值,让我们考虑在构造层时使用的两种类型的参数。
- 超参数(Hyperparameters)
- 数据相关的超参数(Data dependent hyperparameters)
深度学习中的许多术语是宽松使用的,单词 parameter 就是其中之一。尽量不要让它通过你。关于任何类型的参数要记住的主要事情是,该参数是一个占位符,它将最终保存或具有一个值。
这些特定类别的目的是帮助我们记住如何确定每个参数的值。
构造层时,我们将每个参数的值传递给层的构造函数。对于我们的卷积层,有三个参数,线性层有两个参数。
- 卷积层
- in_channels
- out_channels
- kernel_size
- 线性层
- in_features
- out_features
让我们看看如何确定参数的值。我们将从查看超参数开始,然后,我们将了解相关超参数如何落入适当位置。
(1)Hyperparameters
通常,超参数是手动和任意选择其值的参数。
作为神经网络程序员,我们选择超参数值主要是基于尝试和错误,并越来越多地使用过去已经证明有效的值。对于构建CNN层,这些是我们手动选择的参数。
- kernel_size
- out_channels
- out_features
这意味着我们只需为这些参数选择值。在神经网络编程中,这是很常见的,我们通常测试和调整这些参数,以找到工作得最好的值。
Parameter | Description |
---|---|
kernel_size | Sets the filter size. The words kernel and filter are interchangeable.(设置filter 大小。kernel和filter这两个词是可以互换的。) |
out_channels | Sets the number of filters. One filter produces one output channel.(设置filter的数量。一个filter产生一个输出通道。) |
out_features | Sets the size of the output tensor.(设置输出张量的大小。) |
在经常出现的模式中,我们在添加额外的conv层时增加out_channels,在切换到线性层之后,在过滤到输出类的数量时缩小out_features。
所有这些参数都会影响我们的网络架构。具体来说,这些参数直接影响层内的权值张量。在下一篇文章中,当我们讨论可学习参数并检查权重张量时,我们将对此进行更深入的讨论,但是现在,让我们讨论依赖超参数。
(2)Data Dependent Hyperparameters
数据相关超参数是其值依赖于数据的参数。突出的前两个数据相关超参数是第一个卷积层的in_channels和输出层的out_features。
你看,第一个convolutional layer的in_channels取决于训练集中图像中出现的彩色通道的数量。因为我们处理的是灰度图像,所以我们知道这个值应该是 1.
输出层的out_features取决于训练集中的类的数量。因为Fashion-MNIST数据集中有10个服装类,所以我们知道我们需要10个输出特性。
通常,一层的输入是上一层的输出,所以conv层中的所有in_channels和线性层中的in_features都依赖于上一层的数据。
当我们从一个conv层转换到一个线性层时,我们必须使我们的张量变平。这就是为什么我们有12 * 4 * 4。12是前一层输出通道的数量,为什么我们有两个4 呢?我们将在以后的文章中讨论如何获得这些值。
层参数汇总
我们将更多地了解网络的内部工作方式,以及在实现forward() 函数时张量是如何流经网络的。现在,一定要查看这个描述每个参数的表,以确保您能够理解每个参数值是如何确定的。
代码语言:javascript复制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)
总结
在下一篇文章中,我们将开始了解可学习参数,这些参数的值是在训练过程中学习的。
文章中内容都是经过仔细研究的,本人水平有限,翻译无法做到完美,但是真的是费了很大功夫,希望小伙伴能动动你性感的小手,分享朋友圈或点个“在看”,支持一下我 ^_^
英文原文链接是:
https://deeplizard.com/learn/video/IKOHHItzukk