【Pytorch神经网络理论篇】 12 卷积神经网络实现+卷积计算的图解

简介: nn.functional.xxx 需要自己定义 weight,每次调用时都需要手动传入 weight,而 nn.xxx 则不用。

同学你好!本文章于2021年末编写,获得广泛的好评!


故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现,


Pytorch深度学习·理论篇(2023版)目录地址为:


CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录


本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!

https://v9999.blog.csdn.net/article/details/127587345


欢迎大家订阅(2023版)理论篇

以下为2021版原文~~~~


641bb5356cdc40fe9a6edbf975bb8f30.png


1 卷积神经网络接口


1.1 卷积接口介绍


  • torch.nn.functional.conv1d:实现按照1个维度进行的卷积操作,常用于处理序列数据。


  • torch.nn.functional.conv2d:实现按照2个维度进行的卷积操作,常用于处理二维平面图片。


  • torch.nn.functional.conv3d:实现按照3个维度进行的卷积操作,常用于处理三维图形数据。


1.2 卷积函数的定义


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

  • input:输入图像的大小(minibatch,in_channels,H,W),是一个四维tensor


  • filters:卷积核的大小(out_channels,in_channe/groups,H,W),是一个四维tensor


  • bias:每一个channel的bias,是一个维数等于out_channels的tensor


  • stride:一个数或者一个二元组(SH,SW),代表纵向和横向的步长


  • padding:一个数或者一个二元组(PH,PW ),代表纵向和横向的填充值


  • dilation:一个数,代表卷积核内部每个元素之间间隔元素的数目(不常用,默认为0)


  • groups:一个数,代表分组卷积时分的组数,特别的当groups = in_channel时,就是在做逐层卷积(depth-wise conv).


1.2 卷积函数的类实现


class torch.nn.Conv2d(in_channels, out_channels, kennel_size, stride=1, padding=0, dilation=1, groups=1, bias=true)


  • in_channels(int) 输入特征图的通道数


  • out_channels(int) 输出特征图的通道数


  • kenal_size(int or tuple) 卷积核大小


  • stride(int or tuple, optional) 卷积核的步长,默认为1


  • padding(int or tuple,optional) 输入的每一条边补充0的层数,默认为0


  • dilation(int or tuple, optional) 卷积核元素间的距离,默认为1


  • groups(int,optional)将原始输入通道划分成的组数,默认为1


  • bias(bool,optional) 默认为True,表示输出的bias可学习


1.3 两者区别


torch.nn.Conv2D是一个类,而torch.nn.functional.conv2d是一个函数,在Sequential里面只能放nn.xxx,而nn.functional.xxx是不能放入Sequential里面的。


nn.Module 实现的 layer 是由 class Layer(nn.Module) 定义的特殊类,nn.functional 中的函数是纯函数,由 def function(input) 定义。


nn.functional.xxx 需要自己定义 weight,每次调用时都需要手动传入 weight,而 nn.xxx 则不用。


1.4 卷积函数的操作步骤


20180322151813916.png


1.5 卷积操作的类型


1.5.1 窄卷积(vaild卷积)


即生成的特征图比原来的原始图片小。它的步长是可变的。假如,滑动步长为S,原始图片的维度为N1×N1。卷积核的大小为卷积后图像大小为[(N1-N2)/S + 1]。


1.5.2 同卷积(same卷积),


卷积后的图片尺寸与原始的一样大,同卷积的步长是固定的,滑动步长为1。一般操作时都要使用padding操作(在原始图片的外围补0,来确保生成的尺寸不变)。


1.5.3 全卷积(full卷积),也称反卷积,主要用作反卷积网络中,用于图像的恢复与还原。


将原始图片里面的每个像素点都用卷积操作展开。如图7-16所示,白色的块是原始图片,浅色的是卷积核,深色的是正在卷积操作的像素点。在全卷积操作的过程中,同样需要对原有图片进行padding操作,生成的结果会比原有的图片尺寸大。步长固定为1,卷积核的大小为卷积后图像大小为[N1-N2-1]


2 卷积函数的使用


2.1 定义卷积输入变量 --- CNN_New.py(第01部分)


import torch
### 1.1 定义输入变量
# [batch,in_channels,in_height,in_width]
# [训练时一个batch的图片数量,图像通道数,图片高度,图片宽度]
input1 = torch.ones([1,1,5,5])
input2 = torch.ones([1,2,5,5])
input3 = torch.ones([1,1,4,4])


