Я пытаюсь создать модель, которая может предсказывать распределение вероятностей на основе набора характеристик. В набор функций может быть внесено несколько обновлений, которые могут исправить распределение. Я смог без особых проблем создать базовую 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