类型错误:"读取文件"操作的输入"文件名"的类型 float32 与预期的字符串类型不匹配



我在这里运行本教程中的代码: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)

但就错误而言没有任何变化 我整天都在试图弄清楚如何解决它,但没有任何成功。有人可以帮助我吗?谢谢。。。

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

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

要解决此问题,您可以按照一个答案的建议重命名文件,也可以简单地在"模式"(即"模式"(下创建一个子文件夹。所以现在你的图像文件在...\模式\模式目录下

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,
)

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

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

因此,如果文件在这里:

'/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))

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

我也遇到了这个TypeError: Input 'filename' of 'ReadFile' Op has type float32 that does not match expected type of string.错误tensorflow==2.4.4.

我玩了validation_split

  • 发生错误:validation_split=0.001
    • 我这样做是为了在验证集中有 0 张图像。
  • 错误未发生:validation_split=0.2
    • 这将导致 1 张图像用于验证

结论:此错误的已知根本原因是验证集中有 0 个图像。

<小时 />

失败的修复

根据这个答案,我通过os.rename将我的文件重命名为1.jpg2.jpg3.jpg,...没用:/

根据这个答案谈论一个图像/类别,这是错误的,一个类别中只有一个图像是可以的。

其中一个问题与图像下载有关。如果未下载指定的图像文档,则也会显示相同的错误。

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

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

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

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

此方法仅允许 ('.bmp'、'.gif'、'.jpeg'、'.jpg'、'.png'( 中的格式。格式无效将出现此异常。

老实说,该异常并没有提供太多关于正在发生的事情的信息。希望在不久的将来会更新。

相关内容

最新更新