Виновником является ваша попытка поменять размеры входных данных, поскольку 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]])