Нихиль Будума - Основы глубокого обучения
- Название:Основы глубокого обучения
- Автор:
- Жанр:
- Издательство:Манн, Иванов и Фербер
- Год:2020
- Город:Москва
- ISBN:9785001464723
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нихиль Будума - Основы глубокого обучения краткое содержание
Основы глубокого обучения - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Установка TensorFlow
Установка TensorFlow в вашей локальной среде разработки не представляет особой проблемы, если вы не планируете вносить изменения в исходный код TensorFlow. Воспользуйтесь менеджером установки на Python под названием Pip. Если он еще не установлен на вашем компьютере, используйте следующие команды ввода:
# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev
# Mac OS X
$ sudo easy_install pip
Установив Pip (версия 8.1 или новее), примените следующие команды для установки TensorFlow. Отметим разницу в именовании пакетов Pip, если мы хотим загрузить версию TensorFlow для графических процессоров (настоятельно советуем так и поступить):
$ pip install — upgrade tensorflow # for Python 2.7
$ pip3 install — upgrade tensorflow # for Python 3.n
$ pip install — upgrade tensorflow-gpu # for Python 2.7
# and GPU
$ pip3 install — upgrade tensorflow-gpu # for Python 3.n
# and GPU
Дополненные обновленные инструкции и подробности по поводу установки приложения можно найти на сайте TensorFlow [20].
Создание переменных TensorFlow и работа с ними
Создавая модель глубокого обучения в TensorFlow, мы используем переменные для представления параметров модели. Переменные TensorFlow — буферы в оперативной памяти, содержащие тензоры. Однако, в отличие от нормальных тензоров, которые создаются только при запуске графа и затем тут же стираются из памяти, переменные переживают несколько выполнений графа. Поэтому они обладают следующими тремя свойствами.
• Переменные должны быть явно инициализированы до того, как граф будет использован впервые.
• Можно использовать градиентные методы модификации переменных после каждой итерации, ведь мы ищем оптимальные параметры модели.
• Значения, хранимые в переменных, можно скопировать на диск и восстанавливать для дальнейшего использования.
Эти три свойства делают TensorFlow особенно полезным инструментом в разработке моделей машинного обучения.
Создание переменных — процесс несложный, и в TensorFlow можно инициализировать их несколькими способами. Начнем с переменной, которая описывает веса, соединяющие нейроны двух слоев сети с прямым распространением сигнала:
weights = tf.Variable(tf.random_normal([300, 200], stddev=0.5), name="weights")
Здесь мы сообщаем tf.Variable два аргумента [21]. Первый — tf.random_normal — операция, которая создает тензор, инициализированный при помощи нормального распределения со стандартным отклонением 0,5 [22]. Мы указали размер тензора — 300×200, подразумевая, что веса соединяют слой из 300 нейронов со слоем из 200 нейронов. Мы задали имя обращения к tf.Variable. Это уникальный идентификатор, который позволяет обращаться к соответствующему узлу в графе вычислений. В этом случае веса считаются обучаемыми; мы будем автоматически вычислять градиенты и применять их к весам. Если они не должны быть обучаемыми, мы можем установить дополнительный флаг при обращении к tf.Variable:
weights = tf.Variable(tf.random_normal([300, 200], stddev=0.5), name="weights", trainable=False)
Помимо tf.random_normal, есть еще несколько методов инициализации переменной TensorFlow:
# Common tensors from the TensorFlow API docs
tf.zeros(shape, dtype=tf.float32, name=None)
tf.ones(shape, dtype=tf.float32, name=None)
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None name=None)
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)
При обращении к tf.Variable к графу вычислений добавляются три операции:
• операция, создающая тензор для инициализации переменной;
• операция tf.assign, которая наполняет переменную инициализирующим тензором до ее использования;
• операция переменной, которая содержит ее текущее значение.
Визуализация приведена на рис. 3.1.
Рис. 3.1. Три операции добавляются при реализации переменной TensorFlow. Здесь мы инициализируем переменные веса при помощи нормального распределения
Как мы уже говорили, прежде чем использовать переменную TensorFlow, нужно запустить операцию tf.assign [23], чтобы переменной было присвоено желаемое начальное значение. Для этого можно запустить tf.initialize_all_variables() [24], что приведет к выполнению всех операций tf.assign в нашем графе. Мы можем также выборочно инициализировать некоторые переменные графа вычислений командой tf.initialize_variables(var1, var2, …) [25]. Подробнее обо всем этом мы поговорим при обсуждении сессий TensorFlow.
Операции в TensorFlow
Мы уже упомянули о некоторых операциях в контексте инициализации переменных, но в TensorFlow доступны и многие другие. Они выражают абстрактные трансформации, которые применяются к тензорам в графе вычислений. Операции могут иметь атрибуты, которые либо заданы изначально, либо вводятся в процессе работы. Например, атрибут может описывать ожидаемые типы входных данных (добавление тензоров типа float32 или int32). Операциям, как и переменным, может присваиваться имя для простоты обращения на графе вычислений. Они состоят из одного или более ядер, которые содержат специфичные для устройств реализации.
Например, операция может иметь отдельные ядра для CPU и GPU, поскольку на GPU ее реализация более эффективна. Это справедливо для многих действий с матрицами в TensorFlow.
Общий обзор типов доступных операций приведен в таблице 3.1, взятой из оригинальной технической документации TensorFlow [26].
Таблица 3.1. Общая таблица операций в TensorFlow

Тензоры-заполнители
Теперь, обладая солидными познаниями в области переменных и операций в TensorFlow, мы имеем практически полное описание компонентов графа вычислений этой библиотеки. Не хватает представлений о том, как обеспечить ввод данных в глубокую модель при обучении и тестировании. Переменной недостаточно: она инициализируется лишь однажды. Нам нужен компонент, который мы будем загружать каждый раз при запуске графа вычислений.
TensorFlow решает эту проблему при помощи так называемого заполнителя [27]. Его можно использовать в операциях так же, как и все обычные переменные и тензоры TensorFlow, и он реализуется следующим образом:
x = tf.placeholder(tf.float32, name="x", shape=[None, 784])
W = tf.Variable(tf.random_uniform([784,10], -1, 1), name="W")
multiply = tf.matmul(x, W)
Здесь мы определяем заполнитель, где x — мини-пакет данных, сохраненных как float32. Можно отметить, что в x 784 столбца, то есть каждый образец данных имеет 784 измерения. Для x не определено число строк. Это значит, что он может быть инициализирован произвольным количеством образцов данных. Можно и отдельно умножать каждый из них на W, но представление всего мини-пакета в виде тензора позволяет вычислить результаты для всех образцов данных параллельно. В результате i-я строка тензора multiply соответствует W, умноженному на i-й образец данных.
Как и переменные, которые нужно инициализировать при первом построении графа вычислений, заполнители нужно наполнять каждый раз при запуске графа (или подграфа). Подробнее об этом мы поговорим в следующем разделе.
Читать дальшеИнтервал:
Закладка: