PyTorch. Освещая глубокое обучение - Эли Стивенс - E-Book

PyTorch. Освещая глубокое обучение E-Book

Эли Стивенс

0,0

Beschreibung

Многие средства глубокого обучения используют Python, но именно библиотека PyTorch по-настоящему «питоническая». Легкая в освоении для тех, кто знаком с NumPy и scikit-learn, PyTorch упрощает работу с глубоким обучением, обладая в то же время богатым набором функций. PyTorch прекрасно подходит для быстрого создания моделей и без проблем масштабируется до корпоративного проекта. PyTorch используют такие компании как Apple и JPMorgan Chase. Навыки работы с этой библиотекой пригодятся вам для карьерного роста. Вы научитесь создавать нейронные сети и системы глубокого обучения с помощью PyTorch. Книга поможет быстро приступить к созданию реального проекта с нуля. В ней описаны лучшие практики всего конвейера работы с данными, включая PyTorch Tensor API, загрузку данных на Python, мониторинг обучения и визуализацию полученных результатов.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 643

Veröffentlichungsjahr: 2023

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Эли Стивенс, Лука Антига, Томас Виман
PyTorch. Освещая глубокое обучение

Переводчик И. Пальти, С Черников

Эли Стивенс, Лука Антига, Томас Виман

PyTorch. Освещая глубокое обучение. — СПб.: Питер, 2022.

ISBN 978-5-4461-1945-5

© ООО Издательство "Питер", 2022

Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.

Моей жене (эта книга не появилась бы без ее бесценной поддержки и участия), моим родителям (без них на свет не появился бы я) и моим детям (если бы не они, эта книга появилась бы намного раньше).

Спасибо вам за то, что вы — моя крепость, мой фундамент и моя радость.

Эли Стивенс (Eli Stevens)

Аналогично :) Впрочем, на самом деле посвящаю ее вам, Элис и Луиджи.

Лука Антига (Luca Antiga)

Еве, Ребекке, Джонатану и Давиду.

Томас Виман (Thomas Viehmann)

Предисловие

На момент начала работы над проектом PyTorch в середине 2016 года мы были просто группой фанатов программного обеспечения с открытым исходным кодом, которые встретились в интернете и захотели написать лучшее программное обеспечение для глубокого обучения. Двое из трех авторов этой книги, Лука Антига и Томас Виман, сыграли важную роль в разработке фреймворка PyTorch и достижении им того успеха, который он имеет сегодня.

Наша цель с PyTorch заключалась в создании как можно более гибкого фреймворка для реализации алгоритмов глубокого обучения. Мы работали очень сосредоточенно и за относительно короткий промежуток времени подготовили безупречный продукт. Это было бы невозможно, если бы мы не стояли на «плечах» гигантов. PyTorch унаследовал немалую долю своей базы кода из проекта Torch7, начатого в 2007 году Ронаном Колобером (Ronan Collobert) и другими, — истоки этого проекта лежат в языке программирования Lush, начало которому положили Ян Ле Кун (Yann Le Cun) и Леон Ботту (Leon Bottou). Эта богатая история помогла нам сосредоточить свое внимание на необходимых изменениях, вместо того чтобы начинать проектирование с нуля.

Успех PyTorch трудно объяснить каким-то одним фактором. Этот проект обладает удобным интерфейсом и улучшенными возможностями для отладки, что в конечном итоге обеспечивает более высокую продуктивность у пользователей. Широкое распространение PyTorch привело к созданию чудесной экосистемы основанного на нем программного обеспечения и исследований, которая еще больше обогатила этот фреймворк.

Для упрощения изучения PyTorch существует несколько курсов и университетских учебных программ, а также множество онлайн-блогов и руководств. Однако книг ему посвящено очень мало. В 2017 году, когда кто-то спросил меня: «Когда появится книга по PyTorch?» — я ответил: «Если кто-то сейчас такую и пишет, можете быть уверены, что к моменту выхода в свет она уже будет устаревшей».

С книгой «PyTorch. Освещая глубокое обучение» наконец-то появился полноценный учебный курс по PyTorch. В нем очень подробно рассматриваются базовые понятия и абстракции, разбираются основы структур данных, таких как тензоры и нейронные сети, и дается понимание всех нюансов реализации. Кроме того, здесь охвачены такие продвинутые темы, как JIT (англ. Just-in-Time, компиляция «точно в нужное время») и развертывание для промышленной эксплуатации (один из аспектов PyTorch, который в настоящее время не освещается ни в одной другой книге).

Кроме того, в книге описаны прикладные задачи: вы пройдете через все этапы использования нейронных сетей для решения сложной и важной медицинской проблемы. Благодаря глубоким знаниям Луки в сфере биоинженерии и медицинской визуализации, опыту Эли по созданию на практике программного обеспечения для медицинских устройств и выявления заболеваний, а также багажу знаний Томаса как разработчика ядра PyTorch этот путь будет пройден так основательно, как и должно быть.

В общем и целом, я надеюсь, что эта книга станет для вас «расширенным» справочником и важной составной частью вашей библиотеки.

Сумит Чинтала (Soumith Chintala), один из создателей PyTorch

Введение

В 1980-х годах, еще детьми, делая первые шаги на наших Commodore VIC 20 (Эли), Sinclair Spectrum 48K (Лука) и Commodore C16 (Томас), мы наблюдали расцвет персональных компьютеров, учились программировать и писать алгоритмы на все более быстрых машинах и часто мечтали о том, куда приведут нас компьютеры. Мы остро ощущали пропасть между тем, что делали компьютеры в фильмах, и тем, на что они были способны в реальности, дружно закатывая глаза, когда главный герой в шпионском боевике говорил: «Компьютер, повысь качество изображения».

Позднее, уже во время профессиональной деятельности, двое из нас, Эли и Лука, независимо друг от друга занялись анализом медицинских данных и столкнулись с одинаковыми проблемами при написании алгоритмов, способных справиться с естественным разнообразием параметров человеческого тела. Существует множество эвристических правил выбора наилучшего сочетания алгоритмов, позволяющих добиться нужных результатов и спасти положение. Томас на рубеже столетий изучал нейронные сети и распознавание закономерностей, но затем получил докторскую степень по математике, занимаясь моделированием.

