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