Это происходит потому, что ваша форма тензоров y_true
или y_pred
не определена правильно. None
означает здесь, что форма тензоров не является строго заданной, но она может варьироваться в зависимости от предыдущих операций, что мы не можем видеть. Или вы просто инициализировали свой тензор следующим образом.
Как это исправить:
- Сначала вы должны выяснить, как
y_true
или y_pred
обретает свою форму, и избегать получения формы None, чтобы у тензоров было детерминированное число строк и столбцов
Пример:
Ваша функция потерь работает для правильных входов:
import tensorflow as tf
from keras import backend as K
def custom_loss(y_true, y_pred):
y_pred = K.reshape(y_pred, (K.get_variable_shape(y_pred)[0], -1))
y_true = K.reshape(y_true, (K.get_variable_shape(y_true)[0], -1))
y_pred = K.std(y_pred, axis=0)
y_true = K.std(y_true, axis=0)
loss = (1 / 2) * (y_pred - y_true) ** 2
return loss
a = tf.constant([[1.0, 2., 3.]])
b = tf.constant([[1., 2., 3.]])
loss = custom_loss(a, b)
loss = tf.Print(loss, [loss], "loss")
with tf.Session() as sess:
_ = sess.run([loss])
Но при использовании заполнителя, где я не определил форму, выдается то же исключение
a = tf.placeholder(tf.float32, (None, 32))