Интегрирование модели потери кераса в тензорный граф - PullRequest
1 голос
/ 21 сентября 2019

Если я определю эту простую модель Keras

import tensorflow as tf
from tensorflow import keras
import numpy as np

l1 = keras.layers.Input(shape=(32))
l2 = keras.layers.Dense(10)(l1)
model = keras.Model(inputs=l1, outputs=l2)

model.compile(loss='mse', optimizer='adam')

Допустим, у меня есть значения ввода и меток, сохраненные в train_examples и train_labels соответственно

Если я также определю переменнуюsome_var, которое зависит от потери этой модели (я просто использую model_loss здесь для примера)

some_var = model.total_loss

Как мне оценить значение для some_var?Я знаю, что это должно быть что-то вроде:

with keras.backend.get_session() as sess:
    sess.run(some_var, feed_dict={ ?: train_examples, ?: train_labels })

что должно идти вместо знаков вопроса?Я не хочу изменять функцию потерь модели, просто используйте то, что было определено в определении другой переменной

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Как мне оценить значение для some_var?

some_var = model.total_loss
train_examples = np.ones((1,32))
train_labels=np.ones((1,10))
with keras.backend.get_session() as sess:
    loss = sess.run(some_var, feed_dict={ 'input_1:0': train_examples,
                                          'dense_target:0' : train_labels })
    print(f'loss is {loss}')


loss is 3.1767444610595703

Относительно feed_dict ключей,

  1. для входного слоя Keras это имя_слоя: 0, в приведенном выше примере input_1: 0 (имя слояприсвоенный keras может быть известен из model.summary())

  2. Когда конкретная пара ключ: значение не указана в feed_dict, тензор потока выдает ошибку с отсутствующим ключом.

    tenorflow.python.framework.errors_impl.InvalidArgumentError: Вы должны передать значение для тензора-заполнителя ' dens_target ' с плавающей точкой dtype и shape [?,?]

  3. Длинный ответ о том, почему для имени тензора требуется ': 0'.http://stackoverflow.com/a/37870634/419116

0 голосов
/ 21 сентября 2019

Поскольку вы хотите «оценить» и не использовать его в некоторых дальнейших вычислениях на графике, вы можете просто использовать обратный вызов:

from keras.callbacks import LambdaCallback

def getLoss(epoch, logs):
    print(logs['loss']) #or val_loss (print the keys of logs if in doubt)

callback = LambdaCallback(on_epoch_end = getLoss)

Использовать этот обратный вызов при установке:

model.fit(x, y, callbacks = [callback])

Если вы можете подождать до окончания обучения, вы можете просто получить историю в конце:

historyCallback = model.fit(x, y)

print(historyCallback.history['loss'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...