神经网络卷积反卷积及池化计算公式、特征图通道数(维度)变化实例

这篇具有很好参考价值的文章主要介绍了神经网络卷积反卷积及池化计算公式、特征图通道数(维度)变化实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

卷积神经网络,要特别注意输入图像的尺寸,如果想套用某个网络结构,需要先通过网络结构计算出输入图像尺寸,将自己的图像调整为所需要的尺寸;也可以根据自己的图像尺寸适当调整网络结构。以下是具体操作方法。

目录

一,要想计算图像尺寸,先要了解基础卷积等计算公式

二,了解神经网络的网络结构

三,举例分析一下代码的输出尺寸

四,获取每一层的输出张量


一,要想计算图像尺寸,先要了解基础卷积等计算公式


1.计算公式
设:
图像宽为W,高为H,通道数为C;
卷积核尺寸为K,通道数为D,个数为N;
卷积运算步长为S,0填充大小为P;
输入和输出量分别以1和2表示。

卷积:
W2 = (W1 - K + 2×P) / S + 1
H2 = (H1 - K + 2×P) / S + 1
C2 = N

反卷积:
W2 = (W1-1) × S + K - 2×P
H2 = (H2-1) × S + K - 2×P
C2 = N

池化:
W2 = (W1 - K) / S + 1.
H2 = (H1 - K) / S + 1.
C2 = C1

上采样UpSampling2D:

上采样相当于放大多少倍,size=倍数

Width_out=W*size

Height_out=H*size

卷积、反卷积和池化操作均可改变图像尺寸大小,但池化操作不会改变图像的通道数,而卷积与反卷积通常会改变图像的通道数。

2.特征图通道数(维度)变化
经过卷积运算输出的特征图通道数仅由卷积核的个数决定,随各卷积层中卷积核的个数变化而变化,即C2=N,例如32×32×3经过5个5×5×3的卷积核运算后输出的特征图通道数即为5,如28×28×5。

3.卷积核大小与深度
卷积核通道数
卷积核的通道数只与输入图像的通道数有关,在进行卷积运算时,要求用于运算的卷积核的通道数应与输入图像的通道数一致,即D=C1,例如对32×32×3大小的输入图像进行卷积计算,卷积核通道数也为3,如5×5×3;

卷积核深度
卷积核深度就是卷积核的个数,每个卷积核中各通道与输入图像各通道相对应,所有通道同时分别进行运算,然后形成输出特征图其中的一个通道,多个卷积核运算后便形成多个通道,因此卷积核的深度也就是输出图像的通道数。
再结合上一条,则卷积核的深度同时也决定了下一卷积层中卷积核的通道数,因为本卷积层输出图像就是下一层的输入图像

二,了解神经网络的网络结构

例:
 

class ConvNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 1,28x28
        self.conv1=nn.Conv2d(1,10,5) # 24x24
        self.pool = nn.MaxPool2d(2,2) # 12x12
        self.conv2=nn.Conv2d(10,20,3) # 10x10
        self.fc1 = nn.Linear(20*10*10,500)
        self.fc2 = nn.Linear(500,10)
    def forward(self,x):
        in_size = x.size(0)
        out = self.conv1(x) #24
        out = F.relu(out)
        out = self.pool(out)  #12
        out = self.conv2(out) #10
        out = F.relu(out)
        out = out.view(in_size,-1)
        out = self.fc1(out)
        out = F.relu(out)
        out = self.fc2(out)
        out = F.log_softmax(out,dim=1)
        return out
在写代码时,可以将每一层的输入输出尺寸标注出来,以便之后修改等。
Conv2d、max_pool2d的参数:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, 
dilation=1, groups=1, bias=True)

in_channels:输入通道数
out_channels:输出通道数(卷积核的个数)
kernel_size:卷积核的尺寸
stride:卷积步长(默认值为1)
padding:输入在每一条边补充0的层数(默认不补充)
dilation:卷积核元素之间的间距(默认值为1)
groups:从输入通道到输出通道的阻塞连接数(默认值是1)
bias:是否添加偏置(默认是True)


 

torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)


kernel_size:池化的窗口大小
stride:窗口移动的步长,默认值是kernel_size
padding:输入的每一条边补充0的层数
dilation:一个控制窗口中元素步幅的参数
return_indices:如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助
ceil_mode:如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作

三,举例分析一下代码的输出尺寸

class ConvNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 1,28x28
        self.conv1=nn.Conv2d(1,10,5) # 24x24
        self.pool = nn.MaxPool2d(2,2) # 12x12
        self.conv2=nn.Conv2d(10,20,3) # 10x10
        self.fc1 = nn.Linear(20*10*10,500)
        self.fc2 = nn.Linear(500,10)
   def forward(self,x):
        in_size = x.size(0)
        out = self.conv1(x) #24
        out = F.relu(out)
        out = self.pool(out)  #12
        out = self.conv2(out) #10
        out = F.relu(out)
        out = out.view(in_size,-1)
        out = self.fc1(out)
        out = F.relu(out)
        out = self.fc2(out)
        out = F.log_softmax(out,dim=1)
        return out


读别人已写好的代码时,要结合前向传播的结构来分析,不能只看代码的上面部分,可能还含有其他能改变图像尺寸的结构
在上述代码中,只有以下代码部分会改变输出图像尺寸大小。

       # 1,28x28
        self.conv1=nn.Conv2d(1,10,5) # 24x24
        self.pool = nn.MaxPool2d(2,2) # 12x12
        self.conv2=nn.Conv2d(10,20,3) # 10x10
        self.fc1 = nn.Linear(20*10*10,500)
        self.fc2 = nn.Linear(500,10)


假设输入图像尺寸为28x28
第一层卷积卷积核尺寸大小为5x5,步长为1。所以输出图像尺寸:1+(28-5)/1=24
即代码第二行注释标注:经过第一层卷积层后,输出图像尺寸变为24x24
同理,在池化层,池化窗口大小为2x2,移动步长为2,所以经过池化层后,输出图像尺寸变为12x12
第二层卷积尺寸大小为3x3,步长为1,所以输出图像尺寸:1+(12-3)/1=10
经过第二层卷积后,输出图像尺寸为10x10,输出维度为20,所以全连接层的输入固定为201010
所以此网络只接受输入图像尺寸为28x28。
如果,不想改变输入图像的尺寸,可以通过以上步骤,计算出全连接层的输入,适当改变神经网络结构,已达到理想的效果。
现在很多卷积神经网络模型,都用卷积层替代全连接层,就是因为这个原因。因为全连接层的参数的尺寸与输入图像的尺寸有关,故输入图像尺寸改变,模型参数初始化尺寸亦改变。若采用卷积层替代全连接层,则输入图像尺寸改变,模型不用做任何改变。

四,获取每一层的输出张量

在神经网络中,查看每一层输出的图片维度可以帮助我们更好地理解网络的结构和运作。

例如:

outputs = self.conv2(outputs)
print("Shape of conv2 weight tensor:", self.conv2.weight.shape)

outputs = self.relu(outputs)
print("Shape of outputs tensor:", outputs.shape)

神经网络卷积层和池化层输出维度的确定,机器学习,深度学习,计算机视觉,opencv,神经网络

在相应的代码下使用直接输出张量形状

另一种常见的方法是使用钩子函数(hook functions),在前向计算过程中获取每一层的输出张量,并打印其形状信息。

在 PyTorch 中,可以使用 register_forward_hook() 方法注册钩子函数,来获取每一层的输出张量。具体操作如下:

1.定义钩子函数,获取输出张量的形状信息,并打印出来:

def print_shape(module, input, output):
    print('输出张量形状:', output.shape)

2.注册钩子函数,将其绑定到网络的每一层上:

# 遍历网络模型的每一层,将钩子函数注册到每一层上
for name, module in model.named_modules():
    handle = module.register_forward_hook(print_shape)

将输入数据 x 传递给模型进行前向计算,观察每一层输出张量的形状信息:


3.将输入数据传递给模型进行前向计算

output = model(x)
需要注意的是,钩子函数会在每一次前向计算时被调用,因此可能会产生大量的输出信息。为了避免输出信息过多,可以在钩子函数中添加一些条件判断,只打印特定层的输出张量信息,或者只在特定的迭代次数或轮数时打印输出信息。另外,如果网络模型非常复杂,可能需要更加细致地设置钩子函数,以便观察每一层的输出张量信息。文章来源地址https://www.toymoban.com/news/detail-772086.html

