Исправлено случайное семя для преобразований torchvision.

Я использую код, похожий на следующий, для увеличения данных:

    from torchvision import transforms

    #...

    augmentation = transforms.Compose([
        transforms.RandomApply([
            transforms.RandomRotation([-30, 30])
        ], p=0.5),
        transforms.RandomHorizontalFlip(p=0.5),
    ])

Во время моего тестирования я хочу исправить случайные значения, чтобы воспроизводить одни и те же случайные параметры каждый раз, когда я изменяю настройки обучения модели. Как мне это сделать?

Я хочу сделать что-то похожее на np.random.seed(0), поэтому каждый раз, когда я вызываю случайную функцию с вероятностью в первый раз, она будет работать с тем же углом поворота и вероятностью. Другими словами, если я вообще не меняю код, он должен воспроизвести тот же результат при повторном запуске.

В качестве альтернативы я могу разделить преобразования, использовать p=1, зафиксировать угол min и max для определенного значения и использовать случайные числа numpy для генерации результатов, но мой вопрос, могу ли я сделать это, сохранив код выше без изменений.


person Anatoliy R    schedule 29.12.2019    source источник


Ответы (1)


В __getitem__ вашего класса набора данных сделайте случайное семя.

def __getitem__(self, index):      
    img = io.imread(self.labels.iloc[index,0])
    target = self.labels.iloc[index,1]

    seed = np.random.randint(2147483647) # make a seed with numpy generator 
    random.seed(seed) # apply this seed to img transforms
    if self.transform is not None:
        img = self.transform(img)

    random.seed(seed) # apply this seed to target transforms
    if self.target_transform is not None:
        target = self.target_transform(target)

    return img, target
person jchaykow    schedule 29.12.2019
comment
Спасибо, модуль random работает (неудивительно, поскольку я не использовал его раньше), и изображения визуально выглядят одинаково с фиксированным начальным числом, поэтому и вероятность, и случайность работают с фиксированными результатами! - person Anatoliy R; 30.12.2019