【发布时间】:2019-09-15 06:07:57
【问题描述】:
我正在尝试对图像进行分类。这些图像具有不同的形状,但这不是问题。
但是,我正在尝试使用 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
)
这对我来说似乎很简单。
任何帮助将不胜感激。
谢谢。
【问题讨论】:
-
如果您在 read_labels 函数中尝试 yield [one_hot] 会怎样?
-
@alift 是的,就像我返回矩阵还是 1D np 数组一样。我仍然得到同样的错误。我还尝试用 numpy 扩展 dims。感谢您的帮助
标签: python tensorflow keras tensorflow-datasets