【问题标题】:tensorflow 2.0 keras training with ImageDataGenerator + flow_from_directory + tf.data.Dataset gives "shape" related errortensorflow 2.0 keras 训练 ImageDataGenerator + flow_from_directory + tf.data.Dataset 给出“形状”相关错误
【发布时间】:2020-03-23 22:36:31
【问题描述】:

我正在尝试将我的生成器包装到 tf.data.Dataset 中(只是为了了解这一点)。 这是我的sn-p。希望有人能发现我做错了什么。

img_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)

gen = img_gen.flow_from_directory(data_path, target_size=(224, 224), batch_size=32)

dataset = tf.data.Dataset.from_generator(
            lambda: gen,
            output_types = (tf.float32, tf.float32),
            output_shapes = ([32, 224, 224, 3], [32, 6]),
)

model.fit(dataset, 
          steps_per_epoch = gen.n // 32, 
          epochs=10)

ValueError: generator 产生了一个形状为 (11, 224, 224, 3) 的元素,而预期的形状为 (32, 224, 224, 3) 的元素。

【问题讨论】:

    标签: tensorflow keras tensorflow-datasets


    【解决方案1】:

    如果我改变了这个,我会“出现”来解决这个问题:

    dataset = tf.data.Dataset.from_generator(
        lambda: gen,
        output_types = (tf.float32, tf.float32),
        # output_shapes = ([32, 224, 224, 3], [32, 6]),
        output_shapes = ([None, 224, 224, 3], [None, 6]),
    )
    

    即在这段代码中,我没有将其显式批量大小设为 32,而是将其替换为 None。它显然不再抱怨 (11, 224, 224, 3),剩下的批次。但是有没有办法让数据集在最后采样 32?只需滚动到火车组的“起点”。有些东西对我来说仍然很可疑。

    我启动了 .fit,它显然正在工作,损失在下降,准确性在每个时期都在上升。

    如果有人有更好的方法或解释,请告诉我。

    【讨论】:

    • 在输出形状中为批处理维度指定无是可行的方法。或者,您可以使用 skip_remainder=True 在数据集上调用 .batch()
    猜你喜欢
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2020-06-14
    • 2019-05-06
    • 2021-05-10
    • 2019-10-20
    相关资源
    最近更新 更多