专栏首页AI算法与图像处理CNN层参数详解 | PyTorch系列(十四)

CNN层参数详解 | PyTorch系列(十四)

文 |AI_study

在上一篇文章中,我们通过扩展PyTorch神经网络模块类并定义一些层作为类属性来开始构建CNN。通过在构造函数中指定它们,我们定义了两个卷积层和三个线性层。

面向对象编程的方式搭建CNN网络 | PyTorch系列(十三)

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的参数值,让我们考虑在构造层时使用的两种类型的参数。

  1. 超参数(Hyperparameters)
  2. 数据相关的超参数(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() 函数时张量是如何流经网络的。现在,一定要查看这个描述每个参数的表,以确保您能够理解每个参数值是如何确定的。

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

本文分享自微信公众号 - AI算法与图像处理(AI_study),作者:AI_study

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PyTorch神经网络中可学习的参数——CNN权重 | PyTorch系列(十五)

    在本系列的最后几篇文章中,我们已经开始构建CNN,我们做了一些工作来理解我们在网络构造函数中定义的层。

    AI算法与图像处理
  • PyTorch中Linear层的原理 | PyTorch系列(十六)

    原标题:PyTorch Callable Neural Networks - Deep earning In Python

    AI算法与图像处理
  • 2019 Python 面试 100 问,你会几道?

    1.通过headers反爬虫 2.基于用户行为的发爬虫:(同一IP短时间内访问的频率) 3.动态网页反爬虫(通过ajax请求数据,或者通过JavaScript生...

    AI算法与图像处理
  • 经典面试题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    cwl_java
  • 面试官,不要再问我“Java虚拟机类加载机制”了

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户1161110
  • 为易用而生,揭秘你不知道的最新飞桨核心框架

    很多未到场的开发者觉得遗憾,希望可以了解飞桨发布会背后的更多技术细节。机器之心策划了一个系列稿件,分别从核心框架、基础模型库、端到端开发套件、工具组件和服务平台...

    机器之心
  • linux—find用法详解

    find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path…] [expression]

    用户4877748
  • R语言可视化——多边形与数据地图填充

    ggplot函数中有一类特殊的图表类型叫做多边形,很难用传统的视角来定义它属于哪一类图表,因为它能够呈现信息多种多样。 特别是在做某些比较高阶的图表——地图时,...

    数据小磨坊
  • Kotlin入门(25)共享参数模板

    共享参数SharedPreferences是Android最简单的数据存储方式,常用于存取“Key-Value”键值对数据。在使用共享参数之前,要先调用getS...

    用户4464237
  • 列表-list

    Python内置的列表数据类型:list list是一种有序的集合,可以随时添加和删除其中的元素 list可以包含不同数据类型的元素,如['Apple',...

    py3study

扫码关注云+社区

领取腾讯云代金券