Python 张量流与PyTorch卷积混淆
我对如何在PyTorch中复制Keras(TensorFlow)卷积感到困惑 在凯拉斯,我可以做这样的事情。(输入大小为Python 张量流与PyTorch卷积混淆,python,tensorflow,keras,deep-learning,pytorch,Python,Tensorflow,Keras,Deep Learning,Pytorch,我对如何在PyTorch中复制Keras(TensorFlow)卷积感到困惑 在凯拉斯,我可以做这样的事情。(输入大小为(256,237,1,21),输出大小为(256,237,1,1024) 然而,在Pytork中,当我尝试做相同的事情时,我会得到不同的输出大小: import torch.nn as nn x = torch.randn(256,237,1,21) m = nn.Conv1d(in_channels=237, out_channels=1024, kernel_size=(1
(256,237,1,21)
,输出大小为(256,237,1,1024)
然而,在Pytork中,当我尝试做相同的事情时,我会得到不同的输出大小:
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])
我希望Pytork提供与Keras相同的输出大小:
这似乎意味着Keras过滤器是PyTorch的out\u通道
,但这就是我所拥有的。我试图在PyTorch中添加padding=(0503)
的填充,但这给了我torch.Size([256,1024,1,1023])
但这仍然不正确。这也需要比keras更长的时间,因此我觉得我没有正确分配参数
如何复制Keras在PyTorch中对卷积所做的操作?在TensorFlow中,采用形状张量(批处理形状+(步骤,输入尺寸))
。这意味着通常所称的通道出现在最后一个轴上。例如,在2D卷积中,您将有(批处理、高度、宽度、通道)
这与PyTorch不同,PyTorch的通道尺寸正好位于批次轴之后:形状为(批次、通道、长度)
。因此您需要排列两个轴
对于torch.nn.Conv1d
:
是输入张量中的通道数in_channels
是过滤器的数量,即输出的通道数量out\u channels
卷积的步长步长
两侧添加的零填充填充
padding='same'
选项,您需要正确选择padding
。在这里stride=1
,因此padding
必须等于kernel\u size//2
(即padding=2
),以保持张量的长度
在您的示例中,由于
x
的形状为(256,237,1,21)
,因此在TensorFlow的术语中,它将被视为具有以下特征的输入:
的批处理形状(256237)
,因此1D输入的长度为steps=1
1
输入通道21
x
的形状(256237,1,21)
是:
的批次形状(256237)
输入通道1
- 长度为
21
在下面的两个示例中(TensorFlow vs.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,21237)
>>> 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])