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