首页 > 其他分享 >深度学习(七)——神经网络的卷积操作

深度学习(七)——神经网络的卷积操作

时间:2023-07-19 21:22:48浏览次数:43  
标签:12 nn 卷积 torch functional 神经网络 深度 input

卷积操作

一、torch.nn中Convolution Layers函数的介绍

1. 参数介绍

  • nn.Conv1d: Conv取自Convolution的前四个字母,1d代表的是一个一维操作。

  • nn.Conv2d: 2d表示是一个二维的操作,比如图像就是一个二维的。

  • 其余参数不常用,见官网文档:torch.nn — PyTorch 2.0 documentation

2. torch.nn和torch.nn.functional的区别

  • torch.nn是对torch.nn.functional的一个封装,让使用torch.nn.functional里面的包的时候更加方便

  • torch.nn包含了torch.nn.functional,打个比方,torch.nn.functional相当于开车的时候齿轮的运转,torch.nn相当于把车里的齿轮都封装好了,为我们提供一个方向盘

  • 如果只是简单应用,会torch.nn就好了。但要细致了解卷积操作,需要深入了解torch.nn.functional

  • 打开torch.nn.functional的官方文档,可以看到许多跟卷积相关的操作:torch.nn.functional — PyTorch 2.0 documentation

二、torch.nn.functional.conv2d 介绍

官网文档:torch.nn.functional.conv2d — PyTorch 2.0 documentation

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

1. 参数详解

  • input: 输入,数据类型为tensor,形状尺寸规定为:(minibatch, 几个通道(in_channels), 高, 宽)

  • weight: 权重。更专业地来说可以叫卷积核,形状尺寸规定为:(输出的通道(out_channel), \(in\_channel\over{groups}\)(groups一般取1), 高, 宽 )

  • bias: 偏置。

  • strids: 步幅。

  • padding: 填充。

2. 举例讲解参数strids

(1)理论

输入一个5×5的图像,其中的数字代表在每个像素中的颜色显示。卷积核设置为3×3的大小。

  • strids参数的输入格式是单个数或者形式为 (sH,sW) 的元组,可以理解成:比如输入单个数:strids=1,每次卷积核在图像中向上下或左右移1位;如果输入strids=(2,3),那么每次卷积核在图像中左右移动(横向移动)时,是移动2位,在图像中上下移动(纵向移动)时,是移动3位。

  • 本例设置strids=1

第一次移位:

  • 基于上述的假设,在做卷积的过程中,需要将卷积核将图像的前三行和前三列进行匹配:

  • 在匹配过后,进行卷积计算对应位相乘然后相加,即

    \[1×1+2×2+0×1+0×0+1×1+2×0+1×2+2×1+1×0=10 \]

  • 上面的得出的\(10\)可以赋值给矩阵,然后作为一个输出

  • 之后卷积核可以在图像中进行一个移位,可以向旁边走1位或2位,如下图(向右走2位)。具体走多少位由strids参数决定,比如strids=2,那就是走2位。本例设置stride=1。

第二次移位:

  • 向右移动一位,进行卷积计算:

    \[2×1+0×2+3×1+1×0+2×1+3×0+2×2+1×1+0×0=12 \]

  • \(12\)可以赋值给矩阵,然后作为一个输出

第三次移位:

  • 向右移动一位,进行卷积计算:

    \[0×1+3×2+1×1+2×0+3×1+1×0+1×2+0×1+0×0=12 \]

  • \(12\)可以赋值给矩阵,然后作为一个输出

  • 第三次移位后,发现卷积核已经没办法向右移位,进行匹配了。所以我们在纵向上,向下走:

第四次移位:

  • 在最开始的位置上,向下移动一位,进行卷积计算:

    \[0×1+1×2+2×1+1×0+2×1+1×0+5×2+2×1+2×0=18 \]

  • \(18\)可以赋值给矩阵,然后作为一个输出

第五次移位:

  • 在上面的基础上,向右移一位,进行卷积计算:

    \[1×1+2×2+3×1+2×0+1×1+0×0+2×2+3×1+1×0=16 \]

  • \(16\)可以赋值给矩阵,然后作为一个输出

以此类推,走完整个图像,最后输出的矩阵如下图。这个矩阵是卷积后的输出

(2)程序操作

将上面的过程写到程序内:

import torch
import torch.nn.functional as F

# 构造输入图像(input参数输入的数据类型为tensor,并且为2维)
input=torch.tensor([[1,2,0,3,1],
                    [0,1,2,3,1],
                    [1,2,1,0,0],
                    [5,2,3,1,1],
                    [2,1,0,1,1]])

# 构造卷积核(数据类型也是tensor,并且为2维)
kernel=torch.tensor([[1,2,1],
                     [0,1,0],
                     [2,1,0]])

#查看尺寸,输出后发现并不符合参数输入的尺寸标准,所以需要进一步转换数据
print(input.shape) #[Run]  torch.Size([5, 5])
print(kernel.shape) #[Run]  torch.Size([3, 3])

#转换input、kernel数据
input=torch.reshape(input,(1,1,5,5))  #torch.reshape(tensor数据,想变成的格式尺寸(batch=1,通道=1,5×5))
kernel=torch.reshape(kernel,(1,1,3,3))

#查看尺寸,输出后发现符合参数输入的尺寸标准
print(input.shape) #[Run]  torch.Size([1, 1, 5, 5])
print(kernel.shape) #[Run]  torch.Size([1, 1, 3, 3])

