Keras: прогнозировать модель в пользовательской функции потерь - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь использовать some_model.predict(x) в пользовательской функции потерь.

Я нашел эту пользовательскую функцию потерь:

_EPSILON = K.epsilon()

def _loss_tensor(y_true, y_pred):
    y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON)
    out = -(y_true * K.log(y_pred) + (1.0 - y_true) * K.log(1.0 - y_pred))
    return K.mean(out, axis=-1)

Но проблема в том, что model.predict() ожидаетмассив NumPy.Поэтому я искал, как преобразовать тензор (y_pred) в массив Numpy.Я нашел tmp = K.tf.round(y_true), но это возвращает тензор.Я также нашел: x = K.eval(y_true), который принимает переменную Keras и возвращает массив numpy.Это приводит к ошибке: You must feed a value for placeholder tensor 'dense_78_target' with dtype float.....Некоторые люди предложили установить фазу обучения на истину.Я сделал это, но это не помогло.

Что я просто хочу сделать:

def _loss_tensor(y_true, y_pred):
    y_tmp_true = first_decoder.predict(y_true)
    y_tmp_pred = first_decoder.predict(y_pred)

    return keras.losses.binary_crossentropy(y_tmp_true,y_tmp_pred)

Любая помощь будет признательна.

Это работает:

sess = K.get_session()
with sess.as_default():
  tmp = K.tf.constant([1,2,3]).eval()
  print(tmp)

Я также попробовал это сейчас:

tmp = first_decoder(y_true)

Это не соответствует утверждению:

assert input_shape[-1]

Может быть, кто-то знает, как решить эту проблему?

Обновление: Теперь я могу передать его через модель с помощью:

y_t = first_decoder(K.reshape(y_true, (1,512)))
y_p = first_decoder(K.reshape(y_pred, (1,512)))

Но когда я пытаюсь вернуть двоичную перекрестную энтропию, форма не правильная:

Input to reshape is a tensor with 131072 values, but the requested shape has 
512

Я выяснил, что 131072 было произведением размера моей партии и размера ввода (256 * 512).Затем я принял свой код для изменения размера (256,512).Первая партия работает нормально, но затем я получаю еще одну ошибку, которая говорит, что переданный размер был (96,512).

[решено] Обновление: Теперь работает:

def _loss_tensor(y_true, y_pred):
    num_ex = K.shape(y_true)[0]
    y_t = first_decoder(K.reshape(y_true, (num_ex,512)))
    y_p = first_decoder(K.reshape(y_pred, (num_ex,512)))

    return keras.losses.binary_crossentropy(y_t,y_p)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...