InvalidArgumentError:登录件和标签的第一维度必须相同

时间:2019-04-25 18:27:26

标签: python tensorflow keras tensorflow-datasets

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

但是,我正尝试使用 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
)

对我来说似乎很简单。

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

我终于尝试了可行的方法。

这是您需要更改的行:

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

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