Как отлаживать RNN? - PullRequest
       67

Как отлаживать RNN?

2 голосов
/ 27 октября 2019

Я настроил сеть ResNet50 для оптического приложения. С двумя входными изображениями сеть дает оценку 65 значений (регрессия), и она работает довольно хорошо. Однако два входных изображения принадлежат временному ряду, и изображения временного ряда будут несколько коррелированы в течение 10-15 раз, поэтому я ожидаю, что дополнительный RNN может улучшить оценки. Я попытался настроить сеть, показанную на рисунке, используя в основном замороженные значения параметров ResNet50, найденные в результате отдельного обучения, и «TimeDistributed» ResNet50s. Однако обучение RNN не дает полезной точности.

Полная сеть LSTM

Я потратил 2-3 недели, пытаясь отладить мой код (в частности, генератор)но я не нашел ошибок кодирования. В отчаянии я попытался настроить простейший RNN, о котором я только мог подумать: полный Resnet50 с одним или двумя SimpleRNN с линейной активацией. Однако они не обеспечивают даже почти такой же точности, как один ResNet50, несмотря на коррелированные временные ряды.

Сеть SimpleRNN

Так что мой вопрос: это правильно? предположить, что один SimpleRNN с линейной активацией должен обеспечивать ту же точность, что и один ResNet50?

1 Ответ

1 голос
/ 27 октября 2019

Это немного умозрительно, но может предложить подход для отладки RNN и ответа на ваш вопрос. Вот чрезвычайно простая сеть с SimpleRNN и тестовым входом из 2 выборок, каждая с одним временным шагом и одной функцией: то есть shape = (2,1,1)

from keras.models import Sequential
from keras.layers import SimpleRNN
import numpy as np

x_train=np.array([[[0.1]],
                  [[0.2]]])

y_train=np.array([[1],[0]])
print(x_train.shape)
print(x_train)

print(y_train.shape)
print(y_train)

#simple network
model = Sequential()
model.add(SimpleRNN(1,activation=None, use_bias=False, input_shape=(1,1)))
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])

model.fit(x_train, y_train, epochs=10, batch_size=2)

wgt=model.get_weights()
print(wgt)
print('model.predict(x_train)')
print(model.predict(x_train))

На основе запускавыше, два веса выходят из сети RNN. Первый, кажется, представляет собой простое масштабирование ввода, а второй, который я подозреваю, - это вес рекуррентного цикла, который фактически не используется ни для одного временного шага, как в этом примере. Активация линейная, поэтому результат соответствует model.predict.

Возможно, вы сможете расширить этот подход, чтобы рассуждать о производительности с помощью Resnet и, возможно, ответить на ваш вопрос. Надеюсь, это поможет.

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