Я пытаюсь классифицировать изображения. Эти изображения имеют разные формы, но это не проблема.
Однако я пытаюсь создать набор данных с помощью функции 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
)
Что мне кажется довольно простым.
Буду признателен за любую помощь.
Спасибо.