gpt4 book ai didi

python - TensorFlow vs PyTorch 卷积混淆

转载 作者:行者123 更新时间:2023-12-05 09:35:38 24 4
gpt4 key购买 nike

我对如何在 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 相同的输出大小:

previous question似乎暗示 Keras 过滤器是 PyTorch 的 out_channels 但这就是我所拥有的。我试图在 padding=(0,503) 的 PyTorch 中添加填充,但这给了我 torch.Size([256, 1024, 1, 1023]) 但这仍然没有正确的。这也比 keras 花费的时间长得多,所以我觉得我错误地分配了一个参数。

如何在 PyTorch 中复制 Keras 对卷积所做的操作?

最佳答案

在 TensorFlow 中,tf.keras.layers.Conv1D采用形状为 (batch_shape + (steps, input_dim)) 的张量。这意味着通常所说的 channel 出现在最后一个轴上。例如,在 2D 卷积中,您将拥有 (batch, height, width, channels)这与 PyTorch 不同,PyTorch 的 channel 维度紧跟在批处理轴之后:torch.nn.Conv1d采用 (batch, channel, length) 的形状。因此,您需要排列两个轴。

对于torch.nn.Conv1d:

  • in_channels 是输入张量中的 channel 数
  • out_channels 是过滤器的数量,输出将具有的 channel 数量
  • stride 卷积的步长
  • padding 两边补零

在 PyTorch 中没有 padding='same' 选项,您需要正确选择 padding。这里 stride=1,所以 padding 必须等于 kernel_size//2( padding=2 ) 以保持张量的长度。


在您的示例中,由于 x 的形状为 (256, 237, 1, 21),在 TensorFlow 的术语中,它将被视为输入:

  • (256, 237) 的批量形状,
  • steps=1,所以你的一维输入的长度是1
  • 21 个输入 channel 。

而在 PyTorch 中,形状 (256, 237, 1, 21)x 将是:

  • 批量形状 (256, 237),
  • 1 输入 channel
  • 长度为 21

假设 256是批量大小,237是输入序列的长度,21是 channel 数(输入维度,我在上面看到的维度每个时间步)。

在 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)...

关于python - TensorFlow vs PyTorch 卷积混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65708548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com