deconv layer

ref: https://www.zhihu.com/question/43609045

      https://www.zhihu.com/question/48035421


上采样的卷积层有很多名字:全卷积(full convolution),网络内上采样( in-network upsampling),微步幅卷积(fractionally-strided convolution),反向卷积(backwards convolution),去卷积(deconvolution),上卷积(upconvolution),以及转置卷积(transposed convolution)。用「去卷积」这个术语是非常不推荐的,因为这是一个过载的术语:在数学运算或计算机视觉中的其他应用有着完全不同的含义。


matlab conv参数有三种:valid/same/full

full: 只要有overlap就可以卷积

valid: kernel必须全部cover在features map上,不加padding会导致features map变小

same: 设置初始卷积位置,使得生成的feature map和原始feature map大小一样。


deconv: stride=1: 相当于matlab full conv

             stride=2: 则先在feature map两两元素之间插入1个0,再卷积,卷积核的中心必须在插完0后的feature map上。此时卷积核为k*k,相当于pad=(k-1)/2


output feature map大小计算:

conv: output = (input + 2*pad - kernel)/stride+1

deconv: output = (input - 1) * stride + kernel - 2*pad





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以将这段代码拆分成以下两个类: 1. DeconvLayer(nn.Module):此类用于实现ConvTranspose2d、BatchNorm2d和ReLU激活函数的组合,即一层上采样层。其构造函数需要传入in_channels、out_channels、kernel_size、stride、padding、output_padding和bn_momentum等参数。 2. ResNet50Decoder(nn.Module):此类用于实现ResNet50的解码器部分,即利用DeconvLayer对ResNet50的特征图进行上采样,得到最终的输出结果。其构造函数需要传入inplanes和bn_momentum等参数。 以下是代码示例: ```python class DeconvLayer(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride, padding, output_padding, bn_momentum=0.1, bias=False): super(DeconvLayer, self).__init__() self.conv_transpose = nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride, padding, output_padding, bias=bias) self.bn = nn.BatchNorm2d(out_channels, momentum=bn_momentum) self.relu = nn.ReLU(inplace=True) def forward(self, x): x = self.conv_transpose(x) x = self.bn(x) x = self.relu(x) return x class ResNet50Decoder(nn.Module): def __init__(self, inplanes, bn_momentum=0.1): super(ResNet50Decoder, self).__init__() self.bn_momentum = bn_momentum self.inplanes = inplanes self.deconv_with_bias = False self.deconv_layers = self._make_deconv_layer( num_layers=3, num_filters=[256, 128, 64], num_kernels=[4, 4, 4], ) def _make_deconv_layer(self, num_layers, num_filters, num_kernels): layers = [] for i in range(num_layers): kernel = num_kernels[i] planes = num_filters[i] layers.append(DeconvLayer( in_channels=self.inplanes, out_channels=planes, kernel_size=kernel, stride=2, padding=1, output_padding=0, bn_momentum=self.bn_momentum, bias=self.deconv_with_bias )) self.inplanes = planes return nn.Sequential(*layers) def forward(self, x): return self.deconv_layers(x) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值