InvalidArgumentError:logits和labels必须具有相同的第一个维度

问题描述 投票:0回答:1

我正在尝试对图像进行分类。这些图像具有不同的形状,但这不是问题。

但是,我正在尝试使用Tensorflow提供的tf.data.Dataset.from_generator函数创建数据集,我觉得某些东西不能正常工作。

这是代码:

filenames_ds = tf.data.Dataset.from_tensor_slices(categ_img[:1000]['image_name'])
labels_ds    = tf.data.Dataset.from_tensor_slices(categ_img[:1000]['category_label'])
images_ds    = filenames_ds.map(lambda x: tf.image.decode_jpeg(tf.read_file(x)))
labels_ds    = labels_ds.map(lambda x: tf.one_hot(x, NUM_CATEGORIES))
ds = tf.data.Dataset.zip((images_ds, labels_ds)).batch(1)

我还尝试像这样创建labels_ds:

labels_ds.map(lambda x: tf.expand_dims(tf.one_hot(x, NUM_CATEGORIES), axis=0))

categ_img是一个pandas.DataFrame,分别包含image_name和category_label列下的图像路径和标签。

我一直收到这个错误:InvalidArgumentError: logits and labels must have the same first dimension, got logits shape [1,50] and labels shape [50]

我的模型基于Keras提供的预训练ResNet模型:

base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(None, None, 3))
for layer in base_model.layers:
    layer.trainable = False
x = base_model.output
x = GlobalAveragePooling2D()(x)

for fc in FC_LAYERS:
    x = Dense(fc, activation='relu')(x)
    x = Dropout(DROPOUT)(x)

output    = Dense(NUM_CATEGORIES, activation='softmax', name='fully-connected')(x)
model     = Model(inputs=base_model.input, outputs=output)
optimizer = tf.keras.optimizers.SGD(lr=LEARNING_RATE)
cce       = tf.keras.losses.CategoricalCrossentropy()

model.compile(optimizer, loss=cce)
return model

它训练如下:

model_classification.fit(
    ds,
    epochs=epochs,
    steps_per_epoch=steps
)

这对我来说似乎很直截了当。

任何帮助,将不胜感激。

谢谢。

python tensorflow keras tensorflow-datasets
1个回答
0
投票

我终于尝试了一些有效的方法。

以下是您需要更改的行:

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

我不知道为什么,但这使事情有效。

© www.soinside.com 2019 - 2024. All rights reserved.