【问题标题】:TypeError: Input 'filename' of 'ReadFile' Op has type float32 that does not match expected type of stringTypeError:“ReadFile”Op 的输入“文件名”的类型为 float32,与预期的字符串类型不匹配
【发布时间】:2020-10-04 06:57:41
【问题描述】:

我正在从这里的教程中运行这段代码:https://keras.io/examples/vision/image_classification_from_scratch/

使用自定义数据集,如教程中那样分为 2 个数据集。但是,我收到了这个错误:

TypeError: Input 'filename' of 'ReadFile' Op has type float32 that does not match expected type of string.

我做了这个选角。我试过这个:

is_jfif = str(tf.compat.as_bytes("JFIF")) in fobj.peek(10)

但就错误而言没有任何改变 我整天都在想办法解决它,但没有任何成功。有人能帮我吗?谢谢...

【问题讨论】:

  • 请提供完整的错误输出,以及minimal reproducible example
  • 查看(并发布)整个回溯。换句话说,确切的错误。您的代码行与filenameReadFile 无关。
  • 我想我修好了,谢谢你的时间...
  • @just_learning 你如何解决这个问题
  • 我在 colab 中运行过

标签: python keras


【解决方案1】:

文件名采用 float32 格式。
重命名数据集中的所有图像可以解决问题。
使用os.rename() 循环遍历所有文件。

【讨论】:

  • 将文件重命名为什么?如果我的文件例如 patterns/class1/image1.png 等,我应该将它们重命名为什么?
【解决方案2】:

我发现最简单的方法是创建一个子文件夹并将文件复制到该子文件夹。 即假设您的文件是 0.jpg、1.jpg、2.jpg....2000.jpg 并且在名为“patterns”的目录中。

似乎 Keras API 不接受它,因为文件是按数字命名的,而对于 Keras,它位于 float32 中。

要解决此问题,您可以按照一个答案的建议重命名文件,或者您可以简单地在“patterns”(即“patterndir”)下创建一个子文件夹。所以现在你的图像文件在 ...\patterns\patterndir

Keras(内部)可能使用子目录名称,并可能将其附加到图像文件的前面,从而使其成为字符串(诸如 patterndir_01.jpg、patterndir_02.jpg 之类的东西)[注意这是我的解释,并不意味着是真的]

当你这次编译它时,你会看到它可以工作,你会得到一个编译器消息:

Found 2001 files belonging to 1 classes.
Using 1601 files for training.
Found 2001 files belonging to 1 classes.
Using 400 files for validation.

我的代码是这样的

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

#Generate a dataset

image_size = (28, 28)
batch_size = 32

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    "patterns",
    validation_split=0.2,
    subset="training",
    seed=1337,
    image_size=image_size,
    batch_size=batch_size,
)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    "patterns",
    validation_split=0.2,
    subset="validation",
    seed=1337,
    image_size=image_size,
    batch_size=batch_size,
)

【讨论】:

  • 如果您的批量大小为 32,您将如何加载其余图像,请解释!
  • 即使文件没有命名为1.jpg, 2.jpg, ...也会产生错误
【解决方案3】:

就我而言,我只是在训练目录中没有足够的样本。每个类别有一个,我得到了错误。

【讨论】:

    【解决方案4】:

    出现此异常后,您必须检查几件事:

    1. 您有足够的数据进行训练吗?

    如果您的训练集中只有有限的数据,则会出现此异常。我猜如果要拆分数据,数据量应该能被10整除(以validation_split=0.1为例)。

    1. 您的图片格式是否有效?

    此方法仅允许 ('.bmp', '.gif', '.jpeg', '.jpg', '.png') 格式。无效格式会出现这个异常。

    老实说,这个异常并没有提供太多关于到底发生了什么的信息。希望不久的将来会更新。

    【讨论】:

      【解决方案5】:

      只需创建一个子目录并将文件移动到那里。

      所以如果文件在这里:

      '/home/dataset_28/'
      

      把它们放在这里:

      '/home/dataset_28/files/'
      

      然后这样做:

      from tensorflow.keras.preprocessing import image_dataset_from_directory
      image_dataset_from_directory('/home/dataset_28/', batch_size=1, image_size=(28, 28))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 1970-01-01
        • 2021-05-04
        • 2021-01-06
        相关资源
        最近更新 更多