Для получения дополнительных галантерейных товаров, пожалуйста, обратите внимание на публичный аккаунт WeChat «AI Frontline» (ID: ai-front)
PyTorch, фреймворк для глубокого обучения, созданный командой Facebook Artificial Intelligence Team (FAIR), стал популярным инструментом разработки сразу после запуска в январе 2017 года. Его преимущества в отладке и компиляции делают его популярным среди академических исследователей. Ранее в этом месяце новость о том, что код Caffe2 был объединен с PyTorch, также вызвала бурные обсуждения в отрасли.
Сегодня PyTorch официально выпустил версию 0.4.0 на GitHub, В этом обновлении много улучшений с 0.3.1 до 0.4.0, Самое главное,PyTorch теперь официально поддерживает Windows!До официальной поддержки большинству алхимиков для установки PyTorch в Windows приходилось полагаться на сторонние пакеты Conda, выпущенные другими разработчиками. Однако PyTorch в Windows не поддерживает распределенное обучение и может быть немного медленнее, чем Linux/OSX, поскольку Visual Studio поддерживает более старые версии OpenMP.
Как всегда, вы можете установить PyTorch в Windows, используя команды на http://pytorch.org.
Вот FAQ, который отвечает на большинство вопросов, которые могут возникнуть у вас в Windows:
http://pytorch.org/docs/stable/notes/windows.html
В дополнение к поддержке Windows версия 0.4.0 PyTorch фокусируется на компромиссах с памятью при вычислениях, поддержке нескольких вероятностных распределений, оптимизированных типах данных и коррекции тензоров.
Ниже приведен каталог обновлений для этой версии:
Слияние тензора/переменной
нульмерный тензор
тип данных
Руководство по миграции
Тензоры:
Полная поддержка расширенной индексации
Быстрое преобразование Фурье
Нейронные сети:
Компромиссы хранения при вычислениях
узкие места, инструмент для выявления горячих точек в коде
torch.distributions
24 основных распределения вероятностей
Увеличение cdf, дисперсии, информационной энтропии, растерянности и т. д.
Распределенное обучение
Простая в использовании утилита Launcher
Серверная часть NCCL2
Расширение С++
Поддержка Windows
Улучшения ONNX
поддержка РНН
Чтобы помочь пользователям более старых версий легче преобразовать код в новый API и стиль, а также привлечь больше новых пользователей, команда PyTorch также написала руководство по миграции. AI Frontline составил полное руководство по миграции следующим образом: Если вы хотите быстро обновить код PyTorch с предыдущих версий, читайте дальше!
PyTorch 0.4.0 содержит множество интересных новых функций и несколько важных исправлений ошибок, чтобы предоставить пользователям более удобный и понятный интерфейс. В этом руководстве по обновлению мы опишем важные изменения, которые необходимо внести при обновлении с более старой версии PyTorch до последней версии:
Тензор и переменная были объединены
Поддержка нульмерных (скалярных) тензоров
Устаревший изменчивый флаг
dtype, устройство и функции создания тензора в стиле Numpy
Пишите независимый от устройства код
torch.Tensor и torch.autograd.Variable теперь объединены в один класс. Точнее, torch.Tensor можно использовать для отслеживания истории и иметь то же поведение, что и старая переменная. Переменная практически не изменилась, но возвращаемый тип стал torch.Tensor. Это означает, что нам больше не нужно использовать обертки Variable в нашем коде.
Следует отметить, что type() Tensor не может отражать тип данных, вместо этого вы можете использовать isinstance() или x.type():
require_grad является основным флагом autograd и теперь становится атрибутом Tensor. Те же правила, которые ранее использовались для переменных, применяются к тензорам. Autograd начнет отслеживать историю всякий раз, когда ввод Tensor операции содержит require_grad=True . Например:
В дополнение к возможности установить это свойство напрямую, этот флаг можно изменить на месте с помощью my_tensor.requires_grad_() или, как в приведенном выше примере, передать его в качестве аргумента при создании тензора (по умолчанию False), например :
.data — это основной способ получить базовый тензор из переменной. После слияния вы все еще можете продолжать использовать y=x.data таким же образом, и его семантика останется прежней. Итак, y — это тензор, который использует те же данные, что и x, независимо от истории вычислений x, и его значение require_grad равно False.
Однако в некоторых случаях .data может быть небезопасным. Любые изменения в x.data не будут отслеживаться autograd, и если x требуется в обратном порядке, расчетный градиент может быть неправильным. Более безопасный подход — использовать x.detach(), который возвращает тензор с общими данными (requires_grad=False), но autograd отследит его изменения, если x нужно использовать в обратном порядке.
Раньше при индексировании тензорного вектора (одномерного тензора) вы получали число Python, а индексирование переменной давало (иногда не обязательно) вектор размера (1,)! Аналогичная ситуация существует для функций сокращения, например, tensor.sum() вернет число Python, а variable.sum() вернет вектор размера (1,).
К счастью, в новой версии корректно реализована поддержка скаляров (0-мерных тензоров)! Скаляры можно создавать с помощью новой функции torch.tensor (более подробно это будет объяснено позже). Теперь мы можем сделать что-то вроде этого:
Взяв в качестве примера широко используемый шаблон total_loss+=loss.data[0], до версии 0.4.0 потеря представляла собой переменную, обертывающую тензор размера (1,), а в версии 0.4.0 потеря представляла собой скаляр нулевой размерности. Индексировать скаляры бессмысленно (сейчас выдает предупреждение, но станет ошибкой в 0.5.0). Мы можем использовать loss.item() для получения чисел Python из скаляров.
Обратите внимание, что это может потреблять много памяти, если потеря не преобразуется в число Python при ее накоплении. Это связано с тем, что правая часть приведенного выше выражения раньше была числом с плавающей запятой Python, но теперь она становится нульмерным тензором. Таким образом, общая потеря накапливается по тензорам и их историям градиентов, что может дольше сохранять график автоградации.
Флаг volatile теперь устарел. Раньше autograd не отслеживал вычисления переменных, которые содержали volatile=True. Та же функциональность теперь может быть достигнута с помощью более гибкого набора менеджеров контекста, включая torch.no_grad(), torch.set_grad_enabled(grad_mode) и т. д.
В предыдущих версиях нам нужно было указать тип данных (плавающий или двойной?), тип устройства (процессор или cuda?) и макет (плотный или разреженный?) как «тип тензора». Например, torch.cuda.sparse.DoubleTensor представляет тип данных double с разреженным макетом COO, который находится на устройстве CUDA.
В новом выпуске мы представили классы torch.dtype, torch.device и torch.layout, чтобы лучше управлять этими свойствами с помощью функций создания в стиле NumPy.
torch.dtype
Ниже приведен полный список доступных torch.dtypes (типов данных) и соответствующих им тензорных типов.
Тип данных dtype тензора теперь можно получить, обратившись к его свойству dtype.
torch.device
torch.device содержит тип устройства (cpu или cuda) и необязательный номер устройства (id). Его можно инициализировать с помощью torch.device('{device_type}') или torch.device('{device_type}:{device_ordinal}').
Если серийный номер устройства не существует, это означает, что это текущее устройство. Например, torch.device('cuda') эквивалентен torch.device('cuda: X'), где X — результат, возвращаемый torch.cuda.current_device() .
Тип устройства тензора теперь можно получить, обратившись к его свойству устройства.
torch.layout
torch.layout представляет макет данных тензора, в настоящее время он может поддерживать Currenttorch.strided (плотный тензор, по умолчанию) и torch.sparse_coo (разреженный тензор в формате COO).
Макет данных Tensor теперь можно получить, обратившись к его свойству layout.
Теперь вы также можете указать параметры dtype, устройства, макета и require_grad тензора при создании тензора. Например:
torch.tensor(data, ...)
torch.tensor — это недавно представленный метод создания тензора, который копирует различные данные в стиле массива в новый тензор. Как упоминалось ранее, torch.tensor эквивалентен конструктору NumPy numpy.array. В отличие от методов создания torch*Tensor, таким образом мы можем создавать нульмерные тензоры (также известные как скаляры). Кроме того, если аргумент dtype не указан, он выводит соответствующий dtype. Мы рекомендуем этот подход при создании тензоров на основе существующих данных, таких как списки Python. Например:
Мы также добавили больше методов для создания тензоров, некоторые из которых также имеют варианты torch.*_like и tensor.new_* .
1.torch.*_like принимает тензор в качестве входных данных, а не форму. Если не указано иное, по умолчанию возвращается тензор с теми же свойствами, что и входной тензор:
2.tensor.new_* также можно использовать для создания тензора с теми же свойствами, что и у тензора, но для него требуется входной параметр формы:
В большинстве случаев, если вы хотите указать форму, вы можете использовать кортеж (например, torch.zeros((2,3))) или переменную (например, torch.zeros(2,3)).
В предыдущих версиях было сложно написать код, который не зависит от устройства (независимость от устройства означает, что он может работать как на устройствах CUDA, так и на устройствах ЦП без модификации).
PyTorch 0.4.0 обеспечивает независимость от устройств двумя способами:
Получить torch.device всех тензоров через свойство устройства (get_device работает только для тензоров CUDA)
Метод to Tensor и Module можно использовать для простого перемещения объектов на разные устройства (без вызова cpu() или cuda() )
Мы рекомендуем такой подход:
Чтобы понять общие изменения в 0.4.0, давайте сравним 0.3.1 и 0.4.0 с примерами общего кода:
0.3.1 (старая версия)
0.4.0 (новая версия)
Текст руководства по миграции:
http://pytorch.org/2018/04/22/0_4_0-migration-guide.html
Дополнительные сведения об обновлении новой версии см. на странице PyTorch GitHub:
https://github.com/pytorch/pytorch/releases/tag/v0.4.0