常规卷积,膨胀卷积,转置卷积之后的图像大小计算

1.概述

看了吴恩达老师的深度学习课程,里面有提到卷积网络的大小计算方式,就记录一下,顺便以pytorch代码实现验证一下。

2.普通卷积

记图像尺寸为 n ∗ n n*n nn,卷即核尺寸为 f ∗ f f*f ff,步长为 s s s,padding大小为 p p p,输出的尺寸大小为 ( n + 2 p − f s + 1 ) ∗ ( n + 2 p − f s + 1 ) {({{n+2p-f} \over s}+1 )}*{({{n+2p-f} \over s}+1 )} (sn+2pf+1)(sn+2pf+1)
n = 224 , f = 3 , s = 1 , p = 1 n=224,f=3,s=1,p=1 n=224,f=3,s=1,p=1
带入上式计算得输出尺寸 s i z e = 224 size=224 size=224
代码验证如下

import torch
import torch.nn as nn
class conv(nn.Module):
    def __init__(self, ch_in=3, ch_out=3):
        super(conv, self).__init__()
        self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1, bias=True)
    def forward(self, x):
        x = self.conv1(x)
        return x
t = conv()
a=torch.randn(32,3,224,224)
print(t(a).shape)
>>>torch.Size([32, 3, 224, 224])

n = 224 , f = 3 , s = 2 , p = 2 n=224,f=3,s=2,p=2 n=224,f=3,s=2,p=2
带入上式计算得输出尺寸 s i z e = 113.5 size=113.5 size=113.5
代码验证如下

import torch
import torch.nn as nn
class conv(nn.Module):
    def __init__(self, ch_in=3, ch_out=3):
        super(conv, self).__init__()
        self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=2, padding=2, bias=True)


    def forward(self, x):
        x = self.conv1(x)
        return x
t = conv()
a=torch.randn(32,3,224,224)
print(t(a).shape)
>>>torch.Size([32, 3, 113, 113])

这里需要注意的是像素是没有小数点的,所以在设计卷积层时要注意参数的设置

3.膨胀卷积

膨胀卷积是对卷积核进行0填充,参数dilation_rate(默认为1),会改变卷积核的大小,其他计算和普通卷积相同,卷积核的计算公式如下 k e r n e l _ s i z e = d i l a t i o n _ r a t e ∗ ( k e r n e l _ s i z e − 1 ) + 1 kernel\_size=dilation\_rate*(kernel\_size - 1)+1 kernel_size=dilation_ratekernel_size1+1
n = 224 , f = 3 , s = 1 , p = 1 , d i l a t i o n _ r a t e = 2 n=224,f=3,s=1,p=1,dilation\_rate=2 n=224,f=3,s=1,p=1,dilation_rate=2
代入公式计算 k e r n e l _ s i z e = 5 kernel\_size=5 kernel_size=5, s i z e = 222 size=222 size=222
代码验证如下

import torch
import torch.nn as nn
class conv(nn.Module):
    def __init__(self, ch_in=3, ch_out=3):
        super(conv, self).__init__()
        self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1,dilation=2, bias=True)
    def forward(self, x):
        x = self.conv1(x)
        return x
t = conv()
a=torch.randn(32,3,224,224)
print(t(a).shape)
>>>torch.Size([32, 3, 222, 222])

4.转置卷积

可以理解为把常规卷积的输入与输出交换下位置
计算公式为 s ∗ ( n − 1 ) + f − 2 p s*(n-1)+f-2p s(n1)+f2p
n = 5 , f = 3 , s = 2 , p = 0 n=5,f=3,s=2,p=0 n=5,f=3,s=2,p=0
代入计算的 s i z e = 11 size=11 size=11
代码验证

import torch
import torch.nn as nn
class conv(nn.Module):
    def __init__(self, ch_in=3, ch_out=3):
        super(conv, self).__init__()
        self.conv1 = nn.ConvTranspose2d(in_channels= ch_in,out_channels=ch_out,kernel_size=3,stride=2,padding=0)
    def forward(self, x):
        x = self.conv1(x)
        return x
t = conv()
a=torch.randn(32,3,5,5)
print(t(a).shape)
>>>torch.Size([32, 3, 11, 11])
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
转置卷积的输出尺寸计算可以通过以下公式来确定:输出尺寸 = (输入尺寸 - 1) * 步长 + 感受野大小 - 2 * padding 其中,输入尺寸是指原始输入的大小,步长是指卷积核在输入上滑动的步幅,感受野大小是指卷积核的大小,padding是指在输入周围填充的像素数。这个公式可以帮助我们计算转置卷积的输出尺寸。引用提供了关于转置卷积输入输出参数的推导过程,可以更详细地了解转置卷积计算公式和参数间的关系。引用中举了一个例子,通过已知的空洞卷积公式,可以计算转置卷积的输出尺寸。而引用则解释了转置卷积的作用和与普通卷积的联系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [转置卷积理论解释(输入输出大小分析)](https://blog.csdn.net/Dr_maker/article/details/125630089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [卷积输出尺寸转置卷积输出尺寸计算方式](https://blog.csdn.net/qq_34914551/article/details/89361957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值