У меня есть папка с 15000 уникальных изображений, и я использую подход сиамского CNN с потерями триплетов без / под контролем.
Мне нужно создать набор привязанных, положительных и отрицательных эталонных изображений для каждого из 15 000 изображений, где привязка и негатив не могут быть одним и тем же изображением, а положительное эталонное изображение представляет собой расширенную версию привязки. По сути, обучающий набор = [15 000 привязок, 15 000 положительных, 15 0000 отрицательных изображений].
Как вы можете использовать ImageDataGenerator таким образом, чтобы гарантировать привязку! = Отрицательный, одновременно увеличивая привязку на лету для получения положительного эталонное изображение?
как следующий код (хотя это не работает):
def gen_trips(b_size = 24, flow_dir = data_dir):
# basic generator
datagen = ImageDataGenerator(dtype = np.float32)
# data augmentation generator
datagen_p = ImageDataGenerator(rotation_range = 45,
horizontal_flip = True,
fill_mode = 'nearest')
# generate a
a = datagen.flow_from_directory(directory = flow_dir,
target_size = (224, 224),
class_mode = None,
batch_size = b_size,
shuffle = True,
seed = 42).next()
# generate n
n = datagen.flow_from_directory(directory = flow_dir,
target_size = (224, 224),
class_mode = None,
batch_size = b_size,
shuffle = True,
seed = 0).next()
# generate p
p = datagen_p.flow(a,
shuffle = False,
batch_size = b_size,
seed = 42).next()
yield [a, p, n]
a и n перемешиваются с разными начальными числами - так что, надеюсь, одни и те же два изображения никогда не попадают в тот же набор, а p использует генератор увеличения данных, а не генератор basi c.
Очевидная проблема с этой реализацией заключается в том, что она просто воспроизводит одни и те же изображения в диапазоне b_size, поскольку .next () применяется к a и n.
Если я удалю .next () - все изображения будут загружены, что приведет к OOM (поскольку генераторы проходят итерацию.
В идеале, я ' Я хотел бы иметь возможность передавать пакеты размером b_size, которые проходят через весь каталог, в model.fit. Другими словами; циклически проходить через .next ()?
Как можно ли этого достичь?
Любая помощь приветствуется!