2.2 验证卷积的补0规则 --- CNN_New.py(第02部分)


### 1.2 验证补0规则
# 设置padding为1,在输入数据上补1排0
padding1 = torch.nn.functional.conv2d(input1,torch.ones([1,1,1,1]),stride=1,padding=1)
print(padding1)
# 设置padding为1,在输入数据上补2行0
padding2 = torch.nn.functional.conv2d(input1,torch.ones([1,1,1,1]),stride=1,padding=(1,2))
print(padding2)


tensor([[[[0., 0., 0., 0., 0., 0., 0.],
          [0., 1., 1., 1., 1., 1., 0.],
          [0., 1., 1., 1., 1., 1., 0.],
          [0., 1., 1., 1., 1., 1., 0.],
          [0., 1., 1., 1., 1., 1., 0.],
          [0., 1., 1., 1., 1., 1., 0.],
          [0., 0., 0., 0., 0., 0., 0.]]]])
tensor([[[[0., 0., 0., 0., 0., 0., 0., 0., 0.],
          [0., 0., 1., 1., 1., 1., 1., 0., 0.],
          [0., 0., 1., 1., 1., 1., 1., 0., 0.],
          [0., 0., 1., 1., 1., 1., 1., 0., 0.],
          [0., 0., 1., 1., 1., 1., 1., 0., 0.],
          [0., 0., 1., 1., 1., 1., 1., 0., 0.],
          [0., 0., 0., 0., 0., 0., 0., 0., 0.]]]])


2.3 卷积核的定义 --- CNN_New.py(第03部分)


### 1.3 定义卷积核变量
# [out_channels,in_channels,filter_height,filter_width]
# [卷积核个数,图像通道数,卷积核的高度,卷积核的宽度
filter1 = torch.tensor([-1.0,0,0,-1]).reshape([1,1,2,2]) # 1通道输入和1通道输出的2X2矩阵
filter2 = torch.tensor([-1.0,0,0,-1,-1.0,0,0,-1]).reshape([2,1,2,2])# 1通道输入和2通道输出的2X2矩阵
filter3 = torch.tensor([-1.0,0,0,-1,-1.0,0,0,-1,-1.0,0,0,-1]).reshape([3,1,2,2])# 1通道输入和3通道输出的2X2矩阵
filter4 = torch.tensor([-1.0,0,0,-1,-1.0,0,0,-1,-1.0,0,0,-1,-1.0,0,0,-1]).reshape([2,2,2,2])# 2通道输入和2通道输出的2X2矩阵
filter5 = torch.tensor([-1.0,0,0,-1,-1.0,0,0,-1]).reshape([1,2,2,2]) # 2通道输入和1通道输出的2X2矩阵


2.4 卷积操作与其结果 --- CNN_New.py(第04部分)


### 1.4 卷积操作
## 1个通道输入,生成1个特征图(卷积核个数)
pl1 = torch.nn.functional.conv2d(input1,filter1,stride=2,padding=1)
print("p1",pl1)
## 1个通道输入,生成2个特征图(卷积核个数)
pl2 = torch.nn.functional.conv2d(input1,filter2,stride=2,padding=1)
print("p2",pl2)
## 1个通道输入,生成3个特征图(卷积核个数)
pl3 = torch.nn.functional.conv2d(input1,filter3,stride=2,padding=1)
print("p3",pl3)
## 2个通道输入,生成2个特征图(卷积核个数)
pl4 = torch.nn.functional.conv2d(input2,filter4,stride=2,padding=1)
print("p4",pl4)
## 2个通道输入,生成1个特征图(卷积核个数)====》对于卷积核对多通道输入的卷积处理,多通道的结果的叠加
pl5 = torch.nn.functional.conv2d(input2,filter5,stride=2,padding=1)
print("p5",pl5)
## padding不同,生成的结果也不同
pl6 = torch.nn.functional.conv2d(input1,filter1,stride=2,padding=0)
print("p6",pl6)


p1 tensor([[[[-1., -1., -1.],
          [-1., -2., -2.],
          [-1., -2., -2.]]]])
p2 tensor([[[[-1., -1., -1.],
          [-1., -2., -2.],
          [-1., -2., -2.]],
         [[-1., -1., -1.],
          [-1., -2., -2.],
          [-1., -2., -2.]]]])