# 进行卷积操作
#stride=1,输出结果与上面矩阵一致
output=F.conv2d(input,kernel,stride=1)
print(output)
"""
[Run]
tensor([[[[10, 12, 12],
          [18, 16, 16],
          [13,  9,  3]]]])
"""

#stride=2
output2=F.conv2d(input,kernel,stride=2)
print(output2)
"""
[Run]
tensor([[[[10, 12],
          [13,  3]]]])
"""

3. 举例讲解参数padding

padding的作用是在输入图像的左右两边进行填充,padding的值决定填充的大小有多大,它的输入形式为一个整数或者一个元组 ( padH, padW ),其中,padH=高padW=宽默认padding=0,即不进行填充。

(1)理论

  • 仍输入上述的5×5的图像,并设置padding=1,那么输入图像将会变成下图,即图像的上下左右都会拓展一个像素,然后这些空的地方像素(里面填充的数据)都默认为0。

  • 按上面的顺序进行卷积计算,第一次移位时在左上角3×3的位置,卷积计算公式变为:

    \[0×1+0×2+0×1+0×0+1×1+2×0+0×2+0×1+1×0=1 \]

  • 以此类推,完成后面的卷积计算,并输出矩阵

(2)程序操作

在上面的代码后,加入这串代码,以验证padding的操作:

output3=F.conv2d(input,kernel,stride=1,padding=1)
print(output3)
"""
[Run]
tensor([[[[ 1,  3,  4, 10,  8],
          [ 5, 10, 12, 12,  6],
          [ 7, 18, 16, 16,  8],
          [11, 13,  9,  3,  4],
          [14, 13,  9,  7,  4]]]])
"""

标签:12,nn,卷积,torch,functional,神经网络,深度,input
From: https://www.cnblogs.com/zoubilin/p/17566793.html

相关文章

  • 单层反馈神经网络
    如何实现单层反馈神经网络简介单层反馈神经网络(Single-layerFeedforwardNeuralNetwork)是一种最简单的神经网络模型,也叫感知机(Perceptron)。它由输入层、输出层和一个称为激活函数的非线性函数组成,可以用于二分类或多分类问题。本文将介绍如何使用Python实现单层反馈神经网络。......
  • 使用PyTorch 深度学习
    使用PyTorch深度学习的步骤作为一名经验丰富的开发者,我很高兴有机会向你介绍如何使用PyTorch进行深度学习。PyTorch是一个开源的深度学习框架,它提供了丰富的工具和库,使得开发者可以轻松地构建和训练深度学习模型。下面是使用PyTorch进行深度学习的一般步骤:步骤描述步骤......
  • 神经网络与机器学习邱锡鹏
    如何实现神经网络与机器学习邱锡鹏作为一名经验丰富的开发者,我将以一种简洁明了的方式来教会你如何实现"神经网络与机器学习邱锡鹏"。下面是整个流程的步骤概述:步骤说明1.数据准备收集、清洗和准备数据2.特征工程对数据进行预处理和特征提取3.神经网络建模......
  • 神经网络结构图工具
    如何实现神经网络结构图工具作为一名经验丰富的开发者,我很高兴能够教会你如何实现一个神经网络结构图工具。在本文中,我将为你提供一个详细的步骤,以及每一步需要做什么和相应的代码示例。让我们开始吧!步骤一:项目初始化首先,我们需要创建一个新的Python项目,并初始化一个虚拟环境来......
  • 神经网络降噪演示
    神经网络降噪演示介绍神经网络降噪是一种常用的图像处理技术,通过训练神经网络来去除图像中的噪声。本文将介绍神经网络降噪的原理,并通过一个代码示例演示如何使用Python实现神经网络降噪。原理神经网络降噪通常包括两个步骤:训练和应用。在训练阶段,我们使用一组带有噪声的图像......
  • 神经网络分类模型
    神经网络分类模型神经网络是一种模仿人类神经系统构造的人工智能模型。它由多个神经元组成的层级结构,每个神经元通过输入信号的加权和进行激活,传递给下一层的神经元。神经网络模型可以用于各种机器学习任务,包括分类、回归和聚类等。本文将重点介绍神经网络在分类任务中的应用,并提......
  • 深度学习实践
    深度学习实践指南目录引言深度学习实践流程步骤一:数据准备步骤二:模型构建步骤三:模型训练步骤四:模型评估步骤五:模型优化结论引言深度学习是一种强大的机器学习技术,具有广泛的应用。对于初学者来说,实现深度学习可能会感到困惑。本文将引导你完成深度学习实践的整个过程,......
  • 深度学习解方程
    深度学习解方程的流程在深度学习中,解方程可以通过建立一个神经网络模型来实现。下面是解方程的一般流程:步骤操作1准备数据集2构建神经网络模型3训练模型4使用模型进行预测5评估模型的性能现在我将逐步解释每个步骤需要做的事情,并提供相应的代码和......
  • 训练类神经网络
    结果不理想的检查步骤情况一:模型问题所设的模型不包含要找的函数;需要重新修改模型可以增加模型中特征值,或者增加层数(DeepLearning),以增加模型的复杂度情况二:优化(optimization)没做好没有找到模型中解决问题的最好的方法如何判断问题出自情况一还是二:上图右边......
  • 动手学深度学习-笔记
    课程信息课程主页Pytorch版视频教程目录03安装04数据操作+数据预处理05线性代数06矩阵计算07自动求导08线性回归+基础优化算法分集笔记06矩阵计算07自动求导08线性回归+基础优化算法%matplotlib_inline不能在pychrom里运行,在代码最后一行加上plt.s......