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,以确保与
的输出大小相同。如果内核大小不同-使用与常规Conv2d相同的原则,相应地调整填充。示例类内核=(3,3)
不再需要-填充在Net()
中完成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实现相匹配的案例。