PyTorch: nn.LSTM выводит разные результаты для одних и тех же входов в одном пакете - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь реализовать двухслойный двунаправленный LSTM с torch.nn.LSTM .

Я сделал игрушечный пример: партия из 3 тензоров, которые абсолютно одинаковы (см. Мой код ниже). И я ожидал, что выходы BiLSTM будут одинаковыми по измерению партии, то есть out[:,0,:] == out[:,1,:] == out[:, 2, :].

Но, похоже, это не так. Согласно моим экспериментам, в 20% ~ 40% случаев выходной сигнал не был одинаковым. Поэтому мне интересно, где я ошибся.

# Python 3.6.6, Pytorch 0.4.1
import torch

def test(hidden_size, in_size):
    seq_len, batch = 4, 3
    bilstm = torch.nn.LSTM(input_size=in_size, hidden_size=hidden_size, 
                            num_layers=2, bidirectional=True)

    # create a batch with 3 exactly the same tensors
    a = torch.rand(seq_len, 1, in_size)  # (seq_len, 1, in_size)
    x = torch.cat((a, a, a), dim=1)

    out, _ = bilstm(x)  # (seq_len, batch, n_direction * hidden_size)

    # expect the output should be the same along the batch dimension
    assert torch.equal(out[:, 0, :], out[:, 1, :])  
    assert torch.equal(out[:, 1, :], out[:, 2, :])

if __name__ == '__main__':
    count, total = 0, 0
    for h_size in range(1, 51):
        for in_size in range(1, 51):
            total += 1
            try:
                test(h_size, in_size)
            except AssertionError:
                count += 1
    print('percentage of assertion error:', count / total)

1 Ответ

0 голосов
/ 21 февраля 2019

Что вас смущает, так это точность поплавка. Операции с плавающей точкой немного неточны и могут отличаться на очень небольшие суммы Используйте это вместо:

torch.set_default_dtype(torch.float64) 

Тогда вы увидите, что они должны быть одинаковыми в пакете затемнения.

Спасибо за исправление некоторых ошибок грамматики английского языка.

...