简体   繁体   English

ValueError:无法使用来自 keras 的损失函数将权重广播到值

[英]ValueError: weights can not be broadcast to values using loss function from keras

I'm using tensorflow keras to make a simple CNN_3D model.我正在使用 tensorflow keras 制作一个简单的 CNN_3D 模型。

inputs = keras.Input(shape=(65, 65, 65, 1), name='t1_image')
x = layers.Conv3D(16, (4, 4, 4), name='cnn_1')(inputs)
x = layers.Dropout(0.3)(x)
x = layers.BatchNormalization()(x)
x = layers.LeakyReLU()(x)
x = layers.Conv3D(24, (3, 3, 3), name='cnn_2')(x)
x = layers.Dropout(0.3)(x)
x = layers.BatchNormalization()(x)
x = layers.LeakyReLU()(x)
x = layers.MaxPooling3D((2, 2, 2), name='max_pool_1')(x)
x = layers.Conv3D(28, (3, 3, 3), name='cnn_3')(x)
x = layers.Dropout(0.3)(x)
x = layers.BatchNormalization()(x)
x = layers.LeakyReLU()(x)
x = layers.MaxPooling3D((2, 2, 2), name='max_pool_2')(x)
x = layers.Conv3D(34, (4, 4, 4), name='cnn_4')(x)
x = layers.Dropout(0.3)(x)
x = layers.BatchNormalization()(x)
x = layers.LeakyReLU()(x)
x = layers.Conv3D(2, (4, 4, 4), name='cnn_5')(x)
x = layers.Dropout(0.3)(x)
x = layers.BatchNormalization()(x)
x = layers.LeakyReLU()(x)
outputs = layers.Dense(1, activation='sigmoid', name='predictions')(x)

#print(outputs.shape)

model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=2e-5),
              loss=tf.keras.losses.KLDivergence(), metrics=['accuracy'])

So from the debug message printing, the outputs shape is (None, 8, 8, 8, 1) and my label shape is also (8, 8, 8, 1).因此,从调试消息打印来看,输出形状是 (None, 8, 8, 8, 1) 而我的标签形状也是 (8, 8, 8, 1)。 So basically I want to calculate the KLDivergence between two cubes.所以基本上我想计算两个立方体之间的 KLDivergence。

However, I'm getting this error message;但是,我收到此错误消息;

Traceback (most recent call last):
  File "new_seg.py", line 136, in <module>
    loss=tf.keras.losses.KLDivergence(), metrics=['accuracy'])
  File "/N/soft/rhel7/deeplearning/Python-3.7.6/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 75, in symbolic_fn_wrapper
    return func(*args, **kwargs)
  File "/N/soft/rhel7/deeplearning/Python-3.7.6/lib/python3.7/site-packages/keras/engine/training.py", line 229, in compile
    self.total_loss = self._prepare_total_loss(masks)
  File "/N/soft/rhel7/deeplearning/Python-3.7.6/lib/python3.7/site-packages/keras/engine/training.py", line 692, in _prepare_total_loss
    y_true, y_pred, sample_weight=sample_weight)
  File "/N/u/jp109/Carbonate/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/losses.py", line 128, in __call__
    losses, sample_weight, reduction=self._get_reduction())
  File "/N/u/jp109/Carbonate/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/utils/losses_utils.py", line 107, in compute_weighted_loss
    losses, sample_weight)
  File "/N/u/jp109/Carbonate/.local/lib/python3.7/site-packages/tensorflow_core/python/ops/losses/util.py", line 148, in scale_losses_by_sample_weight
    sample_weight = weights_broadcast_ops.broadcast_weights(sample_weight, losses)
  File "/N/u/jp109/Carbonate/.local/lib/python3.7/site-packages/tensorflow_core/python/ops/weights_broadcast_ops.py", line 167, in broadcast_weights
    with ops.control_dependencies((assert_broadcastable(weights, values),)):
  File "/N/u/jp109/Carbonate/.local/lib/python3.7/site-packages/tensorflow_core/python/ops/weights_broadcast_ops.py", line 103, in assert_broadcastable
    weights_rank_static, values.shape, weights.shape))
ValueError: weights can not be broadcast to values. values.rank=4. weights.rank=1. values.shape=(None, 8, 8, 8). weights.shape=(None,).

I'm guessing the important line is this;我猜重要的一行是这个;

ValueError: weights can not be broadcast to values. ValueError:权重不能广播到值。 values.rank=4. values.rank=4。 weights.rank=1. weights.rank=1。 values.shape=(None, 8, 8, 8). values.shape=(None, 8, 8, 8)。 weights.shape=(None,). weights.shape=(无,)。

which comes from this line;来自这一行;

model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=2e-5),
                  loss=tf.keras.losses.KLDivergence(), metrics=['accuracy'])

I don't understand what role weights is playing here and why the loss function is not working.我不明白权重在这里扮演什么角色以及为什么损失函数不起作用。

Does anybody know or have any suggestions about this issue?有没有人知道或对这个问题有任何建议?

You are mixing keras and tf.keras , you cannot do that.您正在混合kerastf.keras ,您不能这样做。

Either you use only keras , or you use only tf.keras .要么只使用keras ,要么只使用tf.keras Must choose one.必须选择一个。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM