我对如何在PyTorch中复制Keras(TensorFlow)卷积感到困惑。
在Keras,我可以做这样的事情。(输入大小为(256, 237, 1, 21)
,输出大小为(256, 237, 1, 1024)
。
import tensorflow as tf
x = tf.random.normal((256,237,1,21))
y = tf.keras.layers.Conv1D(filters=1024, kernel_size=5,padding="same")(x)
print(y.shape)
(256, 237, 1, 1024)
但是,在PyTorch中,当我尝试执行相同的操作时,会得到不同的输出大小:
import torch.nn as nn
x = torch.randn(256,237,1,21)
m = nn.Conv1d(in_channels=237, out_channels=1024, kernel_size=(1,5))
y = m(x)
print(y.shape)
torch.Size([256, 1024, 1, 17])
我希望PyTorch给我和Keras一样的输出大小:
这个前面的问题似乎暗示Keras过滤器PyTorch的out_channels
,但多数民众赞成我。我试图在PyTorch中添加填充,padding=(0,503)
但这给了我,torch.Size([256, 1024, 1, 1023])
但仍然不正确。这也比keras花费的时间长得多,所以我觉得我没有正确分配参数。
我该如何复制Keras在PyTorch中对卷积所做的工作?
在TensorFlow中,tf.keras.layers.Conv1D
采用一个张量(batch_shape + (steps, input_dim))
。这意味着通常所说的通道出现在最后一个轴上。例如,在2D卷积中,您将拥有(batch, height, width, channels)
。这与PyTorch不同,在PyTorch中,通道尺寸恰好位于批处理轴之后:torch.nn.Conv1d
形状为(batch, channel, length)
。因此,您将需要排列两个轴。
对于torch.nn.Conv1d
:
in_channels
是输入张量中的通道数out_channels
是过滤器的数量,即输出将具有的通道数stride
卷积的步长padding
两边都加了零填充在PyTorch中,没有选项padding='same'
,您需要padding
正确选择。在这里stride=1
,因此padding
必须等于kernel_size//2
(即 padding=2
)以保持张量的长度。
在您的示例中,由于在TensorFlow的术语中x
形状为(256, 237, 1, 21)
,因此将其视为具有以下内容的输入:
(256, 237)
,steps=1
,所以你的1D输入的长度1
,21
输入通道。而在PyTorch中,x
形状(256, 237, 1, 21)
为:
(256, 237)
,1
输入通道21
。在下面的两个示例(TensorFlow与PyTorch)中都将输入保持不变,x.shape=(256, 237, 21)
假设256
是批量大小,237
是输入序列的长度,而21是通道数(即输入尺寸,我认为是每个尺寸)时间步长)。
在TensorFlow中:
>>> x = tf.random.normal((256, 237, 21))
>>> m = tf.keras.layers.Conv1D(filters=1024, kernel_size=5, padding="same")
>>> y = m(x)
>>> y.shape
TensorShape([256, 237, 1024])
在PyTorch中:
>>> x = torch.randn(256, 237, 21)
>>> m = nn.Conv1d(in_channels=21, out_channels=1024, kernel_size=5, padding=2)
>>> y = m(x.permute(0, 2, 1))
>>> y.permute(0, 2, 1).shape
torch.Size([256, 237, 1024])
因此,在后者中,您只需使用x = torch.randn(256, 21, 237)
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句