torchvision.transforms.ToTensor в деталях | Предупреждение пользователя с transforms.ToTensor()

внешний интерфейс

Примите участие в 9-м дне ноябрьского испытания обновлений и узнайте подробности события:Вызов последнего обновления 2021 г.

Взгляниtorchvision.transforms.ToTensorЧто вы наделали:

Преобразуйте PIL.Image с диапазоном значений [0,255] или numpy.ndarray с формой (H,W,C) в форму [C,H,W] с диапазоном значений [0,1.0]torch.FloadTensor.

  • Проще говоря, это преобразование ndarray в тензор.

  • np.ndarray находится в формате [h, w, c]: самый внешний слой в массиве имеет высоту, которая указывает, сколько строк пикселей изображения имеется; ширина элемента второго слоя, которая указывает, сколько столбцов пикселей изображения, а последний элемент слоя является значением каждого канала.

    Тензор в формате [c, h, w]: Элемент первого слоя в массиве — это изображение с одним каналом, элемент второго слоя — это строка пикселей на определенном канале, а третий слой — это значение пикселя определенного столбца на канале.

    Возьмите каштан:

    import numpy as np
    from torchvision import transforms
    
    data = np.random.randint(0, 255, size=6)
    img = data.reshape(2,1,3)
    print(img)
    img_tensor = transforms.ToTensor()(img) # 转换成tensor
    print(img_tensor)
    
    • оказаться:
      [[[ 17 172 103]][[127 183 174]]]
      tensor([[[ 17],[127]],
                [[172],[183]], 
                [[103],[174]]], dtype=torch.int32)
    
    • 在这里插入图片描述
      • Самый внешний слой ndarray — это каждая строка пикселей, всего две строки; средний слой — это значение пикселя каждого столбца, всего два столбца; самый внутренний слой — это трехканальное значение RGB.
      • Самый внешний слой тензора имеет несколько каналов, и три канала представляют собой RGB; второй слой имеет несколько значений пикселей для каждого столбца; третий слой имеет несколько значений пикселей на строку.

UserWarning

Чтобы понять это, давайте взглянем на предупреждение пользователя, с которым я столкнулся сегодня.

在这里插入图片描述

D:\Program Files\python\python3.8\lib\site-packages\torchvision\datasets\mnist.py:498: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at ..\torch\csrc\utils\tensor_numpy.cpp:180.) return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)

примерно означает:

D:\\Program Files\\python\\python3.8\\lib\\site packages\\torchvision\\dataset\\mnist.py:498:UserWarning:Сказать:

Данный массив NumPy недоступен для записи, а PyTorch не поддерживает недоступные для записи тензоры. Это означает, что вы можете использовать тензоры для записи в базовые (предположительно недоступные для записи) массивы NumPy. Массив может потребоваться скопировать, чтобы защитить его данные или сделать его доступным для записи, прежде чем преобразовывать его в тензор.

В остальной части этой процедуры такие предупреждения будут подавлены. (Срабатывает внутри ..\torch\csc\utils\tensor_numpy.cpp:180.)

return return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)

Глядя на заявления других людей, они вообще говорят, что эта штука может напрямую обрабатывать массивы numpy, и вам не нужно конвертировать в тензор. Но почему бы не позволить ему показать это предупреждение.

Найдите файл mnist по указанному выше адресу. Найдите строку 498, поставьтеreturn torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)Вы можете изменить ложь копии на истину.

在这里插入图片描述