自定义ImageDataGenerator行为不当

时间:2019-01-30 20:10:43

标签: python keras

我写了一个自定义的Keras ImageDataGenerator:从磁盘加载图像。逻辑是:在无限循环中,使用文件名数组中的随机值初始化批处理,然后加载这些文件。

问题似乎出在“ init”部分。我使用文件转储生成的文件名,发现它们总是相同的,就像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”部分。从“常规”编程的角度来看,这是一个无限循环,那么它怎么不会挂断程序呢?

1 个答案:

答案 0 :(得分:0)

它似乎与数据产生的问题是由于“use_multiprocessing =真,工人= 4”:移除时,混沌行为停止