В начале 2010-х появилось глубокое обучение (ГО), сначала в сфере машинного зрения, а затем и применительно к задачам анализа медицинских снимков, например к распознаванию различных структур и изменений. Как раз в это время, в первой половине десятилетия, глубокое обучение заинтересовало и нас. Понадобилось немного времени, чтобы осознать, что глубокое обучение представляет собой совершенно новый способ написания программного обеспечения: новый класс универсальных алгоритмов, способных обучаться решению сложных задач на основе наблюдения данных.

Для нас, поколения 80-х, горизонты возможного для компьютеров расширились в один миг. Теперь их ограничивали не умы лучших программистов, а лишь данные, архитектуры нейронных сетей и процесс обучения. Оставалось только заняться ими. Лука выбрал для этой цели Torch 7 (http://torch.ch/), уважаемого предшественника PyTorch, гибкого, облегченного и быстрого, с удобочитаемым исходным кодом, написанным на Lua и чистом C, дружелюбным сообществом пользователей и длинной предысторией. Лука влюбился в него с первого взгляда. Единственный серьезный недостаток Torch 7 заключался в его отрыве от непрерывно растущей экосистемы исследования данных Python data science, которой могли пользоваться другие платформы. Эли интересовался ИИ еще в колледже1, но его карьера пошла в другом направлении, да и прочие, более ранние фреймворки глубокого обучения показались ему слишком неудобными, чтобы с удовольствием использовать их в любительских проектах.

Поэтому мы все очень обрадовались, когда 18 января 2017 года был опубликован первый релиз PyTorch. Лука начал работать над его ядром, а Эли очень быстро присоединился к сообществу пользователей, предлагая множество исправлений ошибок, новые функции и обновления документации. Томас внес тонну функций и исправлений ошибок в PyTorch и в итоге стал полноценным разработчиком ядра. Было ощущение, что начинается нечто громадное, как раз на нужном уровне сложности и с минимальным количеством избыточных умственных усилий. Уроки бережеливого проектирования, полученные из Torch 7, были заимствованы, но на этот раз уже с набором современных возможностей, таких как автоматическое дифференцирование, динамические графы вычислений и интеграция NumPy.

С учетом нашей вовлеченности и энтузиазма и после организации нескольких семинаров по PyTorch написание книги представлялось естественным следующим шагом. Мы ставили перед собой задачу написать такую книгу, которая могла бы помочь нам в то время, когда мы только начинали.

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

1 В те времена, когда «глубокой» нейронная сеть считалась при наличии трех скрытых слоев!

Благодарности

Мы глубоко признательны команде PyTorch. Благодаря их общим усилиям PyTorch органично вырос из проекта уровня летней стажировки в первоклассный инструмент глубокого обучения. Мы хотели бы упомянуть Сумита Чинталу (Soumith Chintala) и Адама Пашке (Adam Paszke), которые, не говоря об их великолепном коде, активно продвигали подход «главное — сообщество пользователей» в управлении данным проектом. Нынешний уровень процветания и терпимости в сообществе PyTorch — явное свидетельство их усилий.

Что касается сообщества, PyTorch не был бы таким, если бы не неустанный труд отдельных пользователей, помогающих как начинающим, так и опытным пользователям на дискуссионном форуме. Среди всех досточтимых участников проекта следует особо отметить нашей признательностью Петра Бялецкого (Pitr Bialecki). А что касается нашей книги, особая благодарность Джо Списаку (Joe Spisak) за веру в ценность ее для сообщества, а также Джефу Смиту (Jeff Smith), выполнившему колоссальный объем работы для того, чтобы эту ценность воплотить в жизнь. Также мы очень благодарны Брюсу Лину (Bruce Lin), который помог нам отдельно подготовить часть I этого текста и обеспечить свободный доступ к ней для сообщества пользователей PyTorch.

Мы хотели бы поблагодарить команду издательства Manning, которая чутко вела нас по этому пути, всегда учитывая хрупкое равновесие между семьей, работой и написанием книги. Спасибо Эрин Туи (Erin Twohey), обратившейся к нам и спросившей, не интересует ли нас написание книги, и Майклу Стивенсу (Michael Stephens), склонившему нас к положительному ответу. Мы ведь сказали тебе, что у нас нет времени! Брайан Хэнафи (Brian Hanafee) делал намного больше, чем обязан был сделать рецензент. Артур Зубарев (Arthur Zubarev) и Костас Пассадис (Kostas Passadis) присылали ценные замечания, а Дженнифер Хоул (Jennifer Houle) сумела справиться с нашим причудливым художественным стилем. Наш выпускающий редактор Тиффани Тейлор (Tiffany Taylor) была очень внимательна к деталям, так что во всех ошибках виноваты мы и только мы. Также мы хотели бы поблагодарить нашего редактора-координатора, Дейрдре Хайэм (Deirdre Hiam), нашего корректора Кэти Теннант (Katie Tennant) и нашего редактора-рецензента Ивана Мартиновича (Ivan Martinovic). Немало людей, мелькавших только в списке скрытых копий веток обсуждения состояния книги, также работало «за кулисами», чтобы довести эту книгу до печати. Спасибо всем, кого мы еще не упомянули! Сделать эту книгу лучше помогли также анонимные рецензенты, с их непредвзятыми отзывами и замечаниями.

Наш неустанный редактор Фрэнсис Левковиц (Frances Lefkowitz) заслуживает медали и недели на тропическом острове за то, что дотянула эту книгу до финишной прямой. Спасибо тебе за всю работу и за изящество, с которым она была проделана.

Мы хотели бы также поблагодарить рецензентов, которые помогли во многом улучшить эту книгу: Александра Ерофеева (Aleksandr Erofeev), Одри Карстенсен (Audrey Carstensen), Башира Чихани (Bachir Chihani), Карлоса Андреса Маришаля (Carlos Andres Mariscal), Дэйла Нила (Dale Neal), Дэниела Береша (Daniel Berecz), Донира Улмасова (Doniyor Ulmasov), Эзру Стивенса (Ezra Stevens), Готфрида Асамоа (Godfred Asamoah), Хелен Мэри Лабао Баррамеду (Helen Mary Labao Barrameda), Хильду ван Гисель (Hilde Van Gysel), Джейсона Леонарда (Jason Leonard), Джефа Когшалла (Jeff Coggshall), Костаса Пассадиса (Kostas Passadis), Линси Нил (Linnsey Nil), Мэтью Чжана (Mathieu Zhang), Майкла Константа (Michael Constant), Мигеля Монталво (Miguel Montalvo), Орландо Алехо Мендеса Моралеса (Orlando Alejo Mendez Morales), Филиппе ван Бергена (Philippe Van Bergen), Риз Стивенс (Reece Stevens), Шриниваса К. Рамана (Srinivas K. Raman) и Ючжана Шрестху (Yujan Shrestha).

Всем нашим друзьям и родственникам, недоумевавшим, что мы скрываем эти два года: «Привет! Мы соскучились по вам! Давайте как-нибудь сходим в ресторан».

Об авторах

Большую часть своей профессиональной жизни Эли потратил на работу в различных стартапах в Кремниевой долине на различных должностях, начиная с разработчика программного обеспечения до технического директора. На момент публикации этой книги он работает с машинным обучением в индустрии беспилотных автомобилей.

Лука Антига работал исследователем в сфере биоинженерии в 2000-х годах, а последнее десятилетие играл роль одного из основателей и технического директора компании, занимающейся проектированием систем искусственного интеллекта. Он участвовал в нескольких проектах с открытым исходным кодом, включая ядро PyTorch.

Томас Виман — инструктор и консультант по машинному обучению и PyTorch, проживающий в Мюнхене, а также разработчик ядра PyTorch. Как обладатель докторской степени по математике, он не боится теории, но подходит с практической стороны, применяя ее к сложным вычислительным задачам.

Об иллюстрации на обложке

Обложку украшает рисунок Kabardian («Кабардинец») из книги Жака Грассе де Сан-Савье (Jacques Grasset de Saint-Sauveur) Costumes Civils Actuels de Tous les Peuples Connus («Наряды из разных стран»), опубликованной во Франции в 1788 году. Широкое разнообразие коллекции нарядов Грассе де Сан-Савье напоминает нам о том, насколько 200 лет назад регионы мира были уникальны и индивидуальны. В те времена по одежде человека можно было легко определить, откуда он, чем занимается и каков его социальный статус.

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

В наше время, когда компьютерные книги так мало отличаются друг от друга, издательство Manning подчеркивает изобретательность и оригинальность компьютерного мира обложками книг, основанными на богатом разнообразии культурной жизни двухвековой давности, возвращенном иллюстра­циями Жака Грассе де Сен-Савье.

Часть I. Основы PyTorch

Добро пожаловать в первую часть нашей книги. Именно в ней вам предстоит сделать свои первые шаги с фреймворком PyTorch и обрести базовые навыки, необходимые для понимания внутреннего устройства его самого и основанных на нем проектов.

В главе 1 мы познакомимся с PyTorch, разберемся, что он собой представляет и какие задачи решает, а также как он связан с другими фреймворками глубокого обучения. Глава 2 проведет для вас экскурсию по фреймворку PyTorch и позволит поэкспериментировать с моделями, предобученными для решения разных интересных задач. Глава 3 будет посерьезнее, так как в ней вы изучите основную структуру данных, используемую в программах PyTorch: тензор. В главе 4 вам предстоит еще одно путешествие, но на этот раз по способам представления данных из различных предметных областей в виде тензоров PyTorch. В главе 5 вы узнаете, как программа учится на примерах и как ей в этом помогает PyTorch. В главе 6 приводятся основные сведения о том, что такое нейронные сети и как создать нейронную сеть с помощью PyTorch. В главе 7 мы займемся решением простой задачи классификации изображений с помощью нейросетевой архитектуры. Наконец, глава 8 демонстрирует, как можно решить ту же задачу намного более остроумным образом: с помощью сверточной нейронной сети.

В концу части I у нас будет все, что нужно для решения с помощью PyTorch реальной задачи в части II.

1. Знакомство с глубоким обучением и библиотекой PyTorch

В этой главе

• Как глубокое обучение меняет подход к машинному обучению.

• Почему фреймворк PyTorch отлично подходит для глубокого обу­чения.

• Типичный проект глубокого обучения.

• Аппаратное обеспечение, которое понадобится вам, чтобы следить за ходом примеров.

Довольно расплывчатый термин «искусственный интеллект» (artificial intel­li­gence) охватывает множество дисциплин, отличающихся колоссальным объемом исследований, критики, путаницы, невероятной шумихи и нагнетания паники. Реальное положение дел, разумеется, выглядит намного оптимистичнее. Было бы нечестно утверждать, что современные машины учатся «думать» в каком-либо человеческом смысле этого слова. Просто мы открыли общий класс алгоритмов, способных очень-очень эффективно аппроксимировать сложные, нелинейные процессы, и их можно использовать для автоматизации задач, которые ранее могли выполнять только люди.

Например, на сайте https://talktotransformer.com/ языковая модель GPT-2 может генерировать связные абзацы текста, по слову за раз. Если подать на ее вход текущий абзац, она сгенерирует следующее:

Далее мы планируем подать на вход список фраз из корпуса адресов электронной почты и посмотреть, сможет ли программа произвести синтаксический разбор этих списков как предложений. Опять же это намного запутаннее и сложнее, чем поиск в начале этого сообщения, но надеемся, что оно поможет вам разобраться в основах формирования структур предложений на различных языках программирования.

Достаточно связный текст для машины, даже если никакой общей идеи в этом повествовании нет.

Еще больше впечатляет то, что умение выполнять эти ранее доступные только людям задачи достигается машиной посредством обучения на примерах данных, а не программируется человеком через набор рукотворных правил. В каком-то смысле становится ясно, что не следует путать интеллект с самосознанием и что самосознание явно не требуется для успешного выполнения подобных задач. В конце концов, вопрос машинного интеллекта может оказаться не столь важным. Эдсгер В. Дейкстра (Edsger W. Dijkstra) обнаружил, что вопрос того, способны ли машины думать, «так же разумен, как и вопрос о том, способны ли подлодки плавать»4.

Этот общий класс алгоритмов относится к подкатегории глубокого обучения (deep learning) ИИ, связанной с обучением на наглядных примерах математических сущностей, называемых глубокими нейронными сетями (deep neural networks). Глубокое обучение использует большие объемы данных для аппроксимации сложных функций, входные и выходные данные которых сильно отличаются (например, изображение на входе и строка текста с описанием этого изображения на выходе; или рукопись на входе и читающий их естественно звучащий голос на выходе; или, еще проще, связывание изображения золотистого ретривера с флагом, сообщающим: «Да, здесь есть золотистый ретривер»). Подобные возможности позволяют создавать программы с функциональностью, доступной ранее исключительно людям.

1.1. Революция глубокого обучения

Чтобы оценить по достоинству смену парадигмы, которую несет этот подход, взглянем на картину в целом. До прошлого десятилетия под машинным обучением понимался более широкий класс систем, активно использующих так называемое проектирование признаков (feature engineering). Признаки представляют собой преобразования входных данных, которые нужны последующим алгоритмам, например классификаторам, для выдачи правильных результатов на новых данных. Проектирование признаков состоит в том, чтобы найти правильные преобразования для успешного решения поставленной задачи последующим алгоритмом. Например, чтобы отличить единицы от нулей на изображениях рукописных цифр, можно придумать набор фильтров для оценки направлений границ на изображениях, а затем обучить классификатор предсказывать правильную цифру по распределению этих направлений. Еще один удобный признак — количество замкнутых контуров, как у цифр 0 и 8, и особенно в петлях цифры 2.

Глубокое обучение же, с другой стороны, нацелено на автоматический поиск подобных признаков из исходных необработанных данных для успешного решения задачи. В примере с нулями и единицами фильтры обновляются во время обучения с помощью итеративного анализа пар примеров данных и целевых меток. Это не означает, что проектирование признаков не используется при глубоком обучении: зачастую требуется внести какие-либо априорные знания в обучающуюся систему. Однако именно возможности ввода и обработки данных с последующим выделением полезных представлений на основе примеров данных составляют наиболее сильную сторону нейронных сетей. Специалисты по глубокому обучению стремятся в основном не создавать эти представления вручную, а работать с математической сущностью, которая бы извлекала представления из обучающих данных самостоятельно. Зачастую эти автоматически генерируемые признаки лучше созданных вручную! Как и в случае многих других революционных технологий, этот факт привел к изменению самой концепции.

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

Начиная с правой стороны рис. 1.1, мы уже получаем представление, что нужно для успешного выполнения глубокого обучения.

• Способ ввода и предварительной обработки имеющихся данных.

• Возможность каким-то образом описать глубоко обучающийся автомат.

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

Очевидно, что нужно взглянуть повнимательнее на обучение, о котором мы столько говорим. Численная оценка расхождения между желаемыми и фактическими результатами модели (по принятому соглашению, чем меньше, тем лучше) основывается на критерии, вещественнозначной функции выходного сигнала модели и контрольных данных. Обучение представляет собой минимизацию значений критерия с помощью постепенного улучшения глубоко обучающегося автомата до тех пор, пока не будут достигнуты низкие значения критерия даже на тех данных, которые не встречались во время обучения.

Рис. 1.1. Глубокое обучение исключает необходимость в создании признаков вручную, но требует больше данных и вычислительных ресурсов

1.2. Использование PyTorch для глубокого обучения

PyTorch — фреймворк/библиотека для программ на языке Python, который помогает создавать проекты глубокого обучения с упором на гибкость и возможность выражать модели глубокого обучения в характерном для Python стиле. Благодаря доступности и легкости использования PyTorch быстро нашел приверженцев в научном сообществе и за прошедшие с момента первого выпуска годы стал одним из самых значимых инструментов глубокого обучения с широким спектром приложений.

Как и сам Python для программирования вообще, PyTorch очень хорошо подходит для знакомства с глубоким обучением. В то же время библиотека PyTorch доказала свою пригодность для коммерческого использования для масштабных реальных задач. Мы убеждены, что понятный синтаксис, потоковый API и удобство отладки библиотеки PyTorch делают ее прекрасным вариантом для знакомства с глубоким обучением. Мы настоятельно рекомендуем вам начать изучение библиотек глубокого обучения именно с PyTorch. Окажется ли она последней из изученных вами библиотек глубокого обучения — решать вам.

По существу, глубоко обучающийся автомат на рис. 1.1 представляет собой сложную математическую функцию, преобразующую входной сигнал в выходной. Для упрощения описания этой функции PyTorch предоставляет основополагающую структуру данных, тензор — многомерный массив, во многом схожий с массивами NumPy. Основываясь на этом фундаменте, PyTorch предоставляет возможности для выполнения быстрых математических операций на специализированном аппаратном обеспечении, что упрощает проектирование нейросетевых архитектур и обучение их на отдельных машинах или распараллеленных вычислительных ресурсах.

Эта книга задумывалась как отправной пункт для свободно владеющих Python разработчиков, специалистов по обработке данных и заинтересованных студентов, желающих научиться создавать с помощью PyTorch проекты глубокого обучения. Мы старались сделать ее как можно более доступной и полезной и надеемся, что вы сможете применить ее идеи в других предметных областях. Для этого мы выбрали практический подход и призываем вас держать свой компьютер наготове, чтобы экспериментировать с примерами и расширять их. Надеемся, что к тому моменту, когда вы закончите читать эту книгу, вы сможете взять источник данных и построить на его основе проект глубокого обучения с помощью превосходной официальной документации.

Хоть мы и делаем акцент на практических аспектах создания систем глубокого обучения с помощью PyTorch, мы надеемся, что подобное доступное введение в основы этого инструмента глубокого обучения станет для вас чем-то большим, чем просто способом обрести новые профессиональные навыки. Это шаг к тому, чтобы вооружить новое поколение ученых, инженеров и специалистов-практиков из разных сфер практическими знаниями, которые станут основой многих программных проектов в следующие десятилетия.

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

• хотя бы небольшой опыт программирования на языке Python. Мы не станем на этом останавливаться: вы должны быть знакомы с типами данных Python, классами, числами с плавающей запятой и т.д.;

• желание учиться и погрузиться в работу с головой. Мы начнем с основ и будем постепенно нарабатывать практические знания, и вам будет гораздо проще учить материал, следуя за ходом примеров.

Как уже говорилось, книга разбита на три отдельные части. Часть I охватывает основы и подробно исследует возможности, предоставляемые PyTorch для воплощения в жизнь схемы с рис. 1.1. Часть II посвящена комплексному проекту, касающемуся медицинских снимков (поиск и классификация опухолей на КТ-снимках) и основанному на описанных в части I базовых понятиях с добавлением более продвинутых. Часть III завершает книгу кратким обзором возможностей PyTorch по развертыванию моделей глубокого обучения в промышленной эксплуатации.

Глубокое обучение — обширная сфера. В книге мы охватим лишь крошечную его долю, а именно применение PyTorch для более узких проектов классификации и сегментирования с обработкой двумерных и трехмерных изображений в качестве поясняющих примеров. Основное внимание в издании уделяется практической стороне использования PyTorch, а основная цель — охватить объем материала, достаточный для последующего решения вами реальных задач машинного обучения с помощью глубокого обучения, например, в области машинного зрения или изучения новых моделей по мере их появления в научной литературе. Большинство, если не все последние свежие публикации по исследованиям в сфере глубокого обучения можно найти в репозитории препринтов arXiV, расположенном по адресу https://arxiv.org/5.

1.3. Почему PyTorch?

Как мы уже говорили, глубокое обучение позволяет решать очень широкий спектр сложных задач, таких как машинный перевод, стратегические игры или идентификация объектов на загроможденных изображениях, путем обучения модели на наглядных примерах данных. Для практической реализации необходимы гибкие (подходящие для широкого диапазона задач) и эффективные (для обучения на больших объемах данных за разумное время) инструменты. Кроме того, обученная модель должна правильно работать при изменчивых входных данных. Давайте обсудим, по каким причинам мы решили использовать PyTorch.

Библиотеку PyTorch можно смело рекомендовать благодаря ее простоте. Многие ученые и специалисты-практики отмечают легкость в изучении, использовании, расширении и отладке приложений PyTorch. Фреймворк полностью отражает стиль Python и, несмотря на имеющиеся различия в тонкостях и практическом исполнении, в целом покажется знакомым разработчикам, которые ранее использовали Python.

Если точнее, программирование глубоко обучающегося автомата на PyTorch происходит совершенно естественным образом. PyTorch предоставляет тип данных Tensor для хранения чисел, векторов, матриц и вообще массивов, а также функции для работы с ними. Писать программы с ними можно поэтапно, и при желании интерактивно, как и в случае Python. Что будет вполне привычно знакомым с NumPy.

Но PyTorch предоставляет также возможности, благодаря которым особенно хорошо подходит для глубокого обучения: во-первых, ускорение вычислений, порой 50-кратное по сравнению с выполнением того же вычисления на CPU, с помощью графических процессоров (GPU). Во-вторых, поддержку численной оптимизации общих математических выражений, используемых глубоким обу­чением для своих задач. Обратите внимание, что обе эти возможности полезны для научных вычислений в целом, а не только для глубокого обучения. На самом деле вполне можно назвать PyTorch высокопроизводительной библиотекой Python с поддержкой оптимизации научных вычислений.

Определяющий фактор PyTorch — это выразительность, позволяющая разработчику реализовать запутанные модели без привнесения библиотекой излишней сложности. PyTorch обеспечивает едва ли не самый гладкий перевод идей в код на языке Python в сфере глубокого обучения. Именно поэтому PyTorch так широко применяют в научной сфере, о чем свидетельствует большое число его упоминаний на международных конференциях6.

PyTorch также прекрасно подходит для перехода от исследований и разработки к использованию для практических задач. Несмотря на то что изначально PyTorch был ориентирован на научные изыскания, она снабжена высокопроизводительной средой выполнения C++, подходящей для развертывания моделей для выполнения вывода без использования Python, и может применяться для проектирования и обучения моделей на C++. Также PyTorch обогатился привязками к другим языкам программирования и интерфейсом для развертывания на мобильных устройствах. Эти возможности позволяют использовать гибкость PyTorch, в то же время разворачивая приложения там, где недоступна полноценная среда выполнения Python либо накладные расходы на нее оказались бы недопустимо высоки.

Конечно, заявить о простоте использования и высокой производительности легче всего. Надеемся, в процессе чтения вы согласитесь, что наши утверждения вполне обоснованны.

1.3.1. Общая картина сферы глубокого обучения

Хотя все аналогии несовершенны, похоже, что выпуск PyTorch 0.1 в январе 2017 года отметил переход от взрывного роста количества библиотек, адаптеров и форматов обмена данными к эпохе объединения и унификации.

Примечание

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

На момент выхода первой бета-версии PyTorch:

• Theano и TensorFlow были первыми низкоуровневыми библиотеками, в которых пользователь мог описать граф вычислений для модели и выполнить его;

• Lasagne и Keras были высокоуровневыми обертками для Theano, причем Keras служил оберткой для TensorFlow и CNTK;

• различные ниши в экосистеме заполняли Caffe, Chainer, DyNet, Torch (основанный на Lua предшественник PyTorch), MXNet, CNTK, DL4J и др.

За последующие примерно два года картина изменилась кардинально. Разработчики объединились вокруг либо PyTorch, либо TensorFlow, а другие библиотеки стали использовать реже, за исключением заполнявших определенные особые ниши. Если кратко, то:

• активная разработка Theano, одного из первых фреймворков глубокого обу­чения, фактически прекратилась;

• TensorFlow:

• полностью поглотил Keras, превратив последний в полноценный API;

• предоставил режим немедленного выполнения, в чем-то напоминающий подход PyTorch к вычислениям;

• выпустил TF 2.0, в котором режим немедленного выполнения использовался по умолчанию;

• разработанная компанией Google независимо от TensorFlow библиотека JAX начала укреплять позиции как эквивалент NumPy, только с поддержкой GPU, автоматического вычисления градиентов и JIT;

• PyTorch:

• поглотил Caffe2 в качестве прикладной части;

• заменил большинство низкоуровневого кода, унаследованного из основанного на Lua проекта Torch;

• добавил поддержку ONNX — платформонезависимого формата описания моделей и обмена ими;

• добавил среду отложенного выполнения (graph mode) TorchScript;

• выпустил версию 1.0;

• заменил CNTK и Chainer на фреймворки от корпоративных спонсоров.

TensorFlow отличается надежным механизмом для практического использования, обширным сообществом разработчиков во всех отраслях индустрии и хорошо известен на рынке. PyTorch завоевал огромную популярность в сферах науки и образования благодаря удобству использования и с тех пор набирает силу, поскольку исследователи и выпускники обучают ему студентов, а также переходят в коммерческий сектор. Также он наращивает обороты в смысле решений, находящихся в промышленной эксплуатации. Интересно, что с появлением TorchScript и режима немедленного выполнения наборы функций PyTorch и TensorFlow начинают приближаться друг к другу, хотя представление этих функций и общее впечатление от работы с ними сильно различаются.

1.4. Обзор средств поддержки библиотекой PyTorch проектов глубокого обучения

Мы уже упоминали мельком несколько основных «кирпичиков» PyTorch. Давайте потратим немного времени и составим укрупненную схему основных компонентов PyTorch. Удобнее всего для этого проанализировать, что необходимо проекту глубокого обучения от PyTorch.

Во-первых, PyTorch содержит в названии Py, как в Python, но в нем очень много написанного не на Python кода. Собственно, из соображений быстродействия большая часть PyTorch написана на C++ и CUDA (https://www.geforce.com/hardware/technology/cuda), C++-подобном языке программирования от NVIDIA, позволяющем компилировать программы для массово-параллельного выполнения на GPU. К PyTorch можно непосредственно обращаться из C++, и мы обсудим это в главе 15. Эта возможность, в частности, появилась, чтобы предоставить надежную стратегию развертывания моделей в производстве. Впрочем, большую часть времени мы будем работать с PyTorch из Python, создавая модели, обучая их и решая с помощью обученных моделей настоящие задачи.

И действительно, именно в API Python библиотека PyTorch проявляет себя наилучшим образом в смысле удобства использования и интеграции с остальной экосистемой Python. Взглянем на общую модель, демонстрирующую, что представляет собой PyTorch.

Как мы уже упоминали, PyTorch, по своей сути, библиотека, предоставляющая многомерные массивы (тензоры в терминологии PyTorch) и обширную библиотеку операций над ними, предоставляемую модулем torch. Тензоры и операции над ними можно использоваться как на CPU, так и GPU. Перенос вычислений с CPU на GPU в PyTorch требует всего одного-двух дополнительных вызовов функций. Вторая важнейшая составляющая — PyTorch предоставляет возможность тензорам отслеживать производимые над ними операции и аналитически вычислять производные входных сигналов вычислений относительно нужных входных сигналов, что применяется при численной оптимизации и предоставляется тензорами естественным образом благодаря обработке «изнутри» с помощью движка autograd библиотеки PyTorch.

Благодаря тензорам и стандартной библиотеке операций над ними с автоматическим дифференцированием PyTorch может применяться в физике, визуализации, имитационном и обычном моделировании, а также во многих других областях — PyTorch используется самыми разнообразными способами в целом спектре научных приложений. Но PyTorch прежде всего библиотека глубокого обучения, а потому предоставляет пользователям все базовые элементы, необходимые для создания и обучения нейронных сетей. На рис. 1.2 приведена стандартная архитектура: загрузка данных, обучение модели и развертывание в дальнейшем этой модели в эксплуатации.

Рис. 1.2. Основная структура проекта PyTorch в укрупненном виде, с загрузкой данных, обучением и развертыванием в промышленной эксплуатации

Основные модули PyTorch, предназначенные для создания нейронных сетей, располагаются в torch.nn, включающем часто используемые слои нейронных сетей и прочие структурные компоненты. Здесь можно найти полносвязные слои, сверточные слои, функции активации и потерь (далее мы обсудим подробнее, что это все такое). Эти компоненты могут применяться для создания и задания начальных значений необученной модели, показанной в центре рис. 1.2. Для обучения модели необходимо несколько дополнительных элементов: источник обучающих данных и оптимизатор, который бы подгонял модель к обу­чающим данным. Также необходимо каким-либо образом доставить модель и данные на аппаратное обеспечение, которое, собственно, и будет производить необходимые для ее обучения расчеты.

Из левой части рис. 1.2 видно, что еще до того, как обучающие данные попадут к модели, необходимо произвести немало вычислений7. Прежде всего, необходимо физически получить данные, чаще всего из какого-либо хранилища, служащего их источником. Далее необходимо преобразовать все примеры из наших данных в нечто, с чем мог бы работать PyTorch: тензоры. Роль этого моста между пользовательскими данными (в каком бы они ни были формате) и тензорами PyTorch играет класс Dataset, включенный в модуль torch.utils.data библиотеки PyTorch. Поскольку данный процесс сильно отличается в разных задачах, нам придется реализовать получение данных из источника самостоятельно. В главе 4 мы рассмотрим подробнее, как представлять различные виды нужных нам данных в виде тензоров.

Хранилища данных обычно довольно медлительны, в частности, из-за задержки доступа, так что загрузку данных желательно распараллелить. Но, поскольку в число сильных сторон Python не входит удобная, эффективная, параллельная обработка, необходимо много процессов для загрузки данных, чтобы организовать их в батчи: тензоры, включающие несколько примеров данных. Это довольно замысловатая, но вместе с тем и относительно универсальная схема, и PyTorch предоставляет все необходимые возможности в классе DataLoader. Его экземпляры могут порождать дочерние процессы загрузки данных из объектов Dataset в фоновом режиме, так что данные будут готовы для использования в цикле обучения в любой момент. Мы познакомимся и поработаем с классами Dataset и DataLoader в главе 7.

Разобравшись с механизмом подготовки батчей примеров данных к использованию, мы можем обратить свое внимание на сам цикл обучения в центре рис. 1.2. Чаще всего цикл обучения реализуют в виде обычного цикла for Python. В простейшем случае модель выполняет необходимые вычисления на локальном CPU или отдельном GPU, и вычисления можно начинать сразу же с поступления данных в цикл обучения. Вполне возможно, что это будет ваша основная архитектура, и именно ее мы используем в этой книге.

На каждом шаге цикла обучения проверяется работа модели на полученных из загрузчика примерах данных, после чего выходные сигналы модели сравниваются с желаемыми (целевыми) на основе какого-либо критерия (функции потерь). PyTorch содержит не только компоненты для создания модели, но и множество функций потерь на любой вкус. Они также доступны в модуле torch.nn. После сравнения фактических выходных сигналов с идеальными на основе функции потерь необходимо немного изменить модель, чтобы ее выходные сигналы больше напоминали целевые. Как уже упоминалось ранее, именно тут нам и пригодится механизм автоматического вычисления производ­ных; но также понадобится и оптимизатор, доступный в модуле torch.optim PyTorch, который будет отвечать за обновление параметров. Мы займемся циклами обучения с функциями потерь и оптимизаторами в главе 5, а затем будем оттачивать наши навыки в главах с 6-й по 8-ю, прежде чем приступить к нашему большому проекту в части II.

Все чаще для этих целей используется различное специализированное аппаратное обеспечение, например несколько GPU или машин, объединяющих ресурсы для обучения большой модели, как показано в нижней части рис. 1.2. В подобных случаях можно воспользоваться подмодулями torch.nn.paral­lel.DistributedDataParallel и torch.distributed для работы с дополнительным аппаратным обеспечением.

Цикл обучения — это, возможно, самая скучная, но самая трудоемкая часть проекта глубокого обучения. По его завершении мы получаем модель, параметры которой оптимизированы под нашу задачу: обученную модель, показанную справа от цикла обучения на рис. 1.2. Модель, которая способна решить задачу, — это замечательно, но чтобы она принесла реальную пользу, ее нужно как-то разместить там, где она требуется. Эта часть — процесс развертывания — изображена в правой части рис. 1.2 и может включать в себя размещение модели на сервере или экспорт ее для загрузки в облако. Можно также интегрировать ее с большим приложением, либо запустить ее на смартфоне.

Одним из шагов развертывания может быть экспорт модели. Как уже упоминалось ранее, по умолчанию в PyTorch используется модель немедленного выполнения (eager mode). Как только интерпретатор Python выполняет инструкцию, связанную с PyTorch, базовая реализация C++ или CUDA сразу же производит соответствующую операцию. По мере того как все больше инструкций оперирует с тензорами, все больше операций выполняет базовая реализация.

PyTorch также предоставляет возможности предварительной компиляции моделей с помощью TorchScript. Используя TorchScript, PyTorch может преобразовать модель в набор инструкций, которые можно независимо вызывать из Python, допустим, из программ на C++ или на мобильных устройствах. Это можно считать своего рода виртуальной машиной с ограниченным набором инструкций, предназначенным для операций с тензорами. Экспортировать модель можно либо в виде TorchScript для использования со средой выполнения Python, либо в стандартизированном формате ONNX. Эти возможности формируют фундамент функциональности развертывания PyTorch, которую мы обсудим в главе 15.

1.5. Аппаратные и программные требования

Эта книга требует программирования и запуска задач, связанных с интенсивными численными вычислениями, например умножением большого количества матриц. Как оказалось, запустить предобученную сеть на новых данных вполне можно на любом современном ноутбуке или ПК. Даже повторное обучение небольшой части предобученной сети для ее адаптации к новому набору данных не требует специализированного аппаратного обеспечения. Вы можете повторить все, что мы делаем в части I этой книги, с помощью обычного персонального компьютера или ноутбука.

Однако мы предчувствуем, что завершение полного цикла обучения в более сложных примерах в части II потребует GPU с поддержкой CUDA. Используемые в части II параметры по умолчанию требуют GPU с 8 Гбайт RAM (рекомендуем использовать видеокарту NVIDIA GTX 1070 или мощнее), но эти параметры можно откорректировать, если на вашем аппаратном обеспечении доступно меньше RAM. Сразу оговоримся: без подобного аппаратного обеспечения можно обойтись, если вы готовы ждать, но выполнение на GPU сокращает время обу­чения как минимум на порядок (обычно в 40–50 раз). По отдельности необходимые для вычисления обновлений параметров операции занимают немного времени (от долей секунды до нескольких секунд) на современном аппаратном обеспечении наподобие CPU среднестатистического ноутбука. Проблема в том, что обучение требует выполнения этих операций снова и снова, много-много раз, с постепенным обновлением параметров сети для минимизации погрешности обучения.

Сети среднего размера могут потребовать от нескольких часов до нескольких дней для обучения с нуля на больших реальных наборах данных на рабочих станциях с хорошим GPU. Длительность обучения можно сократить за счет использования на одной машине нескольких GPU или даже еще сильнее — на кластере машин, оснащенных несколькими GPU. Подобные архитектуры не настолько недоступны, как может показаться, благодаря предложениям поставщиков облачных сервисов. DAWNBench (https://dawn.cs.stanford.edu/benchmark/index.html) — это интересная инициатива Стэнфордского университета, позволяющая оценивать время обучения и стоимость облачных сервисов для распространенных задач глубокого обучения на общедоступных наборах данных.

Так что если у вас будет GPU к моменту, когда вы доберетесь до части II, — замечательно. В противном случае рекомендуем вам изучить предложения различных облачных платформ, многие из которых предлагают блокноты Jupyter с поддержкой GPU и предустановленным PyTorch, зачастую в рамках бесплатного пакета услуг. Можно начать с Colaboratory (https://colab.research.google.com) от Google — это прекрасный вариант.

Осталось обсудить операционную систему (OS). PyTorch с первого выпуска поддерживал Linux и macOS, а в 2018-м начал поддерживать и Windows. Поскольку современные ноутбуки Apple не оснащены GPU с поддержкой CUDA, заранее скомпилированные пакеты PyTorch под macOS работают только с CPU. В этой книге мы постараемся нигде не ориентироваться на использование конкретной операционной системы, хотя некоторые сценарии в части II показаны в варианте запуска из командной оболочки Bash в Linux. Команды этих сценариев можно легко преобразовать для использования в Windows. Для удобства код везде, где только возможно, будет показан так, как будто он выполняется из блокнота Jupyter.

Информацию об установке можно найти в руководстве Get Started на официальном сайте PyTorch (https://pytorch.org/get-started/locally). Мы рекомендуем пользователям Windows устанавливать PyTorch с помощью Anaconda или Miniconda (https://www.anaconda.com/distribution или https://docs.conda.io/en/latest/miniconda.html). В других операционных системах, например Linux, обычно имеется намного больше удобных вариантов, из которых Pip — самая распространенная система управления пакетами для Python. Мы предоставляем файл requirements.txt для установки зависимостей с помощью Pip. Конечно, опытные пользователи могут устанавливать пакеты так, как удобнее для совместимости с их любимой средой разработки.

Требования к полосе пропускания и пространству на диске в части II также довольно серьезны. Исходные данные для проекта обнаружения раковых опухолей из части II потребуют около 60 Гбайт трафика для скачивания, а в разархивированном виде займут на диске около 120 Гбайт. После разархивирования сжатые данные можно будет удалить. Кроме того, вследствие кэширования части данных из соображений быстродействия во время обучения потребуется еще 80 Гбайт. Всего для обучения в системе понадобится (как минимум) 200 Гбайт свободного места на диске. Хотя можно использовать и сетевое хранилище, но такое решение может отрицательно повлиять на скорость обучения, если доступ к сети происходит медленнее, чем к локальному диску. Желательно хранить данные на локальном SSD для быстрого их извлечения.

1.5.1. Блокноты Jupyter

Допустим, что вы установили PyTorch и прочие зависимости, а также проверили, что все работает. Ранее мы упоминали, как можно следить за ходом примеров в этой книге. Мы будем активно использовать для примеров кода блокноты Jupyter. Блокнот Jupyter выглядит как страница в браузере, из которой можно запускать код в диалоговом режиме. Этот код обрабатывается ядром, запущенным на сервере процессом, получающим код и возвращающим результаты, которые затем отображаются на странице. Блокнот хранит состояние ядра, например описанные в ходе выполнения кода переменные, в памяти до завершения или перезапуска его работы. Основная единица взаимодействия с блокнотом — ячейка (cell) — прямоугольное поле на странице, в которое можно вводить код для последующего выполнения его ядром (запускаемого через пункт меню или с помощью сочетания клавиш Shift+Enter). В блокнот можно добавлять много ячеек, причем в новых ячейках будут доступны значения переменных, созданных в предыдущих. Возвращаемое последней строкой кода в ячейке значение выводится после выполнения сразу вслед за этой ячейкой, то же самое относится и к графикам. Комбинируя исходный код, результаты вычислений и текстовые ячейки в формате Markdown, можно создавать замечательные интерактивные документы. Узнать больше о блокнотах Jupyter вы можете на сайте этого проекта (https://jupyter.org).

Теперь вам нужно запустить сервер блокнотов из корневого каталога извлеченного из GitHub кода. Способ выполнения зависит от вашей операционной системы и того, как и куда вы установили Jupyter. Если у вас есть вопросы — смело задавайте их на форуме книги (https://forums.manning.com/forums/deep-learning-with-pytorch). После запуска сервера откроется окно используемого по умолчанию браузера со списком локальных файлов блокнотов.

Примечание

Блокноты Jupyter — обладающий большими возможностями инструмент выражения различных идей в коде и их исследования. И если для нашей книги они подходят, то для других сценариев использования, возможно, нет. Мы полагаем, что важнее всего — устранить помехи и минимизировать лишние когнитивные затраты, и в разных случаях это происходит по-разному.

Весь проверенный код всех листингов из книги можно найти по адресу www.man­ning.com/books/deep-learning-with-pytorch, а также в репозитории GitHub: https://github.com/deep-learning-with-pytorch/dlwpt-code.

1.6. Упражнения

1. Запустите интерактивную командную оболочку Python.

А. Какую версию Python вы используете? Надеемся, по крайней мере 3.6!

Б. Можете ли вы выполнить команду importtorch? Какую версию PyTorch вы получили в результате?

В. Что вернула команда torch.cuda.is_available()? Соответствует ли ее результат ожидаемому, исходя из параметров вашего аппаратного обеспечения?

2. Запустите сервер блокнотов Jupyter.

А. Какую версию Python использует Jupyter?

Б. Совпадает ли расположение используемой Jupyter библиотеки torch с импортированной вами выше из интерактивной командной строки?

1.7. Резюме

• Модели глубокого обучения автоматически обучаются связывать входные сигналы и желаемые выходные сигналы на примерах данных.

• Подобные PyTorch библиотеки дают возможность эффективно создавать и обучать нейросетевые модели.

• PyTorch минимизирует когнитивные затраты, уделяя особое внимание гибкости и быстродействию. По умолчанию в PyTorch используется немедленное выполнение операций.

• TorchScript позволяет заранее компилировать модели и вызывать их не только из Python, но и из программ на C++ и на мобильных устройствах.

• С момента выхода PyTorch в начале 2017 года экосистема инструментов глубокого обучения значительно усовершенствовалась.

• PyTorch предоставляет несколько вспомогательных библиотек для проектов глубокого обучения.

4Dijkstra E.W. The Threats to Computing Science. http://mng.bz/nPJ5.

5 Мы также рекомендуем сайт www.arxiv-sanity.com для упорядочения интересующих вас научных статей.

6 На Международной конференции по усвоению представлений (International Conference on Learning Representations, ICLR) 2019.Ю PyTorch был упомянут в 252 статьях, по сравнению с 87 в предыдущем году, практически наравне с TensorFlow (266 упоминаний).

7 И это только выполняемая по ходу дела подготовка данных, а не предварительная обработка, которая может составлять немалую долю работы в реальных проектах.