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

本文深入解析卷积神经网络中输出尺寸的计算方法,包括普通卷积、膨胀卷积及转置卷积,并通过PyTorch代码进行验证。文中详细介绍了不同卷积类型在设置特定参数时的输出尺寸变化,对理解深度学习模型结构有重要帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

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

2.普通卷积

记图像尺寸为n∗nn*nnn,卷即核尺寸为f∗ff*fff,步长为sss,padding大小为ppp,输出的尺寸大小为(n+2p−fs+1)∗(n+2p−fs+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=1n=224,f=3,s=1,p=1n=224,f=3,s=1,p=1
带入上式计算得输出尺寸size=224size=224size=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=2n=224,f=3,s=2,p=2n=224,f=3,s=2,p=2
带入上式计算得输出尺寸size=113.5size=113.5size=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),会改变卷积核的大小,其他计算和普通卷积相同,卷积核的计算公式如下kernel_size=dilation_rate∗(kernel_size−1)+1kernel\_size=dilation\_rate*(kernel\_size - 1)+1kernel_size=dilation_ratekernel_size1+1
n=224,f=3,s=1,p=1,dilation_rate=2n=224,f=3,s=1,p=1,dilation\_rate=2n=224,f=3,s=1,p=1,dilation_rate=2
代入公式计算kernel_size=5kernel\_size=5kernel_size=5,size=222size=222size=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−2ps*(n-1)+f-2ps(n1)+f2p
n=5,f=3,s=2,p=0n=5,f=3,s=2,p=0n=5,f=3,s=2,p=0
代入计算的size=11size=11size=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])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值