我一直在使用存储在本地驱动器上的训练图像来开发一个U-Net模型。为了加载这些数据,我一直在使用Keras的ImageDataGenerator.flow_from_dataframe方法,并可选择地应用一些增强。
我对此没有任何问题,但当我从流中检索批量数据时,我注意到了一些奇怪的行为。
在下面的简化示例中,我从一个目录加载8位RGB文件并设置种子--我在本例中省略了增强参数,但是在有和不存在的情况下得到了相同的行为。
为了QA/QC的目的,我通常会得到一个批处理,并查看随机选择的图像。然而,当我得到一个批处理并生成一些随机图像索引时,我总是得到相同的结果。这只发生在批处理生成之后,而不是流生成器对象的初始化。
# Step 1
# Set up image data flow
img_generator = ImageDataGenerator(rescale=1/255.)
train_gen = img_generator.flow_from_dataframe(
img_df, # filnames are read from column "filename"
img_dir, # local directory containing image files
y_col=None,
target_size=(512,512),
class_mode=None,
shuffle=False, # I'm using separate mask images so no shuffling here
batch_size=16,
seed=42 # behavior occurs when using seed
)
# Step 2
# Generate and print 8 random indices
# No batch of images retrieved yet; no use of seed
print(np.random.randint(16, size=8))
>>> [ 7 15 13 3 6 3 2 14] # always random
# Step 3
# Now get a batch of images; seed is used
batch = next(train_gen)
# Step 4
# Generate and print 8 random indices
print(np.random.randint(16, size=8))
>>> [ 6 1 3 8 11 13 1 9] # always the same result使用42的种子,每次执行步骤1和2时,步骤2的输出都会发生变化。这是预期的行为,因为步骤1不应该影响步骤2。但是,一旦在步骤3中从生成器中检索到批处理,步骤4总是返回相同的索引。
这种行为会随着新批次的产生而继续;种子在每一次产量上都会发生变化,因此每一批都返回不同的指数,但总是相同的指数。
将种子设置为42,前几批之后生成的指数如下:
>>> [ 6 1 3 8 11 13 1 9] # Batch 1
>>> [10 10 5 5 5 8 10 11] # Batch 2
>>> [ 5 3 0 10 4 9 15 2] # Batch 3这表明,当生成一批图像时,全局numpy种子将被更改。在实际中,我总是检查相同的图像样本。当不提供种子参数时,全局种子保持不变,并且没有类似的输出。
我想知道其他人是否遇到过这种情况--这是一个错误还是我误解了什么?
发布于 2021-06-19 12:49:42
进一步的调查证实,在这种情况下,Keras确实修改了全局随机数生成器。
repo具有主动问题和PRs,它们通过使用本地随机状态(例如这问题)来解决库的其他区域中的这种行为。
https://datascience.stackexchange.com/questions/96820
复制相似问题