Тензоры скрытого состояния имеют другой порядок, чем возвращенные тензоры - PullRequest
3 голосов
/ 10 ноября 2019


В рамках обучения ГРУ я хочу получить тензоры скрытого состояния.

Я определил GRU с двумя уровнями:

self.lstm = nn.GRU(params.vid_embedding_dim, params.hidden_dim , 2)

Функция forward определяется следующим образом (ниже приведена только часть реализации):

    def forward(self, s, order, batch_size, where, anchor_is_phrase = False):
    """
    Forward prop. 
    """
      # s is of shape [128 , 1 , 300] , 128 is batch size
      output, (a,b) = self.lstm(s.cuda())
      output.data.contiguous()

И out имеет форму: [128, 400] (128 - это число выборок, каждый из которых встроен в 400-мерный вектор).

Я понимаю, что out - это выходпоследнее скрытое состояние, и поэтому я ожидаю, что оно будет равно b. Однако после того, как я проверил значения, я увидел, что они действительно равны, но b содержит тензор в другом порядке, например, output[0] равен b[49]. Я что-то здесь упускаю?

Спасибо.

1 Ответ

2 голосов
/ 11 ноября 2019

Я понимаю ваше замешательство. Посмотрите на приведенный ниже пример и комментарии:

# [Batch size, Sequence length, Embedding size]
inputs = torch.rand(128, 5, 300)
gru = nn.GRU(input_size=300, hidden_size=400, num_layers=2, batch_first=True)

with torch.no_grad():
    # output is all hidden states, for each element in the batch of the last layer in the RNN
    # a is the last hidden state of the first layer
    # b is the last hidden state of the second (last) layer
    output, (a, b) = gru(inputs)

Если мы распечатаем фигуры, они подтвердят наше понимание:

print(output.shape) # torch.Size([128, 5, 400])
print(a.shape) # torch.Size([128, 400])
print(b.shape) # torch.Size([128, 400])

Кроме того, мы можем проверить, является ли последний скрытымсостояние для каждого элемента в пакете последнего слоя, полученного из output, равно b:

np.testing.assert_almost_equal(b.numpy(), output[:,:-1,:].numpy())

Наконец, мы можем создать RNN с 3 слоями и запустить тот жеtests:

gru = nn.GRU(input_size=300, hidden_size=400, num_layers=3, batch_first=True)
with torch.no_grad():
    output, (a, b, c) = gru(inputs)

np.testing.assert_almost_equal(c.numpy(), output[:,-1,:].numpy())

Опять утверждение проходит, но только если мы сделаем это для c, который теперь является последним уровнем RNN. В противном случае:

np.testing.assert_almost_equal(b.numpy(), output[:,-1,:].numpy())

Выдает ошибку:

AssertionError: Массивы почти не равны 7 десятичным знакам

Я надеюсь, что это проясняет ситуациюдля вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...