Перенести промежуточные скрытые состояния из RNN в полностью подключенный - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь создать модель, которая может предсказывать распределение вероятностей на основе набора характеристик. В набор функций может быть внесено несколько обновлений, которые могут исправить распределение. Я смог без особых проблем создать базовую c нейронную сеть с простым вводом функции и выводом распределения, но добавление системы обновлений заставило меня выбрать подключение RNN над рабочей моделью.

Не вдаваясь в подробности, я хочу, чтобы RNN выводила скрытое состояние для каждого шага обновления (для каждого набора функций). Другими словами, набор функций может иметь длину N. RNN принимает (L, N) и вывод (L, M), где L - длина последовательности, а M - размер скрытого слоя. Затем следующий Neural Net берет (L, M) и создает L количества распределений. Мне нужны промежуточные результаты, потому что я хочу вычислить потери между каждым из распределений с фактическим распределением. Таким образом, модель будет становиться все более точной по мере того, как я увеличиваю L с 1 до, может быть, 15.

Вот что у меня есть в классе модели. Как видите, это крайне неэффективно, поскольку я разбиваю вывод rnn, а затем передаю его обратно в нейронную сеть net. Две проблемы - это неэффективные манипуляции со списками и вторая проблема, связанная с еще более сложным вычислением функции потерь. Мне пришлось бы скопировать L целевых дистрибутивов и, наконец, вычислить обратное распространение. Есть ли лучший способ сделать их все?

def __init__(self):
    super(NN, self).__init__()
    self.out_length = int(max_num/step+2)
    
    self.rnn = nn.RNN(13, 64)
    
    self.network = nn.Sequential(nn.Linear(64, 64),
                                 nn.ELU(),
                                 nn.Linear(64, 64),
                                 nn.ELU(),
                                 nn.Linear(64, 64),
                                 nn.ELU(),
                                 nn.Linear(64, self.out_length),
                                 nn.ELU(),
                                 nn.Softmax()
                                )
    print(self)

def forward(self, features):
    rnn_output, hiddens = self.rnn(features.float(), None)
    rnn_output, lengths = pad_packed_sequence(rnn_output, batch_first=True)
    print(rnn_output.shape)
    print(lengths)
    output = [self.network(rnn_output[i,:,:]) for i in range(len(lengths))]
    return output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...