Пользовательский ImageDataGenerator ведет себя плохо - PullRequest
0 голосов
/ 30 января 2019

Я написал собственный 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')

И я только кормлю столбец "images":

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)

часть цикла.Записывает счетчик для пакета в файл.Теперь, если вы посмотрите на содержимое файла (выше), вы увидите, что номер партии изменяется ... один раз за ПЯТЬ пакетов.Отчасти проблема в том, что я не понимаю, как это должно работать, в частности, «пока верно».С точки зрения «нормального» программирования, это бесконечный цикл, так как же он не повесил программу?

1 Ответ

0 голосов
/ 01 февраля 2019

Кажется, что проблема с генерацией данных была из-за "use_multiprocessing = True, working = 4": при удалении хаотическое поведение прекратилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...