Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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 ImageDataGenerator是否向我的数据集添加更多图像?_Python_Tensorflow_Machine Learning_Keras_Computer Vision - Fatal编程技术网

Python ImageDataGenerator是否向我的数据集添加更多图像?

Python ImageDataGenerator是否向我的数据集添加更多图像?,python,tensorflow,machine-learning,keras,computer-vision,Python,Tensorflow,Machine Learning,Keras,Computer Vision,我正在尝试使用Inception V3模型进行图像分类。Keras的ImageDataGenerator是否创建新图像并添加到我的数据集中?如果我有1000张图片,使用此功能是否会将用于培训的2000张图片翻倍?有没有办法知道有多少图像被创建并现在输入到模型中?简短回答:1)所有原始图像都只是变换(即旋转、缩放等)每个历元然后用于训练,2)[因此]每个历元中的图像数等于您拥有的原始图像数 详细回答:在每个历元中,将对您拥有的图像应用变换,并使用变换后的图像进行训练。变换集包括旋转、缩放等。通过这

我正在尝试使用Inception V3模型进行图像分类。Keras的
ImageDataGenerator
是否创建新图像并添加到我的数据集中?如果我有1000张图片,使用此功能是否会将用于培训的2000张图片翻倍?有没有办法知道有多少图像被创建并现在输入到模型中?

简短回答:1)所有原始图像都只是变换(即旋转、缩放等)每个历元然后用于训练,2)[因此]每个历元中的图像数等于您拥有的原始图像数

详细回答:在每个历元中,将对您拥有的图像应用变换,并使用变换后的图像进行训练。变换集包括旋转、缩放等。通过这样做,您可以以某种方式创建新数据(即也称为数据增强),但显然生成的图像与原始图像并没有完全不同。通过这种方式,学习的模型可能更加稳健和准确,因为它是针对同一图像的不同变化进行训练的

您需要将
fit
方法的
steps\u per\u epoch
参数设置为
n\u samples/batch\u size
,其中
n\u samples
是您拥有的训练数据总数(即在您的情况下为1000)。这样,在每个历元中,每个训练样本仅增加一次,因此在每个历元中将生成1000个变换图像

此外,我认为有必要在此背景下澄清“增强”的含义:基本上,当我们使用
ImageDataGenerator
并启用其增强功能时,我们是在增强图像。但是这里的“增强”一词并不意味着,比如说,如果我们有100个原始训练图像,那么在增强后每个历元会有1000个图像(即每个历元的训练图像数量不会增加)。相反,这意味着我们在每个时代对每个图像使用不同的变换;因此,如果我们训练我们的模型,比如说,5个时代,我们在训练中使用了每个原始图像的5个不同版本(或者在整个训练中使用100*5=500个不同的图像,而不是在整个训练中仅使用100个原始图像)。换句话说,在整个训练过程中,从开始到结束,唯一图像的总数都在增加,而不是每个历元。

正如官方编写的
ImageDataGenerator
是一个具有实时数据增强功能的张量图像数据批量生成器。数据将循环(成批)。这意味着将动态地对一批图像应用变换随机。例如:

train_datagen = ImageDataGenerator(
    rescale=1./255, #scale images from integers 0-255 to floats 0-1.
    shear_range=0.2,
    zoom_range=0.2, # zoom in or out in images
    horizontal_flip=True) #horizontal flip of images

在每一个新的时代,新的随机变换将被应用,这样我们每次都会用一组稍微不同的图像进行训练。获取更多数据并非总是可以实现或可能的,使用
ImageDataGenerator
这样做很有帮助。

还要注意:这些增强图像不存储在内存中,它们是在训练时动态生成的,训练后丢失。你不能再阅读那些增强图像了


不存储这些图像是一个好主意,因为我们很快就会耗尽内存来存储大量图像

这一切都取决于你运行了多少个纪元,正如@today所回答的那样,使用生成器安装模型将使生成器根据需要提供尽可能多的图像,具体取决于
每个纪元的步骤

为了使事情更容易理解,将20个图像放入两个任意文件夹(模拟分类数据),从父文件夹创建一个生成器,并运行一个简单的for循环

count = 0
for image, label in my_test_generator:
    count += 1
    print(count)

首先,您应该确认您看到的消息是
找到了属于两个类的20个图像。
,循环本身在20次迭代后不会停止,但它会不断增加并无休止地打印(我将我的设置为10k并手动停止)。生成器将提供所需的尽可能多的图像,无论它们是否被增强。

以下是我试图回答的问题,因为我也想到了这个问题

ImageDataGenerator
不会将新图像添加到数据集中,因为它不会使您的纪元变大。相反,在每个历元中,它将提供稍微改变的图像(取决于您的配置)。无论你有多少个时代,它都会生成新的图像

因此,在每个时代,模型将在不同的图像上进行训练,但不会有太大的差异。这将防止过度拟合,并在某种程度上模拟在线学习

所有这些更改都发生在内存中,但如果您想查看这些图像,可以将它们保存到光盘中,检查它们,查看生成了多少图像,并了解
ImageDataGenerator
的工作原理。要执行此操作,请将
save_To_dir=/tmp/img data gen outputs
传递到函数
flow_from_directory
。看

ImageDataGenerator类确保模型接收新的 图像在每个时代的变化。但它只返回 转换后的图像,不将其添加到 图像。如果事实上是这样,那么模型就会看到 原始图像多次出现,这肯定会超出我们的 模型


@这里的船长扩充并不是指增加(完全不同的)训练样本的数量。相反,它是创建现有训练样本的不同变体的过程。因此,正如我提到的,生成的图像与现有的训练样本并没有完全不同;相反,它们只是它们的随机变换。这就是为什么除了
n个样本/批次大小
之外,将
每个历元的步数
设置为任何其他值都没有意义。如果您执行
step\u per\u epoch=2*(n\u samples/batch\u size)
则每个epoch实际上将是正常情况下的两个epoch。@Marko I am sorr