Преобразование кода keras в код pytorch со слоем Conv1D - PullRequest
1 голос
/ 17 апреля 2020

У меня есть код keras, который мне нужно преобразовать в Pytorch. Я провел некоторое исследование, но пока не могу воспроизвести результаты, полученные от керас. Я потратил много часов на любые советы или помощь, очень признателен.

Вот код keras, с которым я имею дело. Форма ввода (None, 105, 768), где None - размер пакета, и я хочу применить Conv1D к входу. Выход желаний в керасе (Нет, 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)

1 Ответ

0 голосов
/ 18 апреля 2020

Виновником является ваша попытка поменять размеры входных данных, поскольку 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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...