Вы используете numpy для получения точечного произведения тензоров. Здесь y_true_flat
и y_pred_flat
являются тензорами. Вы должны либо использовать метод tensorflow.tensordot
, либо метод tensorflow.keras.backend.dot
, чтобы получить произведение двух тензоров. Поскольку эти тензоры являются векторами, tensorflow.matmul
также может работать.
def normal_loss_1 (y_true, y_pred):
dim = tf.reduce_prod(tf.shape(y_true)[1:])
y_true_flatten = tf.reshape(y_true, [-1, dim])
y_pred_flatten = tf.reshape(y_pred, [-1, dim])
d = tf.tensordot(y_pred_flatten,y_true_flatten, 1)
y_sum = tf.reduce_sum(d, 1)
n_pixels = 256 * 256
normal_output = y_sum/n_pixels
normal_output = tf.reduce_mean(normal_output)
return -normal_output
Редактировать
K.flatten
преобразует тензоры (y_true
и y_pred
) в векторы, и размер пакета исчезнет. Это означает, что вы не можете усреднить потери по партии.