深度学习(八)——神经网络:卷积层

深度,学习,神经网络,卷积 · 浏览次数 : 54

小编点评

**卷积层** **简介** 卷积层是图像处理中的一个重要操作,它可以用于提取图像中的特征并构建更加复杂的模型。 **参数** * `in_channels`:输入图像的通道数。 * `out_channels`:输出图像的通道数。 * `kernel_size`:卷积核的尺寸,这是一个数或元组,表示卷积核的大小。 * `stride`:卷积步幅,是一个数或元组,表示卷积核的步幅。 * `padding`:卷积填充的范围,是一个数或元组,表示对图像边缘进行填充的范围。 * `dilation`:空洞卷积的空洞大小,是一个数或元组。 * `groups`:分组卷积的组数,是一个整数。 * `bias`:是否添加一个常数到输出值中。 **示例** ```python # 创建一个卷积层 conv = ConvolutionLayer(3, 6, kernel_size=(3, 3), padding=(1, 1)) # 使用卷积层处理图像 image = torch.randn(10, 3, 32, 32) output = conv(image) ``` **用途** 卷积层可以用于: * 图像分类 * 图像识别 * 视频分析 **注意** * 卷积层通常与其他神经网络层一起使用。 * 卷积层在训练模型之前需要初始化。 * 卷积层的输出是一个具有相同大小的矩阵。

正文

一、卷积层Convolution Layers函数简介

官网网址:torch.nn.functional — PyTorch 2.0 documentation

由于是图像处理,所以主要介绍Conv2d。

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
  • 参数解释可见上一篇笔记

  • in_channels(int): 输入图像的通道数,彩色图像一般为3(RGB三通道)

  • out_channel(int): 通过卷积后,产生的输出的通道数

  • kernel_size(int or tuple): 一个数或者元组,定义卷积大小。如kernel_size=3,即定义了一个大小为3×3的卷积核;kernel_size=(1,2),即定义了一个大小为1×2的卷积核。

  • stride(int or tuple,可选): 默认为1,卷积核横向、纵向的步幅大小

  • padding(int or tuple,可选): 默认为0,对图像边缘进行填充的范围

  • padding_mode(string,可选): 默认为zeros,对图像周围进行padding时,采取什么样的填充方式。可选参数有:'zeros''reflect''replicate' or 'circular'

  • dilation(int or tuple,可选): 默认为1,定义在卷积过程中,它的核之间的距离。这个我们称之为空洞卷积,但不常用。

  • groups(int or tuple,可选): 默认为1。分组卷积,一般都设置为1,很少有改动

  • bias(bool,可选): 默认为True。偏置,常年设置为True。代表卷积后的结果是否加减一个常数。

关于卷积操作,官方文档的解释如下:

In the simplest case, the output value of the layer with input size \((N,C_{in}​,H,W) \)and output\( (N,C_{out}​,H_{out}​,W_{out}​)\) can be precisely described as:

\[out(N_i​,Cou_{tj}​​)=bias(C_{out_j}​​)+∑_{k=0}^{C_{in}​−1}​weight(C_{out_j}​​,k)⋆input(N_i​,k) \]

where ⋆ is the valid 2D cross-correlation operator, \(N\) is a batch size, \(C \)denotes a number of channels, \(H\) is a height of input planes in pixels, and \(W\) is width in pixels.

(1)参数kernel_size的说明

  • kernel_size主要是用来设置卷积核大小尺寸的,给定模型一个kernel_size,模型就可以据此生成相应尺寸的卷积核。

  • 卷积核中的参数从图像数据分布中采样计算得到的。

  • 卷积核中的参数会通过训练不断进行调整。

(2)参数out_channel的说明

  • 如果输入图像in_channel=1,并且只有一个卷积核,那么对于卷积后产生的输出,其out_channel也为1
  • 如果输入图像in_channel=2,此时有两个卷积核,那么在卷积后将会输出两个矩阵,把这两个矩阵当作一个输出,此时out_channel=2

二、实例讲解

使用CIFAR中的图像数据,对Conv2d进行讲解

import torch
from  torch import nn
import torchvision
from torch.utils.data import DataLoader
from torch.nn import Conv2d
from torch.utils.tensorboard import SummaryWriter

#导入图像数据
dataset=torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
#打包数据
dataloder=DataLoader(dataset,batch_size=64)

#搭建神经网络
class Demo(nn.Module):
    def __init__(self):
        super().__init__()

        #导入图像为彩色,所以in_chennel=3;输出我们可以试试out_chennel=6;kernel_size=3(进行3×3的卷积),stride和padding均使用默认值1和0
        self.conv1=Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)    #self.conv1为一个卷积层,Conv2d是建立卷积层的函数

    def forward(self,x):
        x = self.conv1(x)  #将输入的x放进卷积层self.conv1中,然后返回得到的值(即输出的x)
        return x

demo=Demo()
print(demo)
"""
[Run]
Demo(
  (conv1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1))
)

[解读]
就是Demo中有一个卷积层conv1,输入3通道图像,输出6通道图像。卷积核大小为3×3,步幅为1×1
"""

