Я написал модель LSTM с использованием Keras и предварительной активации LeakyReLU:
# ADAM Optimizer with learning rate decay
opt = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0001)
# build the model
model = Sequential()
num_features = data.shape[2]
num_samples = data.shape[1]
model.add(
LSTM(16, batch_input_shape=(None, num_samples, num_features), return_sequences=True, activation='linear'))
model.add(LeakyReLU(alpha=.001))
model.add(Dropout(0.1))
model.add(LSTM(8, return_sequences=True, activation='linear'))
model.add(Dropout(0.1))
model.add(LeakyReLU(alpha=.001))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=opt,
metrics=['accuracy', keras_metrics.precision(), keras_metrics.recall(), f1])
Мои данные представляют собой сбалансированный двоичный набор с метками. то есть: 50% помечены 1 50% помечены 0. Я использовал activation='linear'
для слоев LSTM, предшествующих активации LeakyReLU, аналогично этот пример, который я нашел на GitHub.
Модель выдает Nan in summary histogram
ошибку в этой конфигурации. Изменение активаций LSTM на activation='sigmoid'
работает хорошо, но кажется неправильным.
Прочитав этот вопрос StackOverflow, мы предложили «ввести небольшое значение при вычислении потерь» em>, я просто не знаю, как это сделать на встроенной функции потерь.
Любая помощь / объяснение будет оценено.
Обновление: я вижу, что убыток в первую эпоху составляет нан.
260/260 [==============================] - 6s 23ms/step -
loss: nan - acc: 0.5000 - precision: 0.5217 - recall: 0.6512 - f1: nan - val_loss: nan - val_acc: 0.0000e+00 - val_precision: -2147483648.0000 - val_recall: -49941480.1860 - val_f1: nan
Обновление 2. Я обновил TensorFlow и Keras до версий 1.12.0 и 2.2.4. Эффекта не было.
Я также попытался добавить потерю к первому слою LSTM, как это было предложено @Oluwafemi Sule, это похоже на шаг в правильном направлении, теперь потеря не равна nan в первую эпоху, однако я все еще получаю ту же ошибку ... вероятно, из-за других значений nan, таких как val_loss / val_f1.
[==============================] - 7s 26ms/step -
loss: 1.9099 - acc: 0.5077 - precision: 0.5235 - recall: 0.6544 - f1: 0.5817 - val_loss: nan - val_acc: 0.5172 - val_precision: 35.0000 - val_recall: 0.9722 - val_f1: nan
Обновление 3. Я попытался скомпилировать сеть только с метрикой точности, но безуспешно:
Epoch 1/300
260/260 [==============================] - 8s 29ms/step - loss: nan - acc: 0.5538 - val_loss: nan - val_acc: 0.0000e+00
1e-3
,1e-4
или1e-5
в качестве скорости обучения. Кроме того, вы пробовали clipnorm для обрезки градиентов. Кроме того, используйте @user_name в начале вашего комментария, когда вы отвечаете конкретному пользователю, иначе этот пользователь не будет уведомлен о вашем комментарии (я не был уведомлен о вашем предыдущем комментарии, я просто случайно проверил этот вопрос и видел, что вы ответили). - person today   schedule 05.11.2018clipnorm=1.0
, напримерAdam(..., clipnorm=1.0)
. - person today   schedule 05.11.2018clipnorm=1.0
не решил мою проблему при использованииactivation='linear'
Я все еще получаюNan in summary histogram
ошибку (все те же версии TF и Keras) - person Shlomi Schwartz   schedule 05.11.2018accuracy
и посмотрите, по-прежнему ли вы получаете эту ошибку. - person today   schedule 07.11.2018