【问题标题】:Converting keras code to pytorch code with Conv1D layer使用 Conv1D 层将 keras 代码转换为 pytorch 代码
【发布时间】:2020-07-31 09:40:40
【问题描述】:

我有一些需要转换为 Pytorch 的 keras 代码。我已经做了一些研究,但到目前为止我无法重现我从 keras 获得的结果。我在这方面花了很多时间,非常感谢任何提示或帮助。

这是我正在处理的 keras 代码。输入形状是 (None, 105, 768) 其中 None 是批量大小,我想将 Conv1D 应用于输入。 keras 中的期望输出为 (None, 105)

x = tf.keras.layers.Dropout(0.2)(input) 
x = tf.keras.layers.Conv1D(1,1)(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Activation('softmax')(x)

我试过了,但结果更糟:

    self.conv1d = nn.Conv1d(768, 1, 1)
    self.dropout = nn.Dropout(0.2)
    self.softmax = nn.Softmax()

def forward(self, input):

    x = self.dropout(input)
    x = x.view(x.shape[0],x.shape[2],x.shape[1])  
    x = self.conv1d(x)
    x = torch.squeeze(x, 1)
    x = self.softmax(x)

【问题讨论】:

    标签: machine-learning keras deep-learning pytorch


    【解决方案1】:

    罪魁祸首是您尝试交换输入的维度,因为 Keras 和 PyTorch 对维度顺序有不同的约定。

    x = x.view(x.shape[0],x.shape[2],x.shape[1])
    

    .view() 不会交换维度,但会更改数据的哪一部分是给定维度的一部分。您可以将其视为一维数组,然后您决定采取多少步来覆盖该维度。举个例子就更容易理解了。

    # Let's start with a 1D tensor
    # That's how the underlying data looks in memory.
    x = torch.arange(6)
    # => tensor([0, 1, 2, 3, 4, 5])
    
    # How the tensor looks when using Keras' convention (expected input)
    keras_version = x.view(2, 3)
    # => tensor([[0, 1, 2],
    #            [3, 4, 5]])
    
    # Vertical isn't swapped with horizontal, but the data is arranged differently
    # The numbers are still incrementing from left to right
    incorrect_pytorch_version = keras_version.view(3, 2)
    # => tensor([[0, 1],
    #            [2, 3],
    #            [4, 5]])
    

    要交换您需要使用的维度torch.transpose

    correct_pytorch_version = keras_version.transpose(0, 1)
    # => tensor([[0, 3],
    #            [1, 4],
    #            [2, 5]])
    

    【讨论】:

    • 感谢您的帮助,我已经尝试过转置和重塑,它们给出了相似的结果并且比视图更好,但是仍然没有达到 keras 的准确性:(
    • 我在我的代码中发现了一个错误。确实只是将行更改为 x = x.transpose(2,1)。非常感谢!!
    猜你喜欢
    • 2021-03-19
    • 2019-09-02
    • 2022-01-22
    • 2022-01-02
    • 1970-01-01
    • 2022-01-14
    • 2021-05-23
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多