Примите участие в 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)
Вы можете изменить ложь копии на истину.