Я пытаюсь использовать 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)