Знакомство с Python и машинным обучением у большинства начинающих разработчиков проходит по схожему сценарию. Освоив базовые концепции, обычно приступают к новым библиотекам:
- Numpy — для математических вычислений и работы с матрицами;
- Pandas — для работы с табличными данными (их предварительная обработка, действия с пропусками и выбросами, фильтрация, объединение и сортировка);
- Matplotlib — для визуализации;
- Scikit-learn — для построения первых линейных и логистических регрессий, деревьев решений, разделения данных на обучающую и тестовую выборку.
Затем у разработчика возникает вопрос: что ещё нужно изучить, чтобы развить навыки, повысить качество своих проектов и стать более ценным специалистом? Неплохие варианты — набирающие популярность библиотеки Keras и PyTorch. Разберёмся, насколько они востребованы и для чего нужны.
Коротко о главном
Keras — библиотека с открытым исходным кодом, написанная на языке Python. Её поддерживает корпорация Google. Главное предназначение Keras — работа с нейронными сетями. Она относится к верхнеуровневым библиотекам, так что позволяет создавать нейронные сети с помощью простых команд. При этом пользователь сам выбирает, на каком бэкенде производить расчёты: Deeplearning4j, MXNet, Microsoft Cognitive Toolkit (CNTK), Theano или TensorFlow.
У библиотеки есть готовая реализация известных архитектур нейросетей: VGG16, VGG19, Xception, NASNet, MobileNet, MobileNetV2, InceptionV3, InceptionResNetV2. Также в Keras реализовано большинство модулей нейронной сети:
- оптимизаторы;
- слои;
- функции активации слоёв;
- функции затрат;
- схемы инициализации и модели регуляризации.
PyTorch — фреймворк, распространяемый по лицензии BSD. Создан на базе решения Torch специально для языка Python. Его поддерживает корпорация Facebook. При помощи PyTorch можно решать широкий спектр задач машинного обучения (в том числе глубокого), нейросетей, обработки естественного языка. Кроме того, фреймворк даёт возможность создавать собственные слои, использовать функции активации слоёв и все остальные модули нейронной сети с помощью классов и функций Python.
Keras: преимущества
Keras относительно легко освоить новичкам. Так, достаточно всего нескольких строк кода, чтобы создать нейросеть.
Возможна интеграция с мобильными платформами, такими как TensorFlow for Mobile и TensorFlow Lite.
Решения, созданные в Keras, можно экспортировать для других платформ, используя JSON и H5-файлы.
Keras позволяет работать с различными бэкендами — выбирать можно в зависимости от потребностей проекта. Кроме того, разработчик может проводить обучение и тестирование на разных бэкендах для дополнительной валидации качества модели.
Keras: недостатки
- Сложности с отладкой ошибок, возникших на стороне бэкенда. Keras создаёт много абстракций поверх тех объектов, которые есть в бэкенде. Поэтому поиск конкретной строчки, которая привела к ошибке, может занять время.
- Сложность кастомизации решений из-за модульности и высокоуровневости.
PyTorch: преимущества
- Гибкость при разработке решений благодаря возможности писать собственные функции и доступу к математическому аппарату.
- PyTorch поддерживает интерактивную отладку. Причину ошибки найти несложно — нужно напрямую обратиться к исходному коду библиотеки.
- У PyTorch прекрасная документация с подробным описанием каждой функции и примерами.
- Обширное комьюнити разработчиков, публикующих разборы популярных проблем на форумах (типа StackOverflow) и результаты работы на GitHub.
- Простота адаптации проектов, в которых используется NumPy. Нужно добавить буквально несколько строчек кода.
- Поддержка параллелизма данных.
PyTorch: недостатки
- Отсутствие «родных» инструментов для мониторинга и визуализации полученных результатов. Необходимо воспользоваться сторонними библиотеками.
- Сложнее разрабатывать кросс-платформенные решения, необходима интеграция дополнительных библиотек.
Примеры работы с Keras и PyTorch
Пример 1. Создаём простую нейронную сеть в Keras. Для этого хватит нескольких строк кода, после чего нужно инициализировать модель, добавить слои и указать функции активации. Вот и всё.
model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid'))
Пример 2. Создаём аналогичную сеть при помощи PyTorch. Это потребует немного больше времени и навыков, чем в предыдущем случае. Нужно понимать, как работают классы в Python, знать основы ООП и т. д. Но зато PyTorch предоставляет больше возможностей для гибкой настройки сети.
class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x net = Net()
Пример 3. Сравниваем работу с оптимизаторами в Keras и PyTorch
Сначала подключим оптимизатор Adam с функцией потерь «бинарная кросс-энтропия» и метрикой качества «точность» с помощью Keras:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Теперь подключим оптимизатор SGD в PyTorch:
criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
В данном случае нет особых различий по сложности работы с оптимизатором между Keras и PyTorch.
Так что выбрать — PyTorch или Keras?
Необходимо понимать, что и PyTorch, и Keras — прекрасные инструменты, хорошо справляющиеся со своими задачами. Но разработчик, приступая к своему проекту, должен помнить о балансе между затраченными усилиями и эффектом от них.
Если речь идёт о прототипе или несложном решении — лучше остановиться на Keras. Если же необходимо кастомизированное решение, требующее отступлений от стандартных алгоритмов решения задачи, — выбираем PyTorch.
Хотите субъективный совет от автора статьи? Если вы прямо сейчас выбираете, какую библиотеку изучить, — присмотритесь к PyTorch. Как правило, бизнес-задачи с реальными данными сложно выполнить с помощью стандартных методов. Благодаря своей гибкости PyTorch справится с большинством задач, которые вам придётся решать сейчас и в будущем.