Генерация идентичной последовательности случайных тензорных операций для параллельных экземпляров - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь написать свой собственный генератор данных для задачи сегментации изображения, чтобы иметь больше контроля над преобразованиями, которые я могу применить. Для начала я пишу игрушечный генератор, который выводит случайно обрезанное изображение, используя 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 (закомментировано) действительно обеспечивает повторяемость последовательности, но она является глобальной, а не локальной.

Как мне добиться желаемого поведения?

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