简体   繁体   English

ValueError:形状 (None, 2) 和 (None, 1) 不兼容

[英]ValueError: Shapes (None, 2) and (None, 1) are incompatible

I'm training a model to identify foreign objects in an image.我正在训练 model 来识别图像中的异物。 This is my data generator:这是我的数据生成器:

train_data_gen = train_image_generator.flow_from_dataframe(
    traincsv,
    directory=basepath,
    x_col='image_name',
    y_col='class',
    target_size=IMG_SHAPE,
    color_mode='rgb',
    class_mode='binary',
    batch_size=BATCH_SIZE,
    shuffle=True)
    #save_to_dir='/content/drive/My Drive/Results')

validation_data_gen = validation_image_generator.flow_from_dataframe(
    valcsv,
    directory=valpath,
    x_col='image_name',
    y_col='class',
    target_size=IMG_SHAPE,
    color_mode='rgb',
    class_mode='binary',
    batch_size=BATCH_SIZE,
    shuffle=True)
    #save_to_dir='/content/drive/My Drive/Results')

I've loaded Resnet and tried to do transfer learning.我已经加载了 Resnet 并尝试进行迁移学习。 This is the model creation:这是 model 创建:

model = tf.keras.Sequential([
  feature_extractor,
  layers.Dense(2)
])

When I'm compiling with accuracy metrics:当我使用准确性指标进行编译时:

 model.compile( 
  optimizer='adam',
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])

and try to fit it:并尝试适应它:

history = model.fit(train_data_gen,
                    epochs=EPOCHS,
                    validation_data=validation_data_gen)

it runs successfully and gives the accuracy results.它运行成功并给出了准确的结果。

but when I change in Compile the metric to AUC:但是当我将指标更改为 AUC 时:

 model.compile( 
  optimizer='adam',
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['AUC'])

I get an error:我收到一个错误:

Epoch 1/5

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-37-909955559916> in <module>()
     13   history = model.fit(train_data_gen,
     14                     epochs=EPOCHS,
---> 15                     validation_data=validation_data_gen)
     16 
     17   t=time.time()

10 frames

/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)
    966           except Exception as e:  # pylint:disable=broad-except
    967             if hasattr(e, "ag_error_metadata"):
--> 968               raise e.ag_error_metadata.to_exception(e)
    969             else:
    970               raise

ValueError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:571 train_function  *
        outputs = self.distribute_strategy.run(
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:951 run  **
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:543 train_step  **
        self.compiled_metrics.update_state(y, y_pred, sample_weight)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:411 update_state
        metric_obj.update_state(y_t, y_p)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/metrics_utils.py:90 decorated
        update_op = update_state_fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/metrics.py:2083 update_state
        label_weights=label_weights)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/metrics_utils.py:351 update_confusion_matrix_variables
        y_pred.shape.assert_is_compatible_with(y_true.shape)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_shape.py:1117 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (None, 2) and (None, 1) are incompatible

Can someone assists with an idea of how to solve that?有人可以帮忙解决这个问题吗?

As your problem has just two classes you should use binary crossentropy and the output of your model should be one single neuron:由于您的问题只有两个类,您应该使用二元交叉熵,并且您的 model 的 output 应该是一个神经元:

model = tf.keras.Sequential([
                              feature_extractor,
                              layers.Dense(1)
                             ])
model.compile( 
               optimizer='adam',
               loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
               metrics=['AUC']
             )

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

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