我正在尝试对图像进行分类。这些图像具有不同的形状,但这不是问题。
但是,我正尝试使用 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
)
对我来说似乎很简单。
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:0)
我终于尝试了可行的方法。
这是您需要更改的行:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
我不知道为什么,但这使事情奏效。