tensorflow - 获取 ValueError : Shapes (None, 1) 和 (None, 9) 在 CNN 中拟合皮肤癌数据集后不兼容

标签 tensorflow machine-learning keras deep-learning conv-neural-network

我正在使用 ISIC 皮肤癌数据集创建一个模型来检测皮肤癌。我创建了一个 CNN 模型,但在编译后它抛出了一个形状错误。 我的代码-

scale = 1./255
num_classes = 9
model = Sequential()
model.add(layers.experimental.preprocessing.Rescaling(scale, offset =0.0))
model.add(layers.Conv2D(32, (3, 3), padding = 'same', input_shape=(180, 180, 3)))
model.add(layers.Activation('relu'))

model.add(layers.Conv2D(64, (3, 3), padding='same'))
model.add(layers.Activation('relu'))

model.add(layers.Conv2D(128, (3, 3)))
model.add(layers.Activation('relu'))

model.add(layers.Flatten())
model.add(layers.Dense(20))
model.add(layers.Activation('relu'))
model.add(layers.Dense(num_classes))
model.add(layers.Activation('softmax'))

model.compile(optimizer='sgd',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

epochs = 2
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

My training data- 
<PrefetchDataset shapes: ((None, 180, 180, 3), (None,)), types: (tf.float32, tf.int32)>

My Val data - 
<PrefetchDataset shapes: ((None, 180, 180, 3), (None,)), types: (tf.float32, tf.int32)>

现在在拟合模型后出现错误 - ValueError: Shapes (None, 1) and (None, 9) are incompatible

Epoch 1/2
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-c695c39c566b> in <module>()
      3   train_ds,
      4   validation_data=val_ds,
----> 5   epochs=epochs
      6 )

9 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)
    984           except Exception as e:  # pylint:disable=broad-except
    985             if hasattr(e, "ag_error_metadata"):
--> 986               raise e.ag_error_metadata.to_exception(e)
    987             else:
    988               raise

ValueError: in user code:

    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:855 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:845 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1285 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:2833 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:3608 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:838 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:797 train_step
        y, y_pred, sample_weight, regularization_losses=self.losses)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/compile_utils.py:204 __call__
        loss_value = loss_obj(y_t, y_p, sample_weight=sw)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:155 __call__
        losses = call_fn(y_true, y_pred)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:259 call  **
        return ag_fn(y_true, y_pred, **self._fn_kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper
        return target(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:1644 categorical_crossentropy
        y_true, y_pred, from_logits=from_logits)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper
        return target(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/backend.py:4862 categorical_crossentropy
        target.shape.assert_is_compatible_with(output.shape)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/tensor_shape.py:1161 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

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

My Notebook

Data

最佳答案

您设置了 label_mode='int',这就是为什么您应该使用 sparse_categorical_crossentropy 作为损失函数,但您使用的损失函数 categorical_crossentropy 使用通常当您的目标是单热编码时。

来自 tf.keras.preprocessing.image_dataset_from_directory , label_mode 应该如下所示

    
- 'int': means that the labels are encoded as integers (e.g. for
   sparse_categorical_crossentropy loss).

- 'categorical' means that the labels are encoded as a categorical 
   vector (e.g. for categorical_crossentropy loss).

- 'binary' means that the labels (there can be only 2) are encoded as 
   float32 scalars with values 0 or 1 (e.g. for binary_crossentropy).

- None (no labels).

这就是为什么在您的情况下,将损失函数从 categorical_crossentropy 更改为 sparse_categorical_crossentropy 应该可以解决问题。

关于tensorflow - 获取 ValueError : Shapes (None, 1) 和 (None, 9) 在 CNN 中拟合皮肤癌数据集后不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67718758/

相关文章:

python - 为操作编写基于 Python 的自定义梯度函数? (没有 C++ 实现)

pandas - Numpy np.newaxis

machine-learning - 神经网络中的权重初始化

image-processing - 在 Keras ImageDataGenerator 或 flow_from_directory 中裁剪图像的中心

python - Keras - 是否可以在 Tensorboard 中查看模型的权重和偏差

python - 在conda环境中安装tensorflow时出错(CondaError : Cannot link a source that does not exist.)

matrix - 如何在 Keras 中实现矩阵乘法?

python - 使用 K-Means 根据不同时间的不同读数对节点进行聚类

python - 在 Ipython Notebook 中将 keras 后端更改为 Theano

python - 如何使用两个无维度的 Reshape keras 层?