Всем привет. Меня зовут Артур Кадурин, я веду в компании исследования глубокого обучения для разработки новых препаратов.
В Insilico мы используем самые современные методы машинного обучения, а также сами разрабатываем и публикуем множество статей, чтобы вылечить такие заболевания, как рак или болезнь Альцгеймера, а возможно, и само старение.
В подготовке твой курс по глубокому обучению собираюсь опубликовать серию статей на тему Adversarial network с разбором, что это такое и как его использовать.
Эта серия статей не будет очередным обзором GAN( Генеративно-состязательные сети ), но более глубоко заглянет под капот нейронных сетей и охватит более широкий диапазон архитектур.
Хотя мы, конечно, будем анализировать и ГАНы.
Чтобы продолжить обсуждение состязательных сетей, я решил сначала дать краткое введение в pyTorch .
Хочу сразу отметить, что это не введение в нейронные сети, поэтому я предполагаю, что вы уже знаете такие слова, как «слой», «пакет», «бэкпроп» и т. д. Помимо базовых знаний о нейронных сетях вы будете, конечно, нужно понимание языка Python. Для того, чтобы было удобно использовать pyTorch, я подготовил докер -контейнер с Юпитер и программировать на ноутбуках.
Если вы хотите запустить обучение на видеокарте, то для видеокарт от NVIDIA вам понадобится nvidia-docker, думаю с этой частью у большинства из вас проблем не возникнет, поэтому остальное оставляю вам.
Все необходимое для этого поста доступно в моем репозитории.
испорченный333/противный с тегом вступление на Докер-Хаб или в моем репозитории по адресу GitHub .
После установки Docker запустить контейнер можно, например, с помощью следующей команды:
Сервер Jupyter автоматически запустится в контейнере, доступ к которому будет осуществляться через http://127.0.0.1:8765 с паролем «пароль» (без кавычек).docker run -id --name intro -p 8765:8765 spoilt333/adversarial:intro
Если вы не хотите запускать на своей машине чужой контейнер (это правильно!), то вы можете собрать свой, предварительно проверив, что всё ок, из докер-файла, который находится в репозитории на GitHub. Если у вас все запустилось и вы смогли подключиться к jupyter, то давайте перейдем к тому, что такое pyTorch. pyTorch — это большая платформа, которая позволяет создавать динамические графики вычислений и автоматически рассчитывать градиенты на основе этих графиков.
Для машинного обучения это именно то, что вам нужно.
Но, помимо возможности обучения моделей, pyTorch — это еще и огромная библиотека, включающая наборы данных, готовые модели, современные слои и сообщество вокруг всего этого.
В глубоком обучении довольно долгое время было почти стандартом тестировать все новые модели на задаче распознавания рукописных цифр.
Набор данных МНИСТ состоит из 70 000 помеченных рукописных цифр, примерно поровну распределенных между классами.
Он сразу разделен на обучающий и тестовый наборы, чтобы обеспечить одинаковые условия всем, кто тестируется на этом наборе данных.
Естественно, у pyTorch есть для этого простые интерфейсы.
Несмотря на то, что сравнивать современные модели на этом наборе данных уже нет особого смысла, он идеально подходит для демонстрационных целей.
Каждый пример в MNIST представляет собой изображение в оттенках серого размером 28x28 пикселей.
И, как несложно убедиться, не все цифры под силу «узнать» даже человеку.
В блокноте mnist.ipynb можно посмотреть пример загрузки и отображения набора данных, а в файл utils.py включено несколько полезных функций.
Но перейдем к основному «блюду».
Блокнот mnist-basic.ipynb реализует двухслойную полносвязную нейронную сеть, которая решает задачу классификации.
Один из способов создать нейронную сеть с использованием pyTorch — наследовать от класса nn.Модуль и реализовать ваши функции инициализации и вперед def __init__(self):
super(Net, self).
__init__()
self.fc1 = nn.Linear(784, 100)
self.fc2 = nn.Linear(100, 10)
Внутри функции __init__ мы объявляем слои будущей нейронной сети.
В нашем случае это линейные слои nn.Линейный которые выглядят как W'x+b , где W — весовая матрица размера (ввод, вывод) b — вектор перемещения размером выход .
Эти же веса будут «изучены» во время обучения нейронной сети.
def forward(self, x):
x = x.view(-1, 28*28)
x = F.relu(self.fc1(x))
x = self.fc2(x)
x = F.softmax(x, dim=1)
return x
Метод вперед используется непосредственно для преобразования входных данных с использованием данной нейронной сети в ее выходные данные.
Для упрощения примера мы будем работать с примерами из MNIST не как с изображениями, а как с векторами, каждое измерение которых соответствует одному из пикселей.
Функция вид() это аналог numpy.reshape() , он переиндексирует тензор с данными заданным образом.
" -1 " в качестве первого аргумента функции означает, что количество элементов в первом измерении будет рассчитано автоматически.
Если исходный тензор Икс имеет размерность (Н, 28, 28) , затем после x = x.view(-1, 28*28)
его размерность будет равна (Н, 784) .
x = F.relu(self.fc1(x))
Применение слоев к данным в pyTorch реализовано максимально просто; вы можете «вызвать» слой, передав ему пакет данных в качестве аргумента и получить результат преобразования в качестве вывода.
Функции активации устроены аналогичным образом.
В этом случае я использую релю , так как это самая популярная функция активации в задачах компьютерного зрения, но вы можете легко поэкспериментировать с другими функциями, реализованными в pyTorch, благо их достаточно.
x = self.fc2(x)
x = F.softmax(x, dim=1)
Поскольку мы решаем задачу классификации на 10 классов, выход нашей сети имеет размерность 10. В качестве функции активации на выходе сети мы используем софтмакс .
Теперь значения, которые возвращает функция вперед можно интерпретировать как вероятность того, что входной пример принадлежит соответствующим классам.
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)
Теперь мы можем создать экземпляр нашей сети и выбрать функцию оптимизации.
Чтобы получить красивый обучающий график, я выбрал обычный стохастический градиентный спуск, но в pyTorch, конечно, реализованы и более продвинутые методы.
Вы можете попробовать, например, RMSProp или Adam. def train(epoch):
for data, target in train_loader:
optimizer.zero_grad()
output = model(data)
loss = F.cross_entropy(output, target)
loss.backward()
optimizer.step()
Функция тренироваться содержит основной цикл обучения, в котором мы перебираем пакеты из обучающего набора.
данные - это примеры, и цель - соответствующие метки.
В начале каждой итерации мы сбрасываем текущее значение градиентов: optimizer.zero_grad()
Обработка данных по всей сети в pyTorch ничем не отличается от использования отдельного слоя.
Готов принять вызов модель (данные) скрытый вызов функции вперед , поэтому в выход сетевые выходы падают. Теперь осталось только вычислить значение функции ошибок и выполнить шаг обратного распространения ошибки: loss = F.cross_entropy(output, target)
loss.backward()
Фактически, при вызове потеря.
назад() Веса сети еще не обновляются, но для всех весов, используемых при расчете ошибки, pyTorch вычисляет градиенты, используя построенный граф расчета.
Чтобы обновить веса, мы вызываем оптимизатор.
шаг() , который на основании своих параметров (у нас это скорость обучения) обновляет веса.
После 20 эпох обучения наша сеть угадывает числа с точностью 91%, что, конечно, далеко от результатов SOTA, однако вполне неплохо для 5 минут программирования.
Вот пример из тестового набора с прогнозируемыми ответами
[[1 1 5 2 4 6 9 9 9 9]
[2 3 5 4 4 1 3 2 4 7]
[5 0 3 9 4 5 3 2 3 2]
[0 3 8 2 5 5 8 7 8 6]
[8 3 6 8 4 8 5 1 3 9]]
В следующих постах я постараюсь рассказать о состязательных сетях в одном стиле с примерами кода и подготовленными Docker-контейнерами, в частности планирую затронуть такие темы, как адаптация предметной области, перенос стилей, генеративно-состязательные сети и разобрать некоторые из них.
наиболее важные статьи в этой области.
Upd.1: Как правильно указано в комментариях, заверните тензоры в Переменная больше не нужен, поэтому я удалил соответствующую строку.
Естественно, он останется в докер-контейнере, но и без него все работает. Upd.2: Перепутались картинки с номерами, поэтому поменял их местами Теги: #Машинное обучение #python #машинное обучение #глубокое обучение #pytorch #нейронные сети #состязательный
-
Шифрование В Mysql: Ротация Мастер-Ключа
19 Oct, 24 -
Cloudusb: Компьютер В Вашем Кармане
19 Oct, 24 -
Javascript И Seo В 2016 Году
19 Oct, 24 -
Создание Арт-Объекта Для Burning Man
19 Oct, 24 -
Эмодзи Лисп
19 Oct, 24 -
Не Только Google... Онлайн-Инструменты
19 Oct, 24