猿问

ValueError:logits 和标签必须具有相同的形状 ((None, 14)

我正在创建一个 CNN,它使用 14 个可以共存的不同类别对 CXR 进行多标签分类。( https://stanfordmlgroup.github.io/competitions/cheexpert/ )。我将 Python 与 Keras 和 Tensorflow 一起使用,现在我正在尝试让代码工作(使用小型测试 CNN),但我收到错误“ValueError:logits 和标签必须具有相同的形状((None,14)vs(无,1))”我使用了具有二元交叉熵损失的 sigmoid 激活函数。我认为创建训练和验证数据集可能会出现问题。如图所示,我将 ImageDataGenerator.flow_from_dataframe 函数与 pandas 数据框一起使用,所有 14 个标签(0 或 1)都有一列。 熊猫数据框结构

我在 stackoverflow/github 上搜索了同样的问题,但他们大多不使用 ImageDataGenerator 并且必须调整 X 或 Y 的大小,但我不知道我将如何做到这一点。有谁知道出了什么问题?提前致谢!我的代码如下。

import pandas as pd

import tensorflow as tf

from tensorflow import keras

from tensorflow.keras.preprocessing.image import ImageDataGenerator

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten

from tensorflow.keras.layers import Conv2D, MaxPooling2D

from tensorflow.keras.callbacks import TensorBoard

import time

import h5py


df = pd.read_csv('D:\\Milou\\CheXpert-v1.0-small\\train.csv', usecols = [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18])

df = df.fillna(0)           # Change NaN values to 0

df = df.convert_dtypes()    # Change datatypes from float to integer if possible

df = df.replace({-1 : 0})   # Regard the uncertain labels '-1' as negative

print(df.head(5))


label_names = ["No Finding", "Enlarged Cardiomediastinum", "Cardiomegaly", "Lung Opacity", "Lung Lesion", "Edema", "Consolidation", "Pneumonia", "Atelectasis", "Pneumothorax", "Pleural Effusion", "Pleural Other", "Fracture", "Support Devices"]


datagen=ImageDataGenerator(rescale=1./255, validation_split=0.2)

第一次在 stackoverflow 上提问,所以请不要犹豫,就缺少的信息等提供反馈!


一只斗牛犬
浏览 222回答 3
3回答

呼如林

因为你有 2 个不同的类别,你应该在你的最后dense一层有 2 个神经元,而不是你有观察的数量。不应在您的神经网络架构中指定观察次数。

月关宝盒

使用 class_mode = 'raw' 如下:train_generator=datagen.flow_from_dataframe(dataframe=df,                                             directory="D:\\Milou",                                             x_col="Path",                                             y_col=label_names,                                             subset="training",                                             class_mode="raw",                                             target_size=(100,100),                                             batch_size=64)

慕娘9325324

你需要在最后一层之前展平你的网络,因为这种不展平的输入你会得到所有这些类型的错误。实际上在最后一层你传递的是多维数组tf.keras.layers.Flatten()
随时随地看视频慕课网APP

相关分类

Python
我要回答