Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将图像从磁盘添加到Tensorflow数据集_Python_Tensorflow_Tensorflow Datasets_Data Pipeline - Fatal编程技术网

Python 将图像从磁盘添加到Tensorflow数据集

Python 将图像从磁盘添加到Tensorflow数据集,python,tensorflow,tensorflow-datasets,data-pipeline,Python,Tensorflow,Tensorflow Datasets,Data Pipeline,我正在使用Tensorflow数据集的tfds.load函数加载我的数据: import tensorflow_datasets as tfds import tensorflow as tf (raw_train, raw_validation, raw_test), metadata = tfds.load( 'cats_vs_dogs', split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'], with_in

我正在使用Tensorflow数据集的
tfds.load
函数加载我的数据:

import tensorflow_datasets as tfds
import tensorflow as tf

(raw_train, raw_validation, raw_test), metadata = tfds.load(
    'cats_vs_dogs',
    split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
    with_info=True,
    as_supervised=True,
)
现在,我在本地pc上有一些猫和狗的附加图像(例如
Cat1.jpg
)。我想把它们添加到这些数据中。我该怎么做

注意,我不仅仅有一个文件,还有很多,而且这只是一个二进制分类的例子;同样的问题也适用于多类分类,所以最好也有一个解决方案


更新:我尝试了不同的方法,比如尝试每晚使用tf从目录中读取tf.keras.preprocessing.image\u dataset\u的图像,但不幸的是,这并不是那么容易。有很多问题,比如结果数据集的数据类型不同,无法与原始数据集合并。我没有解决这个问题的办法。我对它很感兴趣,因为我真的需要详细的代码,一个有效的解决方案,而不仅仅是一些一般性的想法,理论上如何实现这一点。我不需要一个解决方案与图像_数据集_从_目录,如果有人有任何解决方案,详细的代码,这是工作,我很好

我不想发布任何代码,因为我认为有更好的方法来解决这个问题。但是,请找到我在这里尝试的方式(在colab中):

tmp中有一个测试文件夹。一个子文件夹是cat,另一个子文件夹是dog。包括一些随机图片从搜索猫和狗

生成的序列是一个

例如,原始列车是

ds现在是一个

无法解决此问题,因为数据未正确匹配/连接。此外,在多类情况下,我无法控制检查标签的匹配

因此,我不需要任何关于如何在理论上实现这一目标的一般性思考。我需要一个详细的工作方案,详细的代码。不仅仅是这个例子中的二进制,我也需要它来解决多类问题,因为我也有这个问题。因此,在多类情况下,如何将“读入标签”与tfds.load生成的标签相匹配。没有遗漏匹配,比如混合类等等。例如,猫变成马(在猫对狗对马的情况下)

第二种方式: 我还尝试将ImageDataGenerator直接指向原始列车数据集。如果这样做有效的话,我本来可以继续使用ImageDataGenerator,尽管我实际上并不希望这样。所以我只想将图像添加到原始列车数据集中。我试过这个:

from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_image_generator = ImageDataGenerator(
    rescale=1./255,
)

train_datagen = train_image_generator.flow_from_directory(
  directory=raw_train,
  target_size=(224, 224),
  shuffle=True,
  batch_size=128,
  class_mode='binary'
)

然后匹配/连接这些数据生成器的结果。但是不可能只在原始序列上指出它,它会给出一个错误。

tfds.load返回的对象是的实例。因此,您可以为本地图像构建一个新的
tf.data.Dataset
实例,然后使用方法将它们连接在一起。要从磁盘上的图像构建这样的数据集,至少有三种不同的方法:

  • 您可以使用新添加的函数。目前,该功能仅在tf每晚提供。您可以找到使用此函数的示例

  • 或者,您可以使用
    tf.data
    API对加载过程进行更多控制,并对图像及其标签进行进一步转换。这是一个如何实现这一点的示例

  • 或者,您可以首先使用任何库/方法作为Numpy数组加载图像,还可以构建另一个与其标签对应的数组。然后您可以使用方法创建一个
    tf.data.Dataset
    实例。你可以找到一个例子。请注意,如果您有大量图像,则不建议使用此方法(这反过来意味着构造的Numpy阵列的大小将非常大,从而导致数据管道内存浪费或无法构建)


我悬赏,因为我需要一个有效的解决方案。我尝试了您在这里描述的方法,但是存在很多问题,例如,来自image\u dataset\u的数据集与来自\u目录的数据集位于完全不同的数据类型中,因此无法与原始数据集连接。@对于我提到的每种方法,统计员,我提供了一个链接作为指导,帮助您了解它是如何工作的,并让您自己实现它。阅读它们并根据您的用例调整它们是您的责任。如果您遇到任何错误或障碍,您需要在单独的问题中寻求详细信息的帮助。让我提醒你,这个网站不是你和你的特定用例的家庭作业/项目解决方案。在这个问题上可能有几十种变化(数组的数据类型、图像的格式、规范化、标签的格式等)。>>@统计学家>>>>因此,您有责任根据您的特定用例调整这些解决方案,并在出现任何错误时寻求帮助(当然,在单独的问题中并提供足够的详细信息)。我们不会为您或任何其他人介绍数十种变体,以便您轻松解决家庭作业/项目/工作任务。最后,悬赏并不能证明“我需要一个针对我的特定用例的完整工作解决方案”的期望是合理的;特别是当有一些指南/文件涵盖了这一点(并且在我的回答中已经链接到了这些指南/文件)。
import os
import shutil

os.listdir("/tmp/Test") #First find where the ".ipynb_checkpoints" is located.

shutil.rmtree("/tmp/Test/.ipynb_checkpoints")

import tensorflow_datasets as tfds
(raw_train, raw_validation, raw_test), metadata = tfds.load(
    'cats_vs_dogs',
    split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
    with_info=True,
    as_supervised=True,
)
  def _normalize_img(img, label):
  img = tf.cast(img, tf.float32) / 255.
  img = tf.image.resize(img, (224,224))
  label = tf.cast(label, tf.int64)
  img = tf.cast(img, tf.uint8)
  return (img, label)
  # ds = tfds.load('mnist', split='train', as_supervised=True)
  ds = raw_train.map(_normalize_img)
test=ds.concatenate(raw_train)
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_image_generator = ImageDataGenerator(
    rescale=1./255,
)

train_datagen = train_image_generator.flow_from_directory(
  directory=raw_train,
  target_size=(224, 224),
  shuffle=True,
  batch_size=128,
  class_mode='binary'
)