TensorFlow与PyTorch卷积混淆

真棒

我对如何在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

在下面的两个示例(TensorFlowPyTorch)中都将输入保持不变,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TensorFlow 卷积代码优化

来自分类Dev

PyTorch混淆矩阵图

来自分类Dev

PyTorch如何实现向后卷积?

来自分类Dev

可重用的Tensorflow卷积网络

来自分类Dev

tensorflow 卷积结果到 numpy

来自分类Dev

使用pytorch验证卷积定理

来自分类Dev

PyTorch卷积块-CIFAR10-RuntimeError

来自分类Dev

Tensorflow:如何创建混淆矩阵

来自分类Dev

彩色图像卷积核的Tensorflow权重?

来自分类Dev

TensorFlow中卷积的自定义填充

来自分类Dev

Tensorflow上的全卷积网(FCN)

来自分类Dev

TensorFlow卷积神经网络教程

来自分类Dev

TensorFlow中的卷积层是否支持辍学?

来自分类Dev

无法获得卷积算法Tensorflow 2.3.0

来自分类Dev

Tensorflow上的全卷积网(FCN)

来自分类Dev

TensorFlow卷积神经网络教程

来自分类Dev

tensorflow 如何连接链接卷积层的维度?

来自分类Dev

如何在PyTorch中合并2D卷积?

来自分类Dev

在Pytorch中的张量上应用一维卷积

来自分类Dev

如何手动实现pytorch卷积的填充

来自分类Dev

PyTorch中是否有深度恒定的卷积层选项?

来自分类Dev

如何在pytorch中归一化卷积权重?

来自分类Dev

Pytorch for Dummies 中的卷积自编码器

来自分类Dev

用于多类分类的 Tensorflow 混淆矩阵

来自分类Dev

为什么在调用1D卷积时TensorFlow计算2D卷积?

来自分类Dev

Tensorflow:经过一系列的卷积和反卷积后获得相同的张量

来自分类Dev

如何在TensorFlow中实现卷积LSTM单元?

来自分类Dev

Tensorflow:如何应用一维卷积特征/通道虎钳?

来自分类Dev

TensorFlow:卷积网络中的尺寸不兼容错误