在Pytorch中实现SeparableConv2D

叮当声

主要目标

具有SeparableConv2D的PyTorch等效项padding = 'same'

from tensorflow.keras.layers import SeparableConv2D
x = SeparableConv2D(64, (1, 16), use_bias = False, padding = 'same')(x)

SeparableConv2D的PyTorch等效项是什么?

消息来源说:

如果groups = nInputPlane,kernel =(K,1),(并且之前是具有groups = 1和kernel =(1,K)的Conv2d层),则它是可分离的。

虽然此消息说:

其核心思想是将完整的卷积酸分解为两步计算:深度卷积和点积。

这是我的尝试:

class SeparableConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, depth, kernel_size, bias=False):
        super(SeparableConv2d, self).__init__()
        self.depthwise = nn.Conv2d(in_channels, out_channels*depth, kernel_size=kernel_size, groups=in_channels, bias=bias)
        self.pointwise = nn.Conv2d(out_channels*depth, out_channels, kernel_size=1, bias=bias)

    def forward(self, x):
        out = self.depthwise(x)
        out = self.pointwise(out)
        return out

这个对吗?这等于tensorflow.keras.layers.SeparableConv2D吗?

padding = 'same'

这样做时如何确保我的输入和输出大小相同?

我的尝试:

x = F.pad(x, (8, 7, 0, 0), )

因为内核大小为(1,16),所以我分别添加了左填充和右填充(分别为8和7)。这是正确的方法(也是最好的方法)padding = 'same'吗?如何将其放置在我的SeparableConv2d班级中,并根据给定的输入数据维度大小即时计算?

全部一起

class SeparableConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, depth, kernel_size, bias=False):
        super(SeparableConv2d, self).__init__()
        self.depthwise = nn.Conv2d(in_channels, out_channels*depth, kernel_size=kernel_size, groups=in_channels, bias=bias)
        self.pointwise = nn.Conv2d(out_channels*depth, out_channels, kernel_size=1, bias=bias)

    def forward(self, x):
        out = self.depthwise(x)
        out = self.pointwise(out)
        return out


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.separable_conv = SeparableConv2d(
            in_channels=32, 
            out_channels=64, 
            depth=1, 
            kernel_size=(1,16)
        )
        
    def forward(self, x):
        x = F.pad(x, (8, 7, 0, 0), )
        x = self.separable_conv(x)
        return x

这些代码有问题吗?

爱伦坡

链接的定义大体上是一致的。最好的是在文章中

  • “ Depthwise”(由于不涉及深度,所以不是一个非常直观的名称)-是一系列常规2d卷积,仅分别应用于数据层。-“逐点”Conv2d与1x1内核相同

我建议对您的SeparableConv2d班级进行一些更正

  • 无需使用深度参数-与out_channels相同
  • 我将padding设置为1以确保与输出大小相同kernel=(3,3)如果内核大小不同,请使用与常规Conv2d相同的原理相应地调整填充。您的示例类Net()不再需要-填充在中完成SeparableConv2d

这是更新的代码,应类似于tf.keras.layers.SeparableConv2D实现:

class SeparableConv2d(nn.Module):

def __init__(self, in_channels, out_channels, kernel_size, bias=False):
    super(SeparableConv2d, self).__init__()
    self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size=kernel_size, 
                               groups=in_channels, bias=bias, padding=1)
    self.pointwise = nn.Conv2d(in_channels, out_channels, 
                               kernel_size=1, bias=bias)

def forward(self, x):
    out = self.depthwise(x)
    out = self.pointwise(out)
    return out

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PyTorch中如何实现Conv2d的算法

来自分类Dev

如何在pytorch中实现Conv2d的棋盘大步?

来自分类Dev

在Pytorch中测试LSTM的实现

来自分类Dev

Pytorch设计选择中的LSTM单元实现

来自分类Dev

如何在PyTorch中合并2D卷积?

来自分类Dev

如何从Pytorch的2D张量列表中获取列

来自分类Dev

c ++中的rfftw2d_create_plan实现

来自分类Dev

MATLAB中的2D离散傅立叶变换实现

来自分类Dev

2D Fourier Transform实现中的错误

来自分类Dev

在Pygame中的2D空间中实现平滑运动

来自分类Dev

C ++中的2D网格类实现

来自分类Dev

如何在MIPS中实现2D阵列

来自分类Dev

MATLAB中的2D离散傅立叶变换实现

来自分类Dev

在Qt中实现滑动实时2D图

来自分类Dev

如何在2D画布中实现缩放功能?

来自分类Dev

在Python中实现2D离散余弦变换的问题

来自分类Dev

如何在Pytorch中实现辍学以及在何处应用

来自分类Dev

如何在pytorch中实现低维嵌入层

来自分类Dev

尝试使用Java2D在平铺的2D等距环境中实现动态照明

来自分类Dev

播放2中的CSRFFilter实现

来自分类Dev

在AngularJS 2中实现路由

来自分类Dev

pytorch conv2d配重

来自分类Dev

用更少的内存在C ++中实现2d数组

来自分类Dev

如何在Rust中的结构内实现动态2D数组?

来自分类Dev

如何使用Cocos2d-x在Lua中实现此模式

来自分类Dev

Cococs2d-x键盘实现

来自分类Dev

Cococs2d-x键盘实现

来自分类Dev

从类C ++实现2D矩阵

来自分类Dev

PyTorch如何实现向后卷积?