Нормализация изображений перед обучением в pytorch - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу применить преобразование для стандартизации изображений в моем наборе данных перед обучением в pytorch.Я слышал, что это значительно улучшает процесс обучения.Я думаю, что Pytorch по умолчанию делит все значения пикселей изображения на 255 перед нанесением их в тензор, это создает проблему для стандартизации ?.Онлайновое руководство рекомендует нам действовать следующим образом.

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

Однако, как показано здесь, 0,5 является лишь примером, который я нашел, а не средним значением или дисперсией для каналов моих данных.

Итак, мой вопрос: как получается среднее значение и стандартное отклонение?Нужно ли нам сглаживать и добавлять все значения зеленых пикселей входных изображений, а затем вычислять среднее и стандартное отклонение?Затем повторите для всех остальных цветов.это как это делается?

Я слышал, что был другой подход, который пытается вычислить "среднюю картинку", чтобы стандартизировать.Какая разница в результате?

1 Ответ

0 голосов
/ 12 декабря 2018

Запустите этот код, чтобы получить значения среднего значения, стандартного отклонения, стандартного отклонения с дельта степенями свободы = 1.

transform = transforms.Compose([
    transforms.ToPILImage(),
    transforms.ToTensor()
])

dataloader = torch.utils.data.DataLoader(*torch_dataset*, batch_size=4096, shuffle=False, num_workers=4)

data_mean = [] # Mean of the dataset
data_std0 = [] # std of dataset
data_std1 = [] # std with ddof = 1
for i, data in enumerate(dataloader, 0):
    # shape (batch_size, 3, height, width)
    numpy_image = data['image'].numpy()

    # shape (3,)
    batch_mean = np.mean(numpy_image, axis=(0,2,3))
    batch_std0 = np.std(numpy_image, axis=(0,2,3))
    batch_std1 = np.std(numpy_image, axis=(0,2,3), ddof=1)

    data_mean.append(batch_mean)
    data_std0.append(batch_std0)
    data_std1.append(batch_std1)

# shape (num_iterations, 3) -> (mean across 0th axis) -> shape (3,)
data_mean = np.array(data_mean).mean(axis=0)
data_std0 = np.array(data_std0).mean(axis=0)
data_std1 = np.array(data_std1).mean(axis=0)
...