Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Pytorch中实现SeparableConv2D 主要目标_Python_Tensorflow_Pytorch_Conv Neural Network_Convolution - Fatal编程技术网

Python 在Pytorch中实现SeparableConv2D 主要目标

Python 在Pytorch中实现SeparableConv2D 主要目标,python,tensorflow,pytorch,conv-neural-network,convolution,Python,Tensorflow,Pytorch,Conv Neural Network,Convolution,带填充='same'的SeparableConv2D的PyTorch等效物: 从tensorflow.keras.layers导入SeparableConv2D x=SeparableConv2D(64,(1,16),使用_bias=False,padding=same')(x) 对于SeparableConv2D,Pytork的等效值是多少? 上面说: 如果groups=nInputPlane,kernel=(K,1),(和before是一个Conv2d层,groups=1,kernel=(

填充='same'
的SeparableConv2D的PyTorch等效物:

从tensorflow.keras.layers导入SeparableConv2D
x=SeparableConv2D(64,(1,16),使用_bias=False,padding=same')(x)
对于SeparableConv2D,Pytork的等效值是多少? 上面说:

如果groups=nInputPlane,kernel=(K,1),(和before是一个Conv2d层,groups=1,kernel=(1,K)),那么它是可分离的

虽然这表示:

它的核心思想是将一个完整的卷积酸分解为两步计算,深度卷积和逐点卷积

这是我的尝试:

x = F.pad(x, (8, 7, 0, 0), )
类可分离组件V2D(nn.模块):
def uuu init uuuuu(自、输入通道、输出通道、深度、内核大小、偏差=False):
super(SeparableConv2d,self)。\uuuu init\uuuu()
self.depthwise=nn.Conv2d(输入通道,输出通道*深度,内核大小=内核大小,组=输入通道,偏差=偏差)
self.pointwise=nn.Conv2d(输出通道*深度,输出通道,内核大小=1,偏差=bias)
def前进(自身,x):
out=自深(x)
out=自定点(out)
返回
这是正确的吗?这是否等同于tensorflow.keras.layers.SeparableConv2D

填充='相同'怎么样? 在执行此操作时,如何确保输入和输出大小相同

我的尝试:

x = F.pad(x, (8, 7, 0, 0), )
因为内核大小是
(1,16)
,所以我添加了左填充和右填充,分别为8和7。这是实现
填充='same'
的正确方法(也是最好的方法)吗?如何将其放入我的
SeparableConv2d
类中,并在给定输入数据维度大小的情况下动态计算

全部
类可分离组件V2D(nn.模块):
def uuu init uuuuu(自、输入通道、输出通道、深度、内核大小、偏差=False):
super(SeparableConv2d,self)。\uuuu init\uuuu()
self.depthwise=nn.Conv2d(输入通道,输出通道*深度,内核大小=内核大小,组=输入通道,偏差=偏差)
self.pointwise=nn.Conv2d(输出通道*深度,输出通道,内核大小=1,偏差=bias)
def前进(自身,x):
out=自深(x)
out=自定点(out)
返回
类别网络(nn.模块):
定义初始化(自):
超级(网络,自我)。\uuuu初始化
self.separable_conv=SeparableConv2d(
在_通道中=32,
out_通道=64,
深度=1,
内核大小=(1,16)
)
def前进(自身,x):
x=F.pad(x,(8,7,0,0),)
x=自可分离的_conv(x)
返回x

这些代码有什么问题吗?

链接的定义基本一致。最好的一个在房间里

  • “Depthwise”(由于不涉及深度,所以不是一个非常直观的名称)-是一系列规则的2d卷积,仅单独应用于数据层。-“逐点”与具有1x1内核的Conv2d相同
我建议对您的
SeparableConv2d
类进行一些更正:

  • 无需使用深度参数-它与out_通道相同
  • 我将padding设置为1,以确保与
    内核=(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

谢谢你的回答,我有关于
self.depthwise
层的问题。为什么它是nn.Conv2d(1,1)而不是nn.Conv2d(在\u通道中,在\u通道中)
。为什么不使用
groups`参数,而是执行
x。重塑
首先是Conv2d,使用1个过滤器?我的示例基于这样的假设:所有层都使用相同的过滤器进行深度卷积。在回顾了
tf.keras.layers.SeparableConv2D
实现之后,我发现tf对每个层使用了不同的过滤器。您正确地建议它将是
nn。Conv2d(in_channels=N,out_channels=N,groups=N)#N是in_channels
。我将用这两个选项更新我的解决方案中的示例。什么是
torch\u s2d
(我的
名称“torch\u s2d”在这里没有定义
)?什么是自我深度重量[1:]=torch_s2d深度重量[0]做什么,初始重量?
torch_s2d
是测试的剩余部分。我从答案中删除了它,也删除了第二个案例——只留下了一个应该与TF实现相匹配的案例。