【发布时间】:2026-01-25 16:55:01
【问题描述】:
我写了一个自定义的 Keras ImageDataGenerator: 从磁盘加载图像。逻辑是:在无限循环中,使用来自文件名数组的随机值初始化批处理,加载这些文件,仅此而已。
问题似乎出在“init”部分。我使用 file 转储生成的文件名,发现它们总是相同的,好像 randint 每次都返回相同的数组。有什么我错过的想法吗?
我首先引用代码,然后引用它生成的文件。
datagen = ImageDataGenerator(
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
zoom_range=0.2)
def image_generator(image_file_names, labels):
i = 0
while True:
arr_idx = np.random.randint(len(image_file_names), size = BATCH_SIZE)
batch_file_names = image_file_names[arr_idx]
batch_labels = labels[arr_idx]
text_file = open("log1.txt", "a")
text_file.write("\n".join(batch_file_names))
text_file.write("\n%s===================\n" % i)
i = i + 1
text_file.close()
batch_images = []
for input_path in batch_file_names:
img = load_img("../input/train/" + input_path,
target_size=(IMAGE_SIZE, IMAGE_SIZE), grayscale=True)
img = img_to_array(img)
img = datagen.random_transform(img, seed=42)
img = img / 255.
batch_images += [img]
batch_images = np.array(batch_images)
yield(batch_images, batch_labels)
d5896c9a0.jpg
d0c025463.jpg
a94abfec3.jpg
93d091bc1.jpg
0706d4216.jpg
2949b6643.jpg
545874c14.jpg
c04b414b2.jpg
ccfd02948.jpg
7be9c59f8.jpg
c74822baf.jpg
74e611f3c.jpg
c7a2fd5e2.jpg
a9269fb58.jpg
b81462e5b.jpg
88285e65a.jpg
0
===================
d5896c9a0.jpg
d0c025463.jpg
a94abfec3.jpg
93d091bc1.jpg
0706d4216.jpg
2949b6643.jpg
545874c14.jpg
c04b414b2.jpg
ccfd02948.jpg
7be9c59f8.jpg
c74822baf.jpg
74e611f3c.jpg
c7a2fd5e2.jpg
a9269fb58.jpg
b81462e5b.jpg
88285e65a.jpg
0
===================
d5896c9a0.jpg
d0c025463.jpg
a94abfec3.jpg
93d091bc1.jpg
0706d4216.jpg
2949b6643.jpg
545874c14.jpg
c04b414b2.jpg
ccfd02948.jpg
7be9c59f8.jpg
c74822baf.jpg
74e611f3c.jpg
c7a2fd5e2.jpg
a9269fb58.jpg
b81462e5b.jpg
88285e65a.jpg
0
===================
d5896c9a0.jpg
d0c025463.jpg
a94abfec3.jpg
93d091bc1.jpg
0706d4216.jpg
2949b6643.jpg
545874c14.jpg
c04b414b2.jpg
ccfd02948.jpg
7be9c59f8.jpg
c74822baf.jpg
74e611f3c.jpg
c7a2fd5e2.jpg
a9269fb58.jpg
b81462e5b.jpg
88285e65a.jpg
0
===================
d5896c9a0.jpg
d0c025463.jpg
a94abfec3.jpg
93d091bc1.jpg
0706d4216.jpg
2949b6643.jpg
545874c14.jpg
c04b414b2.jpg
ccfd02948.jpg
7be9c59f8.jpg
c74822baf.jpg
74e611f3c.jpg
c7a2fd5e2.jpg
a9269fb58.jpg
b81462e5b.jpg
88285e65a.jpg
0
===================
d5896c9a0.jpg
d0c025463.jpg
a94abfec3.jpg
93d091bc1.jpg
0706d4216.jpg
2949b6643.jpg
545874c14.jpg
c04b414b2.jpg
ccfd02948.jpg
7be9c59f8.jpg
c74822baf.jpg
74e611f3c.jpg
c7a2fd5e2.jpg
a9269fb58.jpg
b81462e5b.jpg
88285e65a.jpg
0
===================
d5896c9a0.jpg
d0c025463.jpg
a94abfec3.jpg
93d091bc1.jpg
0706d4216.jpg
2949b6643.jpg
545874c14.jpg
c04b414b2.jpg
ccfd02948.jpg
7be9c59f8.jpg
c74822baf.jpg
74e611f3c.jpg
c7a2fd5e2.jpg
a9269fb58.jpg
b81462e5b.jpg
88285e65a.jpg
0
===================
d5896c9a0.jpg
d0c025463.jpg
a94abfec3.jpg
93d091bc1.jpg
0706d4216.jpg
2949b6643.jpg
545874c14.jpg
c04b414b2.jpg
ccfd02948.jpg
7be9c59f8.jpg
c74822baf.jpg
74e611f3c.jpg
c7a2fd5e2.jpg
a9269fb58.jpg
b81462e5b.jpg
88285e65a.jpg
0
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
1
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
1
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
1
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
1
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
2
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
2
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
2
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
2
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
f66a7c2a3.jpg
e12a65860.jpg
afc456dd3.jpg
439320f0c.jpg
82aab5924.jpg
a3fab7973.jpg
99ce90134.jpg
5fe14e4d0.jpg
e05e1a2e0.jpg
515d6eb11.jpg
b54652474.jpg
ee07a850c.jpg
b63842413.jpg
3
===================
b6f0ef08f.jpg
6132f858d.jpg
15db53751.jpg
这是调用它的代码:
history = model.fit_generator(image_generator(np_train[:, 0], train_labels),
steps_per_epoch=len(np_train) / BATCH_SIZE, epochs=1,
validation_data=([x_valid[:,:,:, :1]], [valid_labels]), #class_weight=class_weights,
callbacks=[saveBestModel], use_multiprocessing=True, workers=4)
===========================
已编辑:我提供给它的数据。 标签(打印两个不同的样本):
print(train_labels[0], "\n", train_labels[CLASSES])
结果:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.]
图片文件名:
np_train
结果:
array([['3d5c45078.jpg', 'w_23a388d'],
['3e53c9584.jpg', 'w_23a388d'],
['3e8b8d8d9.jpg', 'w_23a388d'],
...,
['dada37134.jpg', 'w_b938e96'],
['054bb95c0.jpg', 'w_b938e96'],
['19a81076c.jpg', 'w_b938e96']], dtype='<U13')
而且我只提供“图像”列:
model.fit_generator(image_generator(np_train[:, 0], train_labels)
标签是重复的,所以可以有
1.jpg label_1
2.jpg label_1
...
现在看看
text_file.write("\n%s===================\n" % i)
循环的一部分。它将一个批次的计数器写入文件。现在,如果您查看文件内容(上图),您会看到批次号发生了变化……每五个批次发生一次。 部分问题是我不明白它应该如何工作,特别是“while True”部分。从“正常”编程的角度来看,它是一个无限循环,那它怎么不挂掉程序呢?
【问题讨论】:
-
我想这取决于您的
batch_file_names变量。你能展示一下你是如何生成那个的吗? -
已编辑,显示输入数据。
-
你检查 randint 的输出了吗?小旁注:如果您只想在批次中拥有每个图像一次,请使用不同的东西,例如。
np.random.permutation(len(image_file_names))[:BATCH_SIZE]. -
看,部分问题是,我不太明白它应该如何工作。特别是,我不明白“while True”背后的想法。从“正常”编程的角度来看,它是一个无限循环,那么它为什么不挂掉程序呢?我已经更改了代码(上图)以计算批次。结果(再次,添加到主帖)非常奇怪:似乎每次我们输入“while”,我们都会得到五批!不知道为什么。
-
这取决于这个生成器被调用的频率。有关生成器的更多说明,请参阅this article。生成器总是在
yield上停止并在继续之前返回值。所以每次调用这个函数时,它都会返回某个东西。定义while True意味着批次的生成永远不会有尽头。