Последовательная модель Keras для Tensorflow EstimatorSpec точность уменьшается - PullRequest
0 голосов
/ 13 мая 2018

Имеются некоторые проблемы с преобразованием из Keras (keras_model_fn) в TF model_fn для использования в Sagemaker.

Модели выглядят так:

Керас

def keras_model_fn(hyperparameters):
    model = tf.keras.Sequential()
    # increase input_dim (cur 2500) as amount of words go up
    model.add(tf.keras.layers.InputLayer(input_shape=[8], name='main_input'))
    model.add(tf.keras.layers.Embedding(2500, 128, input_length=8))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(NUM_CLASSES, activation='softmax'))
    model.compile(
        optimizer='adam',
        loss='categorical_crossentropy',
        metrics=['acc']
    )
    return model

Тензор потока

def model_fn(features, labels, mode, params):
    input_layer = tf.keras.layers.InputLayer(
        input_shape=(8,))(features[INPUT_TENSOR_NAME])
    embedding_layer = tf.keras.layers.Embedding(
        2500, 
        128, 
        input_length=8)(input_layer)
    flattened = tf.keras.layers.Flatten()(embedding_layer)
    predictions = tf.keras.layers.Dense(
        NUM_CLASSES, 
        activation='softmax')(flattened)

    if mode == tf.estimator.ModeKeys.PREDICT:
        return tf.estimator.EstimatorSpec(
            mode=mode,
            predictions={"output": predictions})

    loss = tf.losses.softmax_cross_entropy(labels, predictions)
    train_op = tf.contrib.layers.optimize_loss(
        loss=loss,
        global_step=tf.train.get_global_step(),
        learning_rate=0.001,
        optimizer="Adam")

    predictions_dict = {"output": predictions}
    eval_metric_ops = {
        "accuracy": tf.metrics.accuracy(
            tf.cast(labels,tf.int32), predictions)
    }
    return tf.estimator.EstimatorSpec(
        mode=mode,
        loss=loss,
        train_op=train_op,
        eval_metric_ops=eval_metric_ops
)

Данные обучения и оценки идентичны.Подача в массиве дополненных текстовых последовательностей (длина 8).С ожидаемым выходом 1/5 этикетки.

Потери

Я предполагаю, что проблема заключается в функции потерь.Я не могу понять, что делает Sequential модель за кулисами, по сравнению с тем, что делает моя тензорная модель.

В модели Keras я получаю следующую потерю.

INFO:tensorflow:global_step/sec: 170.783
INFO:tensorflow:loss = 0.0018957269, step = 1701 (0.586 sec)
INFO:tensorflow:global_step/sec: 164.419
INFO:tensorflow:loss = 0.029586311, step = 1801 (0.608 sec)
INFO:tensorflow:global_step/sec: 155.381
INFO:tensorflow:loss = 0.0019212833, step = 1901 (0.644 sec)
INFO:tensorflow:Loss for final step: 0.0023477676. 

В Конвертированной модели я получаю следующее.

INFO:tensorflow:loss = 1.232958, step = 1701 (0.354 sec)
INFO:tensorflow:global_step/sec: 280.328
INFO:tensorflow:loss = 1.0923336, step = 1801 (0.357 sec)
INFO:tensorflow:global_step/sec: 291.823
INFO:tensorflow:loss = 1.4360821, step = 1901 (0.343 sec)
INFO:tensorflow:Loss for final step: 1.0532712.

Как и ожидалось, точность Преобразованной модели (для данных, на которых она была обучена) составляет около 60%.Точность для модели Keras составляет 100%.

Мой вопрос: все ли выглядит правильно в конвертации?Что я мог сделать по-другому с преобразованной моделью, чтобы получить аналогичную производительность?

Я начал копаться в исходном коде Keras, чтобы посмотреть, что функция компиляции модели делает с целями / выходами, но собирался также обратиться сюда, чтобы узнать, есть ли у кого-нибудь предложение / побежалв это раньше.

1 Ответ

0 голосов
/ 13 мая 2018

Возможно, проблема в том, что вы применяете две активации Softmax в версии TensorFlow.Обратите внимание, что tf.losses.softmax_cross_entropy ожидает немасштабированные логиты.Вы можете сделать следующее:

logits = tf.keras.layers.Dense(
    NUM_CLASSES)(flattened)
predictions = tf.keras.layers.Activation(
    'softmax')(logits)

loss = tf.losses.softmax_cross_entropy(labels, logits)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...