keras TypeError:“ReadFile”操作的输入“filename”具有与预期的字符串类型不匹配的类型float32

3zwtqj6y  于 2022-11-30  发布在  其他
关注(0)|答案(7)|浏览(462)

我正在运行教程中的以下代码: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)

但是就我一整天都在想怎么解决这个错误来说,什么都没有改变,没有任何成功。有人能帮我吗?谢谢...

s8vozzvw

s8vozzvw1#

我发现最简单的方法是创建一个子文件夹,并将文件复制到该子文件夹。即,假设您的文件是0.jpg,1.jpg,2.jpg ...2000.jpg,并在名为“patterns”的目录中。
似乎Keras API不接受它,因为文件是用数字命名的,对于Keras,它是在float32中。
要解决这个问题,您可以按照建议重命名文件,或者您可以简单地在“patterns”下创建一个子文件夹(即“patterndir”)。
Keras(内部)可能使用子目录名称,并可能将其附加在图像文件前面,从而使其成为字符串(sth like 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,
)
0md85ypi

0md85ypi2#

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

pdtvr36n

pdtvr36n3#

只需创建一个子目录并将文件移到那里。
如果文件在这里:

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

b1payxdu4#

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

5vf7fwbs

5vf7fwbs5#

我刚刚用tensorflow==2.4.4也遇到了这个TypeError: Input 'filename' of 'ReadFile' Op has type float32 that does not match expected type of string.错误。
我用validation_split进行了试验:

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

结论:该错误的已知根本原因是确认集中没有图像。

修复失败

根据this answer,我通过os.rename将文件重命名为1.jpg2.jpg3.jpg......不起作用:/
根据this answer,谈论一个图像/类别是错误的,一个类别中只有一个图像是可以的。

14ifxucb

14ifxucb6#

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

bwleehnv

bwleehnv7#

出现此异常后,您必须检查以下几项内容:
1.您是否有足够的数据用于培训?
如果您的训练集中只有有限的数据,就会出现这个例外。我猜如果您要分割数据,数据量应该可以被10整除(例如validation_split=0.1)。
1.您的图像格式是否有效?
此方法只允许格式为('. bmp','. gif','. jpeg','. jpg','. png').无效得格式将出现此异常.
老实说,这个异常并没有给予很多关于发生了什么的信息。希望在不久的将来会更新。

相关问题