Вот как выглядит кодирование нейронных сетей в TensorFlow и PyTorch

Вам может быть интересно, изучать ли PyTorch или TensorFlow (2.0). Если так, надеюсь, это сообщение в блоге может помочь. Идея состоит не в том, чтобы дать здесь однозначный ответ, а в том, чтобы просто показать, как развивающиеся и обучающие нейронные сети выглядят в обоих случаях.

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

TensorFlow, выпущенный Google, был выпущен в 2015 году под лицензией Apache 2.0. В октябре 2019 года был выпущен TensorFlow 2.0, что считается огромным улучшением. Обычно он используется в Python. PyTorch, с другой стороны, вышел из Facebook и был выпущен в 2016 году под аналогичной разрешительной лицензией с открытым исходным кодом. Как следует из названия, это также библиотека Python.

Определение модели

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

Модель нейронной сети состоит из трех слоев: Embedded Layer → Global Average Pooling Layer → Dense Layer. Он основан на этом примере.

Набор данных и предварительная обработка

Используемый здесь набор данных состоит из 40 000 твитов и их настроений (0 = отрицательный, 1 = положительный). Сначала загружаем данные из файла CSV и отображаем несколько строк фрейма данных, чтобы получить представление о данных.

import numpy as np
import pandas as pd
data = pd.read_csv("./data/tweets.csv", encoding=’utf-8')
data[:10]

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

Вот что происходит во фрагменте кода выше. Мы присваиваем целое число каждому из 20 000 наиболее распространенных слов в твитах, а затем превращаем твиты в последовательности целых чисел. Мы дополняем более короткие нулями и обрезаем более длинные, добиваясь длины последовательности 42. Наконец, у нас должна быть матрица размером 40 000 x 42 (количество твитов x длина последовательности).

TensorFlow 2.0

import tensorflow as tf

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

Есть три способа построить модель нейронной сети в Keras.

1. Создание подклассов модели

Вы можете создавать свои собственные полностью настраиваемые модели, создав подкласс класса tf.keras.Model и реализовав прямой проход в методе call. Иными словами, уровни определены в методе __init__(), а логика прямого прохода - в методе call.

Преимущество использования такого объектно-ориентированного подхода состоит в том, что вы можете многократно повторно использовать слои в методе call или определять более сложный прямой проход. Но в этом примере ничего подобного не происходит, это просто линейный набор слоев.

2. Функциональный API

В функциональном API с учетом некоторого входного тензора (ов) и выходного тензора (ов) вы также можете создать экземпляр Model. Это удобный способ создания нейронной сети, и Керас даже рекомендует его, а не создание подклассов модели. При таком подходе вы по существу определяете слой и сразу же передаете ему входные данные предыдущего слоя. Таким образом, требуется немного меньше кода с тем же результатом.

3. API последовательной модели

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

Независимо от того, как вы строите модель Keras, я хотел бы вам показать две функции. Во-первых, вызов model.summary() распечатывает краткую сводку модели и количества параметров, что очень полезно.

Во-вторых, позвонив tf.keras.utils.plot_model(), вы получите графическое описание модели. Однако в моем Jupyter Notebook это не сработало. Так что, к сожалению, я не могу вам это показать.

Обучение нейронной сети в Керасе

Прежде чем вы сможете обучать модель Keras, ее необходимо скомпилировать, запустив функцию model.compile(), в которой вы также указываете функцию потерь и оптимизатор.

model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])

У моделей Keras есть удобная функция подгонки для обучения модели (как и Scikit-Learn), которая также заботится о пакетной обработке и даже оценивает модель на ходу (если вы скажете ей об этом).

model.fit(x=X, y, batch_size=32, epochs=5, verbose=2, validation_split=0.2)

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

PyTorch

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

Есть два способа построить модель нейронной сети в PyTorch.

1. Создание подклассов

Подобно TensorFlow, в PyTorch вы создаете подкласс модуля nn.Model и определяете свои слои в методе __init__(). Единственное отличие состоит в том, что вы создаете прямой проход в методе с именем forward вместо call.

Примечание. Отличие от модели Keras: в PyTorch есть только слой среднего пула, поэтому он должен иметь правильный размер ядра, чтобы сделать его глобальным средним пулом.

2. Последовательный

PyTorch также предлагает Sequential модуль, который почти эквивалентен модулю TensorFlow.

Примечание. Я обнаружил, что многие слои не работают с nn.Sequential PyTorch, например многие повторяющиеся слои (RNN, LSTMS и т. д.). Фактически, PyTorch вообще не хотел реализовывать последовательный модуль, потому что хотел, чтобы разработчики использовали подклассы.

Обучение нейронной сети в PyTorch

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

Примечание: для пакетной обработки данных необходимо создать загрузчик данных (здесь не указано, см. код GitHub). Загрузчик данных возвращает по одному пакету за раз в формате словаря.

Краткое описание цикла обучения: для каждого пакета мы вычисляем потери, а затем вызываем loss.backward() для обратного распространения градиента по слоям. Кроме того, мы вызываем optimizer.step(), чтобы указать оптимизатору обновить параметры. Более подробное описание обучения модели PyTorch см. Здесь.

Как изучить PyTorch и TensorFlow

Вот лучшие ресурсы, которые я знаю о начале работы с TensorFlow и / или PyTorch.

Некоторые ресурсы для изучения PyTorch

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

Некоторые ресурсы для изучения TensorFlow 2.0

В TensorFlow есть несколько действительно хороших курсов по Coursera, и есть отличная книга, написанная Франсуа Шоле, создателем Кераса. Официальные сайты TensorFlow и особенно Кераса также являются важными источниками.

Так какой из них лучше?

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

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

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

В целом, в TensorFlow, безусловно, легче перейти от пустого скрипта к обученной нейронной сети, чем в PyTorch - в основном благодаря fit методу TensorFlow. Но здесь играет роль и другое отличие. Я заметил, что для слоев Keras часто не требуется указывать размер ввода, тогда как в PyTorch вам нужно быть более явным. Размеры легко перепутать, особенно если вы хотите попробовать разные. Кроме того, model.summary() и tf.keras.utils.plot_model() Кераса - супер полезные функции, как упоминалось ранее. Не существует стандартных функций PyTorch (я знаю), которые могли бы делать то же самое.

Это определенно некоторые плюсы для TensorFlow. Но в целом две библиотеки ОЧЕНЬ похожи. Кажется, что они уже во многом сблизились, обучаясь друг у друга и переняв лучшие черты друг друга. Это совсем не плохо, а просто признак того, что они сильно повзрослели. Поэтому переключиться очень просто - не беспокойтесь о выборе «неправильной» библиотеки. Конечно, есть гораздо больше аспектов, которые я здесь не рассматривал, особенно любые расширенные функции, такие как параллельные вычисления, обучение на графических процессорах и т. Д.

В любом случае, будет интересно посмотреть, как TensorFlow и PyTorch будут вести себя в 2020 году. В то время как PyTorch в последнее время стал более популярным среди исследователей, TensorFlow является лидером в отрасли. Благодаря TensorFlow и PyTorch глубокое обучение стало более доступным, чем когда-либо, и его будет использовать больше людей. Еще никогда не было так просто.

Код также можно найти в виде записной книжки Jupyter здесь.