#将每张图像放入神经网络中,并查看大小
for data in dataloder:
    imgs,targets=data  #获取打包好的图像
    output=demo(imgs)  #将图像数据放入神经网络中,经过forward函数进行卷积操作
    print(imgs.shape) #举例其中一个结果:[Run] torch.Size([64, 3, 30, 30]),即第10行中batch_size=64,in_channel为6通道,32×32
    print(output.shape)  #举例其中一个结果:[Run] torch.Size([64, 6, 30, 30]),即第10行中batch_size=64,out_channel为6通道,卷积操作后尺寸变为30×30

#更直观地对处理前后图像进行可视化
writer=SummaryWriter("nn_logs")

step=0
for data in dataloder:
    imgs,targets=data
    output=demo(imgs)
    #torch.Size([64, 3, 32, 32])
    writer.add_images("input",imgs,step)

    #torch.Size([64, 6, 30, 30])
    #由于通道数为6,add_images不知道如何显示,所以用一个不太严谨的方法,reshape一下图像,变为[xxx,3,30,30],多余的像素放在batch_size里面
    output=torch.reshape(output,(-1,3,20,30))  #由于第一个值不知道是多少,所以写-1,它会根据后面的值去计算
    writer.add_images("output",output,step)
    step+=1
  • 结果中图像的尺寸变小,如果要使图像尺寸不变,可以考虑用padding进行填充

需要注意的是,要完全在网页上显示图像,打开路径时代码要变成:

tensorboard --logdir=路径 --samples_per_plugin=images=1000

三、图像输入输出尺寸转化计算公式

参数说明:

  • \(N:\) 图像的batch_size

  • \(C:\) 图像的通道数

  • \(H:\) 图像的高

  • \(W:\) 图像的宽

计算过程:

  • Input: \((N,C_{in}​,H_{in}​,W_{in}​) or (C_{in}​,H_{in}​,W_{in}​)\)

  • Output: \((N,C_{out}​,H_{out}​,W_{out}​) or (C_{out}​,H_{out}​,W_{out}​)\)

    • 其中有:

      \(H_{out}​=⌊\frac{H_{in}​+2×padding[0]−dilation[0]×(kernel\_size[0]−1)−1​}{stride[0]}+1⌋\)

      \(W_{out}​=⌊\frac{W_{in}​+2×padding[1]−dilation[1]×(kernel\_size[1]−1)−1​}{stride[1]}+1⌋\)

看论文的时候,有些比如像padding这样的参数不知道,就可以用这条公式去进行推导

与深度学习(八)——神经网络:卷积层相似的内容:

深度学习(八)——神经网络:卷积层

主要介绍神经网络中的卷积层操作,包括构建卷积层、处理图像、可视化

算法金 | 读者问了个关于深度学习卷积神经网络(CNN)核心概念的问题

​大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 读者问了个关于卷积神经网络核心概念的问题,如下, 【问】神经元、权重、激活函数、参数、图片尺寸,卷积层、卷积核,特征图,平均池化,全家平均池化,全连接层、隐藏层,输出层 【完整问题】神

基于深度卷积神经网络的时间序列图像分类,开源、低功耗、低成本的人工智能硬件提供者

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 卷积神经网络(CNN)通过从原始数据中自动学习层次特征表示,在图像识别任务中取得了巨大成功。虽然大多数时间序列分类(TSC)文献都集中在1D信号上,但本文使用递归图(RP)将时间序列转换为2D纹理

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

关于torch.nn.functional操作的深入理解,主要介绍卷积计算过程。

深度学习项目-MobileNetV2水果识别模型

本项目旨在研究利用深度学习模型进行水果图像分类的方法,具体包括两个主要任务:一是使用卷积神经网络(CNN)模型进行水果图片的分类,二是探索轻量级神经网络模型MobileNetV2在水果图像分类中的应用。

使用小波分析和深度学习对心电图 (ECG) 进行分类 mcu-ai低成本方案 mcu-ai低成本方案

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 此示例说明如何使用连续小波变换 (CWT) 和深度卷积神经网络 (CNN) 对人体心电图 (ECG) 信号进行分类。 从头开始训练深度 CNN 的计算成本很高,并且需要大量的训练数据。在很多应用中

深度学习(六)——神经网络的基本骨架:nn.Module的使用

终于卷到神经网络了 ...(˘̩̩̩ε˘̩ƪ)

深度学习(九)——神经网络:最大池化的作用

主要介绍神经网络中的最大池化操作,以及最大池化的作用

深度学习(十)——神经网络:非线性激活

主要介绍了ReLU和Sigmiod两种非线性激活函数,以及在神经网络中进行非线性转换的目的。

构建基于深度学习神经网络协同过滤模型(NCF)的视频推荐系统(Python3.10/Tensorflow2.11)

毋庸讳言,和传统架构(BS开发/CS开发)相比,人工智能技术确实有一定的基础门槛,它注定不是大众化,普适化的东西。但也不能否认,人工智能技术也具备像传统架构一样“套路化”的流程,也就是说,我们大可不必自己手动构建基于神经网络的机器学习系统,直接使用深度学习框架反而更加简单,深度学习可以帮助我们自动地从原始数据中提取特征,不需要手动选择和提取特征。