tf.keras две потери, с промежуточными слоями в качестве входных данных для одной из них ошибка: входы для активной функции исполнения не могут быть символами Keras * c тензоров - PullRequest
1 голос
/ 12 апреля 2020

Я хочу иметь две потери в моей модели кеора тензорного потока, и один из них принимает промежуточный слой в качестве входных данных. Этот код работает, когда я использую keras, но когда дело доходит до tenorflow.keras, я сталкиваюсь со следующей ошибкой:

def loss_VAE(input_shape, z_mean, z_var, weight_L2=0.1, weight_KL=0.1):

  def loss_VAE_(y_true, y_pred):
      c, H, W, D = input_shape
      n = c * H * W * D

      loss_L2 = K.mean(K.square(y_true - y_pred), axis=(1, 2, 3, 4)) # original axis value is (1,2,3,4).

      loss_KL = (1 / n) * K.sum(
          K.exp(z_var) + K.square(z_mean) - 1. - z_var,
          axis=-1
      )

      return weight_L2 * loss_L2 + weight_KL * loss_KL

  return loss_VAE_

def loss_gt(e=1e-8):

  def loss_gt_(y_true, y_pred):
      intersection = K.sum(K.abs(y_true * y_pred), axis=[-3,-2,-1])
      dn = K.sum(K.square(y_true) + K.square(y_pred), axis=[-3,-2,-1]) + e

      return - K.mean(2 * intersection / dn, axis=[0,1])

  return loss_gt_


model.compile(
    adam(lr=1e-4),
    [loss_gt(dice_e), loss_VAE(input_shape, z_mean, z_var, weight_L2=weight_L2, weight_KL=weight_KL)],
    # metrics=[dice_coefficient]
)

Ошибка:

_SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found [<tf.Tensor 'Dec_VAE_VDraw_Var/Identity:0' shape=(None, 128) dtype=float32>, <tf.Tensor 'Dec_VAE_VDraw_Mean/Identity:0' shape=(None, 128) dtype=float32>]

Это ошибка? пожалуйста, найдите полный код в этом NOTEBOOK .

и ЭТОМ является ссылкой на данные.

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Замена K.mean на tf.reduce_mean и соответственно все бэкэнд-функции keras на функции тензорного потока решили проблему.

0 голосов
/ 12 апреля 2020

При работе в активном режиме tenorflow op проверит, имеют ли входы тип «tennflow». python .framework.ops.EagerTensor ", а операции Keras реализованы как группы обеспечения доступности баз данных. Таким образом, входные данные для активного режима будут иметь значение tenorflow. python .framework.ops.Tensor , и это приводит к ошибке

. Вы можете изменить тип ввода на EagerTensor, явно указав тензор потока для запуска в готовом режиме для Keras.

tf.config.experimental_run_functions_eagerly (True)

Добавление этого оператора должно решить вашу проблему. Хотя имейте в виду, что производительность будет значительно снижена, поскольку вы сейчас работаете в активном режиме и рекомендуется только для отладки, профилирование и т. Д.

...