p3 tensor([[[[-1., -1., -1.],
          [-1., -2., -2.],
          [-1., -2., -2.]],
         [[-1., -1., -1.],
          [-1., -2., -2.],
          [-1., -2., -2.]],
         [[-1., -1., -1.],
          [-1., -2., -2.],
          [-1., -2., -2.]]]])
p4 tensor([[[[-2., -2., -2.],
          [-2., -4., -4.],
          [-2., -4., -4.]],
         [[-2., -2., -2.],
          [-2., -4., -4.],
          [-2., -4., -4.]]]])
p5 tensor([[[[-2., -2., -2.],
          [-2., -4., -4.],
          [-2., -4., -4.]]]])
p6 tensor([[[[-2., -2.],
          [-2., -2.]]]])


Tip:多通道卷积的图解


e453cfe9c8284ba293182d26d0dfd04d.png


2.5 代码汇总


import torch
### 1.1 定义输入变量
# [batch,in_channels,in_height,in_width]
# [训练时一个batch的图片数量,图像通道数,图片高度,图片宽度]
input1 = torch.ones([1,1,5,5])
input2 = torch.ones([1,2,5,5])
input3 = torch.ones([1,1,4,4])
### 1.2 验证补0规则
# 设置padding为1,在输入数据上补1排0
padding1 = torch.nn.functional.conv2d(input1,torch.ones([1,1,1,1]),stride=1,padding=1)
print(padding1)
# 设置padding为1,在输入数据上补2行0
padding2 = torch.nn.functional.conv2d(input1,torch.ones([1,1,1,1]),stride=1,padding=(1,2))
print(padding2)
### 1.3 定义卷积核变量
# [out_channels,in_channels,filter_height,filter_width]
# [卷积核个数,图像通道数,卷积核的高度,卷积核的宽度
filter1 = torch.tensor([-1.0,0,0,-1]).reshape([1,1,2,2]) # 1通道输入和1通道输出的2X2矩阵
filter2 = torch.tensor([-1.0,0,0,-1,-1.0,0,0,-1]).reshape([2,1,2,2])# 1通道输入和2通道输出的2X2矩阵
filter3 = torch.tensor([-1.0,0,0,-1,-1.0,0,0,-1,-1.0,0,0,-1]).reshape([3,1,2,2])# 1通道输入和3通道输出的2X2矩阵
filter4 = torch.tensor([-1.0,0,0,-1,-1.0,0,0,-1,-1.0,0,0,-1,-1.0,0,0,-1]).reshape([2,2,2,2])# 2通道输入和2通道输出的2X2矩阵
filter5 = torch.tensor([-1.0,0,0,-1,-1.0,0,0,-1]).reshape([1,2,2,2]) # 2通道输入和1通道输出的2X2矩阵
### 1.4 卷积操作
## 1个通道输入,生成1个特征图(卷积核个数)
pl1 = torch.nn.functional.conv2d(input1,filter1,stride=2,padding=1)
print("p1",pl1)
## 1个通道输入,生成2个特征图(卷积核个数)
pl2 = torch.nn.functional.conv2d(input1,filter2,stride=2,padding=1)
print("p2",pl2)
## 1个通道输入,生成3个特征图(卷积核个数)
pl3 = torch.nn.functional.conv2d(input1,filter3,stride=2,padding=1)
print("p3",pl3)
## 2个通道输入,生成2个特征图(卷积核个数)
pl4 = torch.nn.functional.conv2d(input2,filter4,stride=2,padding=1)
print("p4",pl4)
## 2个通道输入,生成1个特征图(卷积核个数)====》对于卷积核对多通道输入的卷积处理,多通道的结果的叠加
pl5 = torch.nn.functional.conv2d(input2,filter5,stride=2,padding=1)
print("p5",pl5)
## padding不同,生成的结果也不同
pl6 = torch.nn.functional.conv2d(input1,filter1,stride=2,padding=0)
print("p6",pl6)
目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 PyTorch
【深度学习】使用PyTorch构建神经网络:深度学习实战指南
PyTorch是一个开源的Python机器学习库,特别专注于深度学习领域。它由Facebook的AI研究团队开发并维护,因其灵活的架构、动态计算图以及在科研和工业界的广泛支持而受到青睐。PyTorch提供了强大的GPU加速能力,使得在处理大规模数据集和复杂模型时效率极高。
112 59
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
卷积神经网络(CNN):视觉识别的革命先锋
卷积神经网络(CNN)作为人工智能领域的一颗璀璨明珠,在计算机视觉中发挥着核心作用。CNN的发展历程展现了从生物学灵感到技术创新的转变,历经LeNet-5至AlexNet、VGGNet、ResNet等里程碑式的进步。其独特结构包括卷积层、池化层及全连接层,能够层层递进地提取特征并作出决策。CNN不仅在图像分类、目标检测等领域表现卓越,还在人脸识别、医学影像分析等方面展现出巨大潜力。尽管存在局限性,如对序列数据处理能力有限及解释性问题,但通过引入注意力机制、自监督学习等方法,CNN将持续演进,引领人工智能技术走向更加精彩的未来。
26 2
|
6天前
|
机器学习/深度学习 PyTorch TensorFlow
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
29 1
|
6天前
|
机器学习/深度学习 人工智能 PyTorch
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
20 1
|
14天前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch代码实现神经网络
这段代码示例展示了如何在PyTorch中构建一个基础的卷积神经网络(CNN)。该网络包括两个卷积层,分别用于提取图像特征,每个卷积层后跟一个池化层以降低空间维度;之后是三个全连接层,用于分类输出。此结构适用于图像识别任务,并可根据具体应用调整参数与层数。
|
7天前
|
机器学习/深度学习 存储 自然语言处理
天啊!深度神经网络中 BNN 和 DNN 基于存内计算的传奇之旅,改写能量效率的历史!
【8月更文挑战第12天】深度神经网络(DNN)近年在图像识别等多领域取得重大突破。二进制神经网络(BNN)作为DNN的轻量化版本,通过使用二进制权重和激活值极大地降低了计算复杂度与存储需求。存内计算技术进一步提升了BNN和DNN的能效比,通过在存储单元直接进行计算减少数据传输带来的能耗。尽管面临精度和硬件实现等挑战,BNN结合存内计算代表了深度学习未来高效节能的发展方向。
16 1
|
6天前
|
机器学习/深度学习 自然语言处理 算法
基于卷积神经网络(CNN)的垃圾邮件过滤方法
传统的垃圾邮件过滤手段如规则匹配常因垃圾邮件的多变而失效。基于深度学习的方法,特别是卷积神经网络(CNN),能自动学习邮件中的复杂特征,有效识别垃圾邮件的新形态。CNN通过特征学习、处理复杂结构、良好的泛化能力和适应性,以及高效处理大数据的能力,显著提升了过滤精度。在文本分类任务中,CNN通过卷积层提取局部特征,池化层减少维度,全连接层进行分类,特别适合捕捉文本的局部模式和顺序信息,从而构建高效的垃圾邮件过滤系统。
25 0
|
14天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于CNN卷积神经网络的MPSK调制识别matlab仿真
本项目展示一种基于CNN的MPSK调制识别算法,可在Matlab 2022a上运行。该算法能自动区分BPSK、QPSK及8PSK信号,利用卷积层捕捉相位特征并通过全连接层分类。训练过程涉及调整网络权重以最小化预测误差,最终实现对未知信号的有效识别。附带完整代码与说明视频。
|
3天前
|
SQL 安全 网络安全
网络安全与信息安全:保护数字世界的基石
【8月更文挑战第16天】在数字化时代,网络安全与信息安全的重要性日益凸显。本文将深入探讨网络安全漏洞、加密技术以及安全意识等关键领域,旨在为读者提供全面的知识分享和实践指导。我们将从网络攻击的常见类型及其防御措施出发,进一步讨论加密技术在保障数据安全中的作用,并强调提升个人和企业的安全意识的必要性。通过分析真实案例,本文旨在帮助读者构建更加坚固的网络安全防线,共同守护我们的数字生活。
|
4天前
|
SQL 安全 网络安全
网络安全与信息安全:漏洞、加密技术与安全意识的探讨
【8月更文挑战第16天】在数字化时代,网络安全与信息安全成为维护社会稳定和保护个人隐私的重要议题。本文将深入探讨网络安全漏洞的成因、影响及防范措施,介绍加密技术的基本原理和应用,并强调提升公众的安全意识在构建网络防线中的重要性。通过分析当前网络安全面临的挑战,提出加强技术防护和提高用户安全意识的双重策略,旨在为读者提供全面的网络安全知识分享。
23 9

热门文章

最新文章