`None` в функции потерь Keras
У меня проблема с работой Tensorflow
а также keras
, Эту проблему мы могли бы объяснить следующим образом:
У нас есть модель (сверточная нейронная сеть), которая имеет выход в виде [None, 7, 7, 6]
, У нас есть функция "custom_loss". Эта функция имеет параметры y_true и y_pred. Они имеют форму [7,7,6]
, Когда я его скомпилировал, я получил сообщение об ошибке: TypeError: must be real number, not Tensor
, Я полагаю, что есть ошибка, когда я звоню y_pred[k][l][m]
а также y_true[k][l][m]
но я не знаю, как это исправить, чтобы включить это None
в [None, 7, 7, 6]
, Пожалуйста помоги.
Обновление: вот код
def custom_loss(y_true, y_pred):
loss = 0
for i in range(S*S):
k, l = i%S, i//S
first_part = 5* sum([(y_pred[k][l][m] - y_true[k][l][m])**2 for m in range(1,3)])
second_part = 5 * sum([(math.sqrt(y_pred[k][l][m]) - math.sqrt(y_true[k][l][m])) ** 2 for m in range(3, 5)])
third_part = 5* sum([(y_pred[k][l][m] - y_true[k][l][m])**2 for m in [0, 5]])
if y_true[k][l][0] > 0.5:
loss += first_part + second_part + third_part
else:
loss += 0.5 * (y_pred[k][l][0] - y_true[k][l][0])**2
return loss
2 ответа
В keras
(а также TensorFlow
без нетерпеливого исполнения) вы не можете получить доступ к содержанию тензора. Поэтому строки как
loss += 0.5 * (y_pred[k][l][0] - y_true[k][l][0])**2
не удастся. Вы можете попробовать использовать готовый режим выполнения TensorFlow
вместе с keras
как объяснено здесь.
В общем, вы всегда должны пытаться выразить эти вещи только с помощью встроенных функций keras
бэкэнд или с TensorFlow
операции. Просто попробуйте выразить свою функцию потерь с помощью матричной / векторной нотации, и тогда будет проще (возможно, мы также можем помочь вам) выразить это в keras
,
Когда вы пишете функцию потерь в keras (с бэкэндом тензорного потока), она предназначена для построения графика выполнения, но не для непосредственного выполнения.
Вы должны использовать функцию tenorflow или keras для определения вашей функции потерь. Если вы компилируете свои модели керас (и тензорный поток в качестве бэкэнда), попробуйте построить свой график выполнения и, следовательно, отправить тензоры через функцию потерь. math
Пакет не поддерживает тензоры. Также не возможно использовать if
в вашей функции потерь, так как она не выводима. Вместо этого вы можете использовать сигмовидную функцию, которая очень близка к функции шага.