Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 张量流与PyTorch卷积混淆_Python_Tensorflow_Keras_Deep Learning_Pytorch - Fatal编程技术网

Python 张量流与PyTorch卷积混淆

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

我对如何在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,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
    是过滤器的数量,即输出的通道数量
  • 步长
    卷积的步长
  • 填充
    两侧添加的零填充
在PyTorch中,没有
padding='same'
选项,您需要正确选择
padding
。在这里
stride=1
,因此
padding
必须等于
kernel\u size//2
(即
padding=2
),以保持张量的长度


在您的示例中,由于
x
的形状为
(256,237,1,21)
,因此在TensorFlow的术语中,它将被视为具有以下特征的输入:

  • (256237)
    的批处理形状
  • steps=1
    ,因此1D输入的长度为
    1
  • 21
    输入通道
而在PyTorch中,
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])