Я пытаюсь написать свой собственный генератор данных для задачи сегментации изображения, чтобы иметь больше контроля над преобразованиями, которые я могу применить. Для начала я пишу игрушечный генератор, который выводит случайно обрезанное изображение, используя tf.image.random_crop:
import tensorflow as tf
import tensorflow.keras.preprocessing.image as k_img
import os
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
class DataGen:
seed=1
def __init__(self,seed=1):
self.seed = seed
def flow(self):
#tf.random.set_seed(self.seed)
img = np.asarray(k_img.load_img('data/train/images/all/image.png',color_mode='grayscale'))
while(True):
img_crop = tf.image.random_crop(img,(32,32),seed=self.seed)
yield img_crop
Вариант использования выглядит следующим образом:
gen = DataGen(1234).flow()
gen2 = DataGen(1234).flow()
fig = plt.figure()
#gen
plt.subplot(2,2,1)
plt.imshow(next(gen))
plt.subplot(2,2,2)
plt.imshow(next(gen))
#gen2
plt.subplot(2,2,3)
plt.imshow(next(gen2))
plt.subplot(2,2,4)
plt.imshow(next(gen2))
Желаемый поведение для изображений 1 и 3 должно быть одинаковым, а для изображений 2 и 4 одинаковым. Однако установка семян в tf.image.random_crop в этом контексте не делает этого - ничего не повторяется. Установка tf.random.set_seed (закомментировано) действительно обеспечивает повторяемость последовательности, но она является глобальной, а не локальной.
Как мне добиться желаемого поведения?