TypeError: x и y должны иметь одинаковый dtype, полученный в tf.float32! = Tf.int64 в пользовательской функции потерь keras - PullRequest
0 голосов
/ 28 октября 2019

Я реализую пользовательскую функцию потерь, и мой код выглядит следующим образом:

def seedloss(y_true,y_pred):
        count = tf.count_nonzero(y_pred)
        loss = K.log(y_pred)
        logval = tf.where(tf.is_inf(loss), tf.zeros_like(loss), loss)
        loss = -(K.sum(logval,axis=(1,2,3))/count)
        return loss

Но я получаю сообщение об ошибке ниже

Traceback (most recent call last):
  File "trainrefinenet.py", line 69, in <module>
    refinenet_model.compile(optimizer = Adam(lr=lr_init), loss = seedloss, metrics = [iou_coef])
  File "/home/ssindhu/deeplab_env/lib64/python3.6/site-packages/keras/engine/training.py", line 229, in compile
    self.total_loss = self._prepare_total_loss(masks)
  File "/home/ssindhu/deeplab_env/lib64/python3.6/site-packages/keras/engine/training.py", line 692, in _prepare_total_loss
    y_true, y_pred, sample_weight=sample_weight)
  File "/home/ssindhu/deeplab_env/lib64/python3.6/site-packages/keras/losses.py", line 71, in __call__
    losses = self.call(y_true, y_pred)
  File "/home/ssindhu/deeplab_env/lib64/python3.6/site-packages/keras/losses.py", line 132, in call
    return self.fn(y_true, y_pred, **self._fn_kwargs)
  File "/home/ssindhu/metrics.py", line 32, in seedloss
    loss = -(K.sum(logval,axis=(1,2,3),keepdims=True)/count)
  File "/home/ssindhu/deeplab_env/lib64/python3.6/site-packages/tensorflow/python/ops/math_ops.py", line 884, in binary_op_wrapper
    return func(x, y, name=name)
  File "/home/ssindhu/deeplab_env/lib64/python3.6/site-packages/tensorflow/python/ops/math_ops.py", line 982, in _truediv_python3
    (x_dtype, y_dtype))
TypeError: x and y must have the same dtype, got tf.float32 != tf.int64 

Я пытался K.cast дляint64 но все равно я получаю ту же ошибку. Может ли кто-нибудь помочь мне понять причину этой ошибки и как решить эту проблему

1 Ответ

2 голосов
/ 28 октября 2019

Проблема заключается в использовании тензора count, так как его тип по умолчанию tf.int64 согласно официальной документации здесь .

Вы можете решить эту проблему, установив тип тензора следующим образом:

count = tf.count_nonzero(np.array([1, 2, 0]), dtype=tf.float32)
...