ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

优达学城深度学习之七——TensorFlow卷积神经网络

2021-06-01 16:53:54  阅读:245  来源: 互联网

标签:之七 nn 卷积 self channels stride 优达 图像 TensorFlow


、胶囊网络

池化运算会丢失一些图像信息。这是因为为了获得更小的特征级图像表示,池化会丢弃像素信息。与池化层相比,有一些分类方法不会丢弃空间信息,而是学习各个部分之间的关系(例如眼睛、鼻子和嘴之间的空间关系)。

学习各部分之间的空间关系的一种方法就叫胶囊网络。

胶囊网络能够从图像中检测出对象的各个部分,并表示这些部分之间的空间关系。如果对象(例如人脸)具有不同的形态和典型数量的特征(眼睛、鼻子、嘴),胶囊网络便能够识别同一对象,即使没有在训练数据里见过这些形态。

胶囊网络由父节点和子节点组成,这些节点构成了对象的完整样貌。

 在上述示例中,模型能够识别叶节点中的人脸部分(眼睛、鼻子、嘴等),然后在父节点中形成更完整的人脸部分。

 什么是胶囊

胶囊实际上是节点集合,每个节点都包含关于特定部分的信息,例如宽度、方向、颜色等特性。注意,每个胶囊都输出一个向量,该向量由大小和方向组成。

  • 大小 (m) = 某个部分存在的概率;值在 0 到 1 之间。
  • 方向 (theta) = 某个部分的状态。

我们可以对这些输出向量执行数学运算并构建一个解析树,最终识别出由多个小部分组成的完整对象。

大小是一个特殊的属性,即使对象朝着不同的方向,大小也应该很大,如下图所示。

 

增加深度

 pytorch层级

卷积层,通常我们在PyTorch 中使用 nn.Conv2d 定义卷积层,并指定以下参数:

nn.conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0)
in_channels 是指输入深度。对于灰阶图像来说,深度 = 1
out_channels 是指输出深度,或你希望获得的过滤图像数量
kernel_size 是卷积核的大小(通常为 3,表示 3x3 核)
stride 和 padding 具有默认值,但是应该根据你希望输出在空间维度 x, y 里具有的大小设置它们的值

pytorch中的卷积层

要在 PyTorch 中创建卷积层,必须首先导入必要的模块:

import torch.nn as nn

然后定义卷积层和模型的前馈行为(输入如何经过网络层级)。首先必须定义一个 Model 类并填写两个函数。

你可以通过以下格式在 __init__ 函数里定义卷积层:

self.conv1=nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0))

forward

然后在 forward 函数里引用该层级!在此例中,我传入了输入图像 x,并向此层的输出应用了 ReLU 函数。

x=F.relu(self.conv1(x))

 参数

必须传递以下参数:

  • in_channels - 输入数量(深度),例如 RGB 图像是 3。
  • out_channels - 输出通道的数量,即卷积层包含的过滤“图像”数量,或者将应用到输入上的唯一卷积核数量。
  • kernel_size - 表示(方形)卷积核的高度和宽度。

你还可以调整其他可选参数:

  • stride - 卷积步长。如果不指定任何值,stride 将设为 1
  • padding - 输入数组周围的 0 边。如果不指定任何值,padding 将设为 0

注意:可以将 kernel_size 和 stride 表示为数字或元组。

你还可以设置很多其他可调参数,从而更改卷积层的行为。要了解详情,请参阅此官方文档

池化层

池化层的参数是核大小和步长。通常和下采样因子的值一样。例如,以下代码将使输入的 x-y 维度下采样到一半大小:

self.pool=nn.MaxPool2d(2,2)

以下代码将池化层应用到了 forward 函数。

x=F.relu(self.conv1(x))
x=self.pool(x)

卷积示例 1

假设我要构建一个 CNN,输入层接受的是 200 x 200 像素(对应于高 200、宽 200、深 1 的三维数组)的灰阶图像。然后,假设下一层是一个卷积层,包含 16 个过滤器,每个过滤器的宽和高都是 2。在进行卷积运算时,我希望过滤器一次跳过 2 个像素。但是我不希望过滤器越过图像边界;换句话说,我不想用 0 填充图像。要构建此卷积层,我会使用以下代码:

self.conv1=nn.Conv2d(1,16,2,stride=2)
序列模型

我们还可以在 __init__ 函数里使用 Sequential 封装容器,这样就能在 PyTorch 中创建 CNN 模型。序列模型使我们能够堆叠不同的层级,并在层级之间指定激活函数。

def __init__(self):
        super(ModelName, self).__init__()
        self.features = nn.Sequential(
              nn.Conv2d(1, 16, 2, stride=2),
              nn.MaxPool2d(2, 2),
              nn.ReLU(True),

              nn.Conv2d(16, 32, 3, padding=1),
              nn.MaxPool2d(2, 2),
              nn.ReLU(True) 

 

标签:之七,nn,卷积,self,channels,stride,优达,图像,TensorFlow
来源: https://blog.51cto.com/u_15242250/2842421

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有