Керас - Нан в сводной гистограмме LSTM - PullRequest
0 голосов
/ 31 октября 2018

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

Буду признателен за любую помощь / объяснение.

Обновление: Я вижу, что потери в первую эпоху

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, таких как 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

1 Ответ

0 голосов
/ 07 ноября 2018

Этот ответ начинается с предложения ввести небольшое значение при расчете потерь .

keras.layers.LSTM как и для всех слоев, которые являются прямыми или косвенными подклассами keras.engine.base_layer.Layer, имеет метод add_loss, который можно использовать для установки начального значения потерь.

Я предлагаю сделать это для слоя LSTM и посмотреть, как это повлияет на ваши результаты.

lstm_layer = LSTM(8, return_sequences=True, activation='linear')
lstm_layer.add_loss(1.0)

model.add(lstm_layer)
...