TensorFlow туториал. Часть 1: тензоры и векторы
TensorFlow — это ML-framework от Google, который предназначен для проектирования, создания и изучения моделей глубокого обучения. Глубокое обучение — это область машинного обучения, алгоритмы в которой были вдохновлены структурой и работой мозга. Вы можете использовать TensorFlow, чтобы производить численные вычисления. Само по себе это не кажется специфичным, однако эти вычисления производятся с помощью data-flow графов. В этих графах вершины представляют собой математические операции, в то время как ребра представляют собой данные, которые обычно представляются в виде многомерных массивов или тензоров, которые сообщаются между этими ребрами.
Поняли? Название «Tensor Flow» происходит от вычислений, которые нейросеть производит с многомерными данными и тензорами! Буквально — поток тензоров. На данный момент это все, что нужно знать о тензорах, но мы вернемся к ним чуть позже.
TensorFlow туториал познакомит вас с глубоким обучением в интерактивной форме:
- Сначала вы узнаете больше о тензорах;
- Затем, туторил плавно расскажет о там, как установить TensorFlow;
- Далее вы узнаете об основах Tesorflow: как произвести свои первые простейшие вычисления;
- Следующий этап — настоящая задача на реальных данных: данные по Бельгийскому дорожным знаком и обработка с помощью статистики;
- Научитесь размечать данные таким образом, чтобы “скормить” эти данные нейросети;
- Наконец, разработаете свою модель нейронной сети — слой за слоем;
- Как только архитектура будет готова, вы сможете тренировать сеть интерактивно, а также производить оценку эффективности, использую тестовую выборку;
- Последнее — вы получите указания, как можно улучшить свою модель и как можно дальше работать с TensorFlow.
Введение в тензоры
Чтобы хорошо понять тензоры, следует иметь хорошие знания в линейной алгебре и уметь производить вычисления с векторами. Вы уже прочитали, что тензоры реализованы в TensorFlow как многомерные массивы данных, но давайте немного освежим в памяти, что такое тензоры и какова их роль в машинном обучении.
Плоские векторы
Перед тем, как мы перейдем к плоским векторам, неплохо бы вспомнить о том, что такое вектор. Вектор — это особый вид матрицы, прямоугольный массив с числами. Так как векторы — это упорядоченный набор чисел, то они часто представляются в виде столбцов матриц. Другими словами, вектор — скалярная величина, которой дали направление.
Пример скаляра — “5 метров” или “60 м/с”, тогда как вектор — “5 метров на север” или “60 м/с на восток”.
Разница между ними очевидна: вектор имеет направление. Тем не менее, примеры могут быть очень далеки от тех векторов, с которыми вы столкнетесь, занимаясь машинными обучением.
Длина математического вектора — величина абсолютная, в то время как направление — относительная. Длина измеряется относительно направления, а в качестве единиц выступают градусы или радианы. Обычно считается, что направление положительно и отсчитывается против часовой стрелки относительно начальной точки отсчета.
Визуально, конечно, векторы представляют собой стрелки, как на картинке выше. Это означает, что вы можете рассматривать векторы, как стрелки определенной длины и направления.
Так что же с плоскими векторами?
Плоский вектор — это простейший тензор. Они очень похожи на обычные векторы, такие как вы видели выше, с тем небольшим отличием, что они могут сами определять себя в векторном пространстве.
Чтобы понять, что это значит, рассмотрим пример: пусть есть вектор 2 X 1. Это означает, что вектор принадлежит множеству действительных чисел, которые объединены в пары. Или, иначе говоря, элемент двумерного пространства. В таких случаях вы можете задавать вектор на координатной плоскости, как стрелки или лучи.
Работая на координатной плоскости, вы можете узнать х координату конца луча с началом в (0, 0), посмотрев на первую строчку вектора, а у координату — на вторую.
Замечание: если вы рассматриваете вектор размера 3 X 1, то вы работаете трехмерном пространстве. Здесь вы можете представить вектор как стрелку в трехмерном пространстве, которая обычно задается тремя осями х, у и z.
Замечательно иметь данные вектора и их представление на координатной плоскости, но в сущности важно лишь то, какие вы можете производить над ними операции. В этом вам поможет выражение данных векторов через базисные или единичные вектора.
Единичные векторы — векторы длины 1. Двумерные или трехмерные вектора хорошо раскладываются в сумму ортогональных единичных векторов, таких как оси координат.
Тензоры
Плоский вектор — это частный случай тензора. Помните, вектор определялся в прошлом разделе как скаляр, которому задали направление. Тензор же — это математическое представление физической сущности, которая может быть задана величиной и несколькими направлениями.
И так же как вы представляли скаляр одним числом, а трехмерный вектор как тройку чисел, тензор представляется в виде массива 3R чисел в трехмерном пространстве.
R в этой записи отвечает за ранг тензора: в трехмерном пространстве тензор ранга 2 может быть представлен девятью числами. В N-мерном скаляр требует только одного числа, векторы требуют N чисел, а тензоры требуют N^R чисел. Этим объясняется, почему скаляры часто называют тензорами размера 0: у них нет направления, и они могут быть представлены только одним числом.
Видео про тензоры на примере обычных объектов (на английском языке, можно включить перевод на русский в субтитрах):
Интересные статьи:
- Как создать собственную нейронную сеть с нуля на языке Python
- Как создать собственный датасет из картинок Google
- Обзор Tensorflow.JS: машинное обучение на JavaScript
Краткое введение в тензоры
В заметке Магия тензорной алгебры было дано очень неплохое введение в математику тензоров. Но, как мне кажется, этот текст все-равно несколько сложен для понимания. В нем не до конца понятно, что же это такое тензор и зачем он вообще нужен.
Сейчас я попытаюсь дать совсем простое введение в тензоры. Я не претендую на математическую строгость, поэтому некоторые термины могут употребляться не совсем корректно.
Откуда появился термин тензор
Насколько я помню, термин тензор происходит от латинского tensus или английского слова tension — напряжение. Термин возник в процессе осмысления следующей задачи. Пусть нам дано некоторое твердое тело произвольной формы в трехмерном пространстве. К разным концам тела приложены некоторые силы. Как описать возникающие напряжения в некотором сечении этого тела? Ответ на эту задачу — напряжения описываются тензорным полем. Но для понимания этого ответа давайте рассмотрим более простые задачи.
Тензор нулевого ранга
Пусть нам дан в трехмерном пространстве однородный кубик. Давайте его начнем нагревать с какой-либо стороны. Теперь зафиксируем какой-либо момент времени и попробуем описать значения температуры в каждой точке кубика.
Температура — это скаляр, нам нужно только одно число. Введем произвольную систему координат. В рамках этой системы координат температура будет описываться как скалярная функция от (x, y, z).
А давайте теперь возьмем другую систему координат. Что изменится? А ничего! Температура в каждой точке пространства осталась таким же скаляром и при смене системы координат не поменялась.
Вот уже интересно! Мы получили некоторый математический объект, скаляр, который не изменяется при смене системы координат. Назовем его тензором нулевого ранга. Идем дальше.
(Уточнение из комментариев: координаты точек изменятся, но температура в этих точках от поворота системы координат не изменится. Именно температура и есть тензор ранга (0,0))
Тензор первого ранга
Итак, мы нагрели наш однородный кубик. Под действием температуры молекулы какого-либо вещества в нем начали как-то двигаться. Опять зафиксируем какой-либо момент времени и попробуем описать значения скоростей молекул в каждой точке кубика.
Скорость — это вектор. Введем произвольную систему координат. В рамках этой системы скорости в каждой точке пространства будут описываться как векторные функции от (x, y, z). А давайте теперь возьмем другую систему координат? Что изменится? Давайте рассуждать.
Векторное поле скоростей в кубике не изменилось, оно осталось таким же, мы просто взяли другую линейку (другую систему координат) для измерения скоростей. Но изменились компоненты этого вектора. Зная старую и новую систему координат, закон изменения компонент вектора несложно вывести.
Таким образом, мы получили математический объект, вектор, который опять же не изменяется при смене системы координат, но изменяются его компоненты, причем по заранее определенному закону. Это тензор первого ранга. Теперь начинается самое интересное.
Тензор второго ранга
Мы нагрели наш кубик, молекулы начали двигаться. Но представим теперь, что наш кубик перестал быть однородным. Он теперь пористый, внутри состоит из разных каналов с разной ориентацией. Скорость движения молекулы вдоль канала гораздо больше, чем скорость движения поперек канала. Как нам описать такую неоднородную среду?
Зафиксируем какой-либо момент времени, возьмем одну молекулу со своим вектором скорости. Вопрос, как этот вектор скорости изменится в следующий момент времени? Если молекула попала в канал и вектор ее скорости направлен вдоль канала, то скорость не изменится, если вектор направлен поперек канала, то уменьшится в несколько раз, а если под углом, то вектор скорости вообще изменит свое направление.
Это очень похоже на то, что в каждой точке кубика задано нечто, что умеет поворачивать и масштабировать вектора. Да, да, это матрица! Но не произвольная, а специальная, которая не уничтожает вектора, а преобразовывает.
Хорошо, а что будет с нашей матрицей, если мы возьмем другую систему координат, что изменится? Конфигурация каналов в кубике осталась такой же, и эта матрица должна поворачивать вектора скоростей точно таким же образом. Да, компоненты этой матрицы изменятся, но само ее действие на вектора останется таким же.
Таким образом, мы опять же имеем математический объект, матрицу специального вида, действие которой на вектор не зависит от смены системы координат, а ее компоненты пересчитываются по определенному закону. Назовем его тензором второго ранга.
Так что же такое тензор?
Итак, тензор это математический объект, который как объект не зависит от смены системы координат, но его компоненты при смене системы координат преобразуются по определенному математическому закону. В трехмерном пространстве тензор второго ранга проще всего представить как матрицу, заданную в каждой точке пространства, которая описывает неоднородность этого пространства и действует на входящий вектор, изменяя его направление и масштаб.
Пример простого кода
Чтобы понять TensorFlow, очень важно понять основные понятия констант, переменных, заполнителей и сессий. Давайте теперь разработаем пример, который может отображать все эти концепции одновременно.
Конечно, мы начинаем с импорта модуля TensorFlow
Теперь давайте определим несколько тензоров. Здесь t1 и t2 – константы, t3 – заполнитель и t4 – переменная.
Здесь мы определяем t1 как постоянный тензор размера 4×5 со всеми значениями, установленными в 1. t2 – постоянный тензор размера 5×4 со случайными значениями.
t3 это заполнитель с 0 измерениями – одно число с float32.
Наряду с этим мы определяем переменную t4 формы 4×4. Инициализатор установлен в ones_initializer. Это означает, что всякий раз, когда мы инициализируем переменную, ее значения будут равны 1. Обратите внимание, что это произойдет только тогда, когда мы инициализируем переменную, а не сейчас.
Далее мы можем определить выражение Тензор
Этот код берет скалярное произведение t1 и t2, умножает его на скаляр t3 и затем добавляет его к t4. Результат этого затем назначается на t4. Таким образом, значение t4 изменяется при каждом выполнении этого выражения. Обратите внимание, что t3 является заполнителем, поэтому нам нужно будет указать значение t3, когда мы хотим обработать это выражение.
Опять же, этот код определяет только выражение. Это не выполняется сразу.
Теперь, когда все готово, мы можем начать сеанс и начать работать с тензорами.
Здесь мы фактически запускаем код. Начнем с инициации сессии. Мы должны инициализировать переменные. Пока что t4 был только объявлен, а не инициализирован. Здесь мы фактически инициализируем это. Код инициализации выполнен. В этом случае это «tf.ones_initializer». Таким образом, t4 начинается как Тензор 4×4 со всеми значениями, установленными в 1.
Далее мы запускаем выражение вместе с feed_dict. Помните, что выражение имеет заполнитель t3. Он не будет оцениваться, если мы не дадим ему значение для t3. Это значение передается через feed_dict. Каждый прогон обновляет t4 и присваивает ему новое значение.
Приведенный выше код генерирует этот вывод:
Обратите внимание, что у t4 не было значения, пока оно не было инициализировано, и его значение изменялось только тогда, когда выражение выполнялось в допустимом сеансе. Можно оценить выражение три раза, чтобы утверждать, что результат такой же, как мы ожидали.
При подготовке материала использовались источники:
https://habr.com/ru/articles/261563/
https://machinelearningmastery.ru/tensorflow-the-core-concepts-1776ea1732fa/