我正在尝试将一些pytorch代码移植到tensorflow 2.0,但我很难理解如何在两者之间转换卷积函数。这两个库处理填充的方式是关键。基本上,我想了解如何手动生成pytorch在引擎盖下所做的填充,以便将其转换为tensorflow
如果我不做任何填充,下面的代码就可以工作,但是一旦添加了任何填充,我就不知道如何使这两个实现匹配
output_padding = SOME NUMBER
padding = SOME OTHER NUMBER
strides = 128
tensor = np.random.rand(2, 258, 249)
filters = np.random.rand(258, 1, 256)
out_torch = F.conv_transpose1d(
torch.from_numpy(tensor).float(),
torch.from_numpy(filters).float(),
stride=strides,
padding=padding,
output_padding=output_padding)
def pytorch_transpose_conv1d(inputs, filters, strides, padding, output_padding):
N, L_in = inputs.shape[0], inputs.shape[2]
out_channels, kernel_size = filters.shape[1], filters.shape[2]
time_out = (L_in - 1) * strides - 2 * padding + (kernel_size - 1) + output_padding + 1
padW = (kernel_size - 1) - padding
# HOW DO I PAD HERE TO GET THE SAME OUTPUT AS IN PYTORCH
inputs = tf.pad(inputs, [(?, ?), (?, ?), (?, ?)])
return tf.nn.conv1d_transpose(
inputs,
tf.transpose(filters, perm=(2, 1, 0)),
output_shape=(N, out_channels, time_out),
strides=strides,
padding="VALID",
data_format="NCW")
out_tf = pytorch_transpose_conv1d(tensor, filters, strides, padding, output_padding)
assert np.allclose(out_tf.numpy(), out_torch.numpy())
填充物
要在Pytorch和Tensorflow之间转换卷积和转置卷积函数(使用paddingpadding),我们需要首先理解
F.pad()
和tf.pad()
函数torch.nn.functional.pad(输入,填充大小,模式=常量,值=0):
padding size
:从{last dimension
,则pad的形式为(padding\u left,padding\u right)last 3 dimensions
,(左填充、右填充、上填充、下填充、前填充、后填充)tensorflow.pad(输入,padding\u size,mode='CONSTANT',name=None,CONSTANT\u value=0)
padding_size
:是一个形状为{[D, 1]
表示在该维度的张量内容之后要添加多少值李>下面的表格表示F.pad和tf.pad等价物以及输入张量的输出张量
}
[[[1, 1], [1, 1]]]
形状为{卷积填充
现在让我们转到卷积层中的PyTorch填充
F.conv1d(输入,…,填充,…):
both sides
上用于填充点数的隐式填充量李>padding=(size)
应用F.pad(input, [size, size])
,即用(大小、大小)等于tf.pad(input, [[0, 0], [0, 0], [size, size]])
的值填充最后一个维度F.conv2d(输入,…,填充,…):
padding=(size)
应用F.pad(input, [size, size, size, size])
即用(大小、大小)等于tf.pad(input, [[0, 0], [size, size], [size, size]])
的值填充最后2个维度padding=(size1, size2)
应用F.pad(input, [size2, size2, size1, size1])
,相当于tf.pad(input, [[0, 0], [size1, size1], [size2, size2]])
转置卷积中的填充
转置卷积层中的Pyrotch填充
dilation * (kernel_size - 1) - padding
填充将添加到输入中每个维度的both
侧李>Padding
在transposed
卷积中,可以将fake
输出分配为removed
output_padding
控制添加到输出形状一侧的附加大小pytorch
中transpose convolution
期间发生的确切情况李>输出大小=(输入大小-1)stride+(kerenel大小-1)+1+输出大小padding-2padding
代码
转置卷积
结果
一些有用的链接:
pytorch'SAME'卷积
pytorchtransposeconv的工作原理
相关问题 更多 >
编程相关推荐