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

在这里插入图片描述
为了更好地理解这些参数的参数值,让我们考虑在构造图层时使用的两种类型的参数。

  1. 超参数
  2. 数据相关的超参数

深度学习中的许多术语被松散使用,单词形参就是其中之一。 尽量不要让它通过你。 关于任何类型的参数要记住的主要事情是,该参数是一个占位符,它将最终保存或具有一个值。

这些特定类别的目的是帮助我们记住如何确定每个参数的值。

构造图层时,我们将每个参数的值传递给图层的构造函数。 对于我们的卷积层,有三个参数,线性层有两个参数。

卷积层

  1. in_channels
  2. out_channels
  3. kernel_size

线性层

  1. in_features
  2. out_features

让我们看看如何确定参数的值。 我们将从查看超参数开始,然后,我们将查看相关超参数如何落入适当位置。

Hyperparameters

通常,超参数是其值是手动和任意选择的参数。

作为神经网络程序员,我们主要根据反复试验来选择超参数值,并且越来越多地利用过去证明有效的值来选择超参数值。为了构建CNN图层,这些是我们手动选择的参数。

  1. kernel_size
  2. out_channels
  3. 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

在下一篇文章中,我们将学习可学习的参数,这些参数的值是在训练过程中学习的。 到时候那里见!

猜你喜欢

转载自blog.csdn.net/weixin_48367136/article/details/112529174