在机器学习中,改组如何与 ImageDataGenerator 一起工作?

Posted

技术标签:

【中文标题】在机器学习中,改组如何与 ImageDataGenerator 一起工作?【英文标题】:How does shuffling work with ImageDataGenerator in Machine Learning? 【发布时间】:2019-01-28 20:51:55 【问题描述】:

我正在使用 Inception V3 创建一个图像分类模型,并且有两个类。我已将我的数据集和标签拆分为两个 numpy 数组。数据拆分为 trainX 和 testY 作为图像,trainY 和 testY 作为相应的标签。

data = np.array(data, dtype="float")/255.0
labels = np.array(labels,dtype ="uint8")

(trainX, testX, trainY, testY) = train_test_split(
                                data,labels, 
                                test_size=0.2, 
                                random_state=42) 

train_datagen = keras.preprocessing.image.ImageDataGenerator(
          zoom_range = 0.1,
          width_shift_range = 0.2, 
          height_shift_range = 0.2,
          horizontal_flip = True,
          fill_mode ='nearest') 

val_datagen = keras.preprocessing.image.ImageDataGenerator()


train_generator = train_datagen.flow(
        trainX, 
        trainY,
        batch_size=batch_size,
        shuffle=True)

validation_generator = val_datagen.flow(
                testX,
                testY,
                batch_size=batch_size) 

当我使用 ImageDataGenerator 对 train_generator 进行 shuffle 时,图像是否仍会匹配相应的标签?验证数据集也应该洗牌吗?

【问题讨论】:

【参考方案1】:

是的,图像仍将匹配相应的标签,因此您可以安全地将shuffle 设置为True。在引擎盖下,它的工作原理如下。在ImageDataGenerator 上调用.flow() 将返回一个NumpyArrayIterator 对象,该对象实现了以下用于洗牌索引的逻辑:

def _set_index_array(self):
    self.index_array = np.arange(self.n)
    if self.shuffle: # if shuffle==True, shuffle the indices
        self.index_array = np.random.permutation(self.n) 

self.index_array 然后用于生成图像 (x) 和标签 (y)(为了便于阅读,代码被截断):

def _get_batches_of_transformed_samples(self, index_array):
    batch_x = np.zeros(tuple([len(index_array)] + list(self.x.shape)[1:]),
                       dtype=self.dtype)
    # use index_array to get the x's
    for i, j in enumerate(index_array):
        x = self.x[j]
        ... # data augmentation is done here
        batch_x[i] = x
     ...
     # use the same index_array to fetch the labels
     output += (self.y[index_array],)

    return output

自己查看source code,它可能比您想象的更容易理解。

改组验证数据应该没有太大关系。改组的主要目的是在训练过程中引入一些额外的随机性。

【讨论】:

【参考方案2】:

随机播放默认为“True”,因此您必须添加

 train_generator = train_datagen.flow(
        trainX, 
        trainY,
        batch_size=batch_size,
        shuffle=False)

【讨论】:

以上是关于在机器学习中,改组如何与 ImageDataGenerator 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyspark 中基于正则表达式条件验证(和删除)列,而无需多次扫描和改组?

改组/排列熊猫中的DataFrame

在 Django 1.5 中更改组的应用程序标签

Phaser - 如何更改组的精灵图像?

R根据条件更改组中的最小值

机器学习如何与大数据融合?