2016-12-15 47 views
4

我在Keras上阅读了一些关于数据增加的材料,但它对我来说仍然有点模糊。是否有任何参数控制数据增加步骤中从每个输入图像创建的图像数量?在this example中,我看不到任何控制从每个图像创建的图像数量的参数。Keras数据增加参数

例如,在下面的代码中,我可以有一个参数(num_imgs),用于控制从每个输入图像创建并存储在名为preview的文件夹中的图像数量;但在实时数据增强中,此目的没有任何参数。

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img 
num_imgs = 20 
datagen = ImageDataGenerator(
     rotation_range=40, 
     width_shift_range=0.2, 
     height_shift_range=0.2, 
     shear_range=0.2, 
     zoom_range=0.2, 
     horizontal_flip=True, 
     fill_mode='nearest') 

img = load_img('data/train/cats/cat.0.jpg') # this is a PIL image 
x = img_to_array(img) # this is a Numpy array with shape (3, 150, 150) 
x = x.reshape((1,) + x.shape) # this is a Numpy array with shape (1, 3, 150, 150) 

# the .flow() command below generates batches of randomly transformed images 
# and saves the results to the `preview/` directory 
i = 0 
for batch in datagen.flow(x, batch_size=1, 
          save_to_dir='preview', save_prefix='cat', save_format='jpeg'): 
    i += 1 
    if i > num_imgs: 
     break # otherwise the generator would loop indefinitely 

回答

6

数据扩充的工作原理如下:在与所述规定的范围内随机选择的参数的每个学习历元转换应用于在训练集合中的所有原始图像。在历元完成后,即在将学习算法暴露给整组训练数据之后,开始下一个学习历元,并且通过对原始训练数据应用指定的变换再次增强训练数据。

以这种方式,每个图像增强的次数等于学习历元的数量。召回形式the example that you linked

# Fit the model on the batches generated by datagen.flow(). 
model.fit_generator(datagen.flow(X_train, Y_train, 
        batch_size=batch_size), 
        samples_per_epoch=X_train.shape[0], 
        nb_epoch=nb_epoch, 
        validation_data=(X_test, Y_test)) 

这里datagen对象将公开训练设置为modelnb_epoch倍,所以每幅图像将被增强nb_epoch倍。通过这种方式,学习算法几乎从不会看到两个完全相同的训练样例,因为在每个时期训练样例都是随机变换的。

+0

感谢您的有用评论。所以,如果我总共有1000张图像,那么在每个时期,从原始图像中生成1000张新图像,并馈入模型进行训练。然后,在下一个时期,从原始图像生成1000个新图像并馈入模型中以进行训练,等等。所以,模型可能永远不会看到原始数据,对吧? – SaraG

+0

另一种方法是生成和存储新图像,然后使用它来训练我们的模型。例如,如果我从每个输入图像生成10个图像,那么我将有10,000个新图像。所以,我完全有11,000张图像用于训练。哪一种方法更好? – SaraG

+1

是的,你是对的,模型可能永远不会看到原始数据。应用的转换越多,模型将看到原始数据的概率就越小。转换参数的范围也影响该概率。你在第二条评论中提出的方法似乎也很合理。很难说哪一个更好,我会尝试两种替代方案,并选择能够产生最佳结果的方案! –

3

这里基本上它是如何工作的,它只是为每个输入图像的一个图像,所有输入图像已经生成了一次之后,它会重新开始。

在你的例子中,因为总共只有一个输入图像,它会重复生成该图像的不同版本,直到二十个。

可以看看源代码在这里