到了这里,关于神经网络卷积反卷积及池化计算公式、特征图通道数(维度)变化实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 卷积神经网络(CNN)之卷积操作、池化操作、激活函数

    前言:卷积神经网络是深度学习算法中一个重要组成部分,在深度学习图像识别技术的应用中起到了关键作用。卷积神经网络和循环神经网络(RNN)都是类似于传统的全连接神经网络(也叫深度神经网络,简称DNN),CNN属于编码了空间相关性的DNN,RNN属于编码了时间相关性的DNN。由

    2024年02月04日
    浏览(37)
  • 卷积神经网络中的卷积层、池化层、全连接层、softmax

    卷积层的作用是提取输入图片中的信息,这些信息被称为图像特征,这些特征是由图像中的每个像素通过组合或者独立的方式所体现,比如图片的纹理特征,颜色特征。 卷积操作类似于数学中的卷积,但是更加简单,计算机和我们看到的图像不一样,计算机看到的图像其实就

    2024年02月09日
    浏览(42)
  • 【深度学习】神经网络和深度学习--卷积和池化的作用

    深度学习通常指训练大型深度的神经网络的过程。 与传统的神经网络模型相比,深度学习模型在结构上与之非常相似; 不同的是,深度学习模型的“深度”更大,“深度”的体现就是神经网络层数多,神经网络每一层的结点数多。 本章介绍两种深度神经网络——卷积神经网

    2024年02月16日
    浏览(51)
  • 图解神经网络:卷积、池化、全连接(通道数问题、kernel与filter的概念)

    卷积操作 这个不难理解。我们知道图像在计算机中是由一个个的像素组成的,可以用矩阵表示。 假设一个5x5的输入图像,我们定义一个3x3的矩阵(其中的数值是随机生成的) 然后我们拿这个卷积核,在输入图像里面,选定左上角那个3x3的矩阵,用卷积核与这个矩阵对应的位

    2024年02月09日
    浏览(36)
  • 【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)

    卷积神经网络(convolutional neural network, CNN)在提出之初被成功应用于手写字符图像识别,2012年的AlexNet网络在图像分类任务中取得成功,此后,卷积神经网络发展迅速,现在已经被广泛应用于图形、图像、语音识别等领域。 图片的像素数往往非常大,如果用多层全连接网络来

    2024年02月08日
    浏览(43)
  • 神经网络必备基础知识:卷积、池化、全连接(通道数问题、kernel与filter的概念)

    这个不难理解。我们知道图像在计算机中是由一个个的像素组成的,可以用矩阵表示。 假设一个5x5的输入图像,我们定义一个3x3的矩阵(其中的数值是随机生成的) 然后我们拿这个卷积核,在输入图像里面,选定左上角那个3x3的矩阵,用卷积核与这个矩阵对应的位置相乘,

    2024年02月05日
    浏览(59)
  • 【探索AI】十八 深度学习之第3周:卷积神经网络(CNN)(二)-常见的卷积层、池化层与全连接层

    卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,特别适用于处理图像相关的任务。CNN通过模拟人脑视觉皮层的层次化结构,实现了对图像的高效特征提取和分类。下面将详细介绍CNN的基本原理和结构,包括卷积层、池化层和全连接层的作用和位置。 卷积层

    2024年04月16日
    浏览(45)
  • 计算机视觉-卷积神经网络

    目录 计算机视觉的发展历程 卷积神经网络 卷积(Convolution) 卷积计算 感受野(Receptive Field) 步幅(stride) 感受野(Receptive Field) 多输入通道、多输出通道和批量操作 卷积算子应用举例 计算机视觉作为一门让机器学会如何去“看”的学科,具体的说,就是让机器去识别摄

    2024年02月10日
    浏览(46)
  • 7.卷积神经网络与计算机视觉

    计算机视觉是一门研究如何使计算机识别图片的学科,也是深度学习的主要应用领域之一。 在众多深度模型中,卷积神经网络“独领风骚”,已经被称为计算机视觉的主要研究根据之一。 卷积神经网络最初由 Yann LeCun(杨立昆)等人在1989年提出,是最初取得成功的深度神经

    2024年04月10日
    浏览(79)
  • 计算机视觉:深层卷积神经网络的构建

    上一节课程中我们学习了单卷积层的前向传播,本次课程我们构建一个具有三个卷积层的卷积神经网络,然后从输入(39*39*3)开始进行三次卷积操作,我们来看一下每次卷积的输入和输出维度的变化。 第一层使用3*3*3的过滤器来提取特征,那么f[1]=3,然后步长s[1]=1,填充p[1]

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包