InvalidArgumentError: логиты и метки должны иметь одинаковое первое измерение - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь классифицировать изображения. Эти изображения имеют разные формы, но это не проблема.

Однако я пытаюсь создать набор данных с помощью функции tf.data.Dataset.from_generator, предоставляемой Tensorflow , и у меня возникает ощущение, что что-то работает не так, как должно.

Вот код:

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)

Я также пытался создать label_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]

Моя модель основана на предварительно обученной ResNet модели, предоставленной Keras:

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 голосов
/ 28 апреля 2019

Я наконец-то попробовал что-то, что сработало.

Вот строка, которую нужно изменить:

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

Не знаю почему, но это заставило все работать.

...