python - 在机器学习中,改组如何与 ImageDataGenerator 一起工作?
问题描述
我正在使用 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 时,图像是否仍会匹配相应的标签?验证数据集也应该改组吗?
解决方案
是的,图像仍将匹配相应的标签,因此您可以安全地设置shuffle
为True
. 在引擎盖下,它的工作原理如下。调用.flow()
将ImageDataGenerator
返回一个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
自己查看源代码,它可能比你想象的更容易理解。
改组验证数据不应该太重要。改组的主要目的是在训练过程中引入一些额外的随机性。
推荐阅读
- bash - 在 Bash 脚本中模拟 TAB 键以自动完成
- c# - 在 .NET Core 上创建 HttpMessageHandler 并可以向自己发出请求
- c# - 发送网络推送通知并收到意外响应代码:401 & 403
- android - android中的按钮忽略背景可绘制资源
- javascript - 如何在 PHP(Laravel) 中生成 Cloudinary 身份验证签名
- node.js - 如何为nodejs html-pdf设置dpi
- ios - UITableViewCell setHighlighted:(BOOL)highlighted 始终为 false
- jenkins - 用环境值替换文件内容 - Jenkins
- sql - 管理工作室查询
- database - 将变量从一个 sql 脚本传递到另一个作为参数