Paddle Fluid позволяет пользователям выполнять такие программы, как PyTorch и Tensorflow Eager Execution. В этих системах больше нет понятия модели, и приложение больше не содержит символьного описания, описывающего граф оператора или ряд слоев, а скорее описывает процесс обучения или прогнозирования, как программа общего назначения. Эта колонка запустит серию технических статей, сравнивает и анализирует TensorFlow и Paddle Fluid с точки зрения концепции и использования фреймворка, а также предоставляет некоторые рекомендации для студентов, интересующихся PaddlePaddle. Сегодня выходит первая часть серии Paddle Fluid Идеи дизайна и основные концепции.
Эволюция платформ глубокого обучения
Сегодня глубокое обучение стало де-факто самой популярной техникой машинного обучения. Годы научных исследований и многолетняя практика в промышленности позволили предложить несколько эффективных базовых модулей моделирования: полное соединение, свертка, рекуррентная нейронная сеть и т. д., разработать различные методы обучения: метод инициализации, межуровневое соединение, различные технологии норм и т. д. , Изобрел различные новые алгоритмы оптимизации: Ададельта, Адам и т. д. Различные фиксированные сетевые структуры: шоссе, остаточная, внимание и т. д. Появлялись одна за другой, их слишком много, чтобы перечислять. Годы напряженной работы в академических кругах и промышленности способствовали сегодняшнему влиянию методов глубокого обучения.
В академических исследованиях и производственной практике накоплен большой объем знаний, которые вполне могут объяснить индивидуальные возможности обучения и характеристики базовых модулей в нейронной сети. Комбинация базовых модулей и методов обучения позволяет создавать постоянно меняющиеся модели нейронных сетей. Базовые модули и техники обучения ограничены, но их комбинации постоянно меняются, в чем прелесть и сложность методов глубокого обучения.
Это настолько высокая степень модульности, что исследователи и инженеры стремятся избежать повторного создания колес для повышения эффективности исследований и производства, что еще больше способствовало развитию технологии платформы глубокого обучения.Среда глубокого обучения превратилась в инфраструктуру искусственного интеллекта. , важная часть. От Theano до DistBelief и TensorFlow, от Caffe до Caffe2, от Torch до PyTorch, от PaddlePaddle до PaddleFluid, технология платформы глубокого обучения также претерпела два поколения эволюции и движется к платформенной технологии третьего поколения.
Учитывая сегодняшнее историческое развитие, когда мы готовы переключиться и попытаться использовать новую платформу глубокого обучения в качестве инструмента для поддержки нашего собственного обучения и исследований, какая эволюция произошла в платформенной технологии и какое удобство она может нам принести? Давайте сначала рассмотрим три основные проблемы, которые решают фреймворки глубокого обучения:
- Как можно описать вычисления для поддержки новых моделей, которые могут появиться в будущем?
- Как эффективно использовать разнородные устройства, чтобы максимизировать вычислительную мощность?
- Как использовать компьютеры в сети для распределенных вычислений, чтобы обрабатывать петабайты данных?
Первый из трех вышеприведенных вопросов наиболее актуален для исследователя пользователей. В этой статье мы анализируем различные философии проектирования PaddleFluid и TensorFlow, чтобы понять, как фреймворк глубокого обучения абстрагирует модель глубокого обучения, и увидеть, как наш опыт переходит и мигрирует между различными платформами глубокого обучения.
Как описать вычисление
Давайте сначала посмотрим на соответствующий выбор PaddleFluid и TensorFlow в вопросе «как описать модель машинного обучения».
Расчетный график TensorFlow
TensorFlow использует график потока данных для описания всех вычислений и состояний, связанных с моделью машинного обучения.Модель TensorFlow имеет только один граф вычислений., граф расчета включает в себя математические операции и объекты (параметры) операции и даже включает: инициализацию параметров, часть алгоритма оптимизации (правила обновления для обучаемых параметров) и предобработку данных.
Такой вычислительный граф можно дополнительно объяснить:
- Модель машинного обучения, представленная ориентированным ациклическим графом в TensorFlow;
- Узлы на графе соответствуют конкретной операции в модели машинного обучения, которая называется в TensorFlow: Operation;
- Ребра в графе — это поток входных и выходных данных между операциями.
В TenorFlow вход и выход операции единообразно представлены тензором, который можно просто понять, поскольку тензор представляет собой ребро в графе вычислений.
Подводить итоги:
1. В этой статье мы не будем рассматривать дизайн TensorFlow в распределенных и гетерогенных вычислениях. TensorFlow использует вычислительный граф (направленный ациклический граф) для описания модели машинного обучения. Процесс определения и оптимизации любой модели будет преобразован кОдинВычислительный граф. Узел в графе вычислений — Операция, который указывает, как считать, ребро в графе вычислений — это поток входных и выходных данных между операциями. Представление данных с помощью тензоров в TensorFlow;
2. Граф вычислений TensorFlow следует принципу отложенного выполнения, то есть граф вычислений (который можно понимать как представляющий сетевую топологию нейронной сети) необходимо объявить заранее, после объявления его структура не может быть изменена во время выполнения.
Программа PaddleFluid
Способ описания расчета во многом определяет полноту вычислительной функции нейросетевого каркаса. Модели и методы глубокого обучения разрабатывались более 20 лет: «выполнить вперед набор вычислений последовательно, а затем выполнить обратное вычисление в порядке, обратном прямому вычислению, без ветвей и без взаимодействия в середине». ", такая структура модели больше не может быть использована. Удовлетворить воображение исследователей и тысяч пользователей фреймворка.
отЦели дизайна PaddleFluidПосмотрите, в основе описания моделей машинного обучения лежат цели PaddleFluid:Создать новый метод вычислительного описания, который может не только описывать основные модели нейронных сетей, известные до сих пор, но и поддерживать любые будущие модели..
Как PaddleFluid достигает своей цели по поддержке новых моделей, которые появятся в будущем? Варианты конструкции для PaddleFluid:для пользователей, используйте часть программы (которая будет преобразована в язык описания под названием ProgramDesc внутри PaddleFluid) вместо вычислительного графа для описания модели машинного обучения. Программа предоставляет новый язык описания, способный описывать произвольно сложные модели машинного обучения интуитивно понятным для пользователя способом.
Первым уроком для всех студентов, изучающих информатику, при изучении языков программирования должно быть установление понимания «трех структур выполнения языков программирования: последовательное выполнение, условный выбор и выполнение цикла». Вся вычислимая логика в компьютерном мире представлена этими тремя исполнительными структурами, и логика, описываемая этими тремя структурами, вычислима. Точно так же для каркаса нейронной сети, если он сможет обеспечить такую же поддержку этих трех исполнительных структур, как и язык программирования, он сможет описать любые сложные модели машинного обучения, которые могут быть рассчитаны компьютерами. PaddleFluid может описывать произвольно сложные модели, обеспечивая поддержку этих трех исполнительных структур.
Конкретно:
1. Основные концепции проектирования Fluid можно сравнить с языками программирования.Если у вас уже есть опыт написания программ, то опыт использования Fluid для построения моделей нейронных сетей будет очень близок к написанию программ;
2. В PaddleFluid пользователь явно не воспринимает понятие «вычислительный граф», а модель машинного обучения описывается как Fluid Program (Fluid внутренне называет ее ProgramDesc);
- Программа Fluid состоит из набора вложенных блоков. Концепцию блока можно сравнить с парой фигурных скобок в C++ или Java или с отступом в Python;
- Вычисления в блоках объединяются последовательным выполнением, условным выбором или выполнением цикла для формирования сложной логики вычислений.
3. Программа Fluid содержит описания расчетов и объектов расчетов. Описание вычисления называется Оператором, объект вычисления (или вход и выход Оператора) унифицирован как Тензор.
- С точки зрения описания вычислений и вычислительных объектов выбор каждой среды глубокого обучения одинаков.Если у вас есть опыт использования одной платформы, будет очень легко мигрировать между различными платформами.
Суммировать
В таблице ниже приведены различные варианты дизайна, которые TensorFlow и PaddleFluid используют для описания моделей машинного обучения. Как видите, основные элементы, из которых состоит модель, оператор и тензор, одинаковы на обеих платформах. Если у вас есть опыт работы с какой-либо платформой, вы можете быстро обобщить эти понятия по аналогии между разными платформами.
основные концепции использования
В следующих подразделах мы более подробно рассмотрим, как основные концепции использования используются на обеих платформах.
Объекты для представления и вычисления данных: Tensor
Тензор является расширением концепции вектор-матрицы и является основным объектом вычислительных операций модели нейронной сети. Сегодня это общий выбор всех основных платформ глубокого обучения.
Тензор можно просто понимать как N-мерный вектор, который может иметь любое количество измерений. Тензор имеет две основные характеристики:
1. Тип данных: все элементы каждого тензора имеют одинаковый известный тип данных;
2. Размер (или форма): количество измерений (ранг, порядок) и длина каждого измерения.
- Длина некоторых измерений тензора может быть неизвестна на этапе определения модели и может быть определена только во время фактического выполнения алгоритма. Например, количество образцов, содержащихся в мини-пакете (размер пакета), или максимальная длина последовательностей в мини-пакете.
Тензоры в TensorFlow
Во внутренней реализации TensorFlow метод хранения Tensor представляет собой N-мерный массив, где каждый элемент представляет собой определенное значение, например целое число, число с плавающей запятой и т. д. Как следует из названия «TensorFlow», Tensor — это объект, «управляемый» в TensorFlow. При выполнении алгоритма вводом операции является тензор, промежуточным результатом операции является тензор, а конечным результатом также является тензор.
В TensorFlow есть несколько специальных тензоров, наиболее распространенными из которых являются:
1. tf.Variable (переменная): переменная используется для представления параметров в алгоритмах машинного обучения и имеет глобальную видимость. По сравнению с обычным тензором переменная не ограничена сеансом (концепция сеанса будет подробно объяснена ниже), поэтому в случае распределенных вычислений несколько вычислительных единиц могут видеть одну и ту же переменную;
2. tf.placeholder : тензор типа placeholder должен обращаться к определенным данным во время выполнения, что обычно используется для ввода входных данных;
3. tf.constant: постоянный тензор, используемый для генерации общих постоянных данных, таких как все нули, все единицы и т. д.
Тензор в PaddleFluid
PaddleFluid также использует Tensor в качестве унифицированного представления входных и выходных данных в нейронных сетях. Концепция Tensor точно такая же, как и в современных основных платформах глубокого обучения, и ее можно напрямую и беспрепятственно мигрировать между различными средами глубокого обучения.
В Fluid также есть три специальных тензора:
1. Обучаемые параметры в модели
Обучаемые параметры в модели живут до тех пор, пока выполняется вся задача обучения, и получают обновления от алгоритма оптимизации. Он также представлен Variable в PaddleFluid;
В большинстве случаев пользователям не нужно самостоятельно создавать обучаемые параметры в сети, Fluid обеспечивает инкапсуляцию практически распространенных базовых вычислительных модулей нейронных сетей. Взяв в качестве примера простейшую полносвязную модель, следующий фрагмент кода напрямую создаст два обучаемых параметра: вес соединения WW и смещение (bias) для полносвязного слоя.Нет необходимости явно вызывать связанную с переменной интерфейс для создания обучаемых параметров.
import paddle.fluid as fluid
y = fluid.layers.fc(input=x, size=128, bias_attr=True)
2. Входной и выходной тензор
Входные данные всей нейронной сети также являются специальным тензором, В этом тензоре размер некоторых измерений не может быть определен при определении модели (обычно в том числе: размер пакета; например, между мини-пакетами данные являются переменными, и последовательности также включены.Максимальная длина изображения, ширина и высота изображения и т. д.), необходимо занимать место при определении модели;
PaddleFluid использует Fluid.layers.data для доступа к входным данным. Fluid.layer.data должен предоставить информацию о форме входного тензора. При обнаружении неопределенного измерения соответствующее измерение указывается как None , как показано в следующем фрагменте кода. :
import paddle.fluid as fluid
x = fluid.layers.data(name="x", shape=[2, None, 3], dtype="int64")
3. Константа Tensor должна быть реализована путем объединения Tensor и Fluid.layers.assign в PaddleFluid.
Суммировать
1. Как в TensorFlow, так и в PaddleFluid Tensor единообразно используется для описания ввода и вывода нейронной сети и промежуточных результатов расчетов;
2. Для специального Тензора обучаемых параметров:
В TensorFlow обучаемые параметры представлены tf.Variable (при условии, что здесь был выполнен import tensorflow as tf);
Обучаемые параметры в Fluid представлены жидкостью. Переменная (при условии, что здесь был выполнен импорт paddle.fluid как жидкость);
Независимо от того, используете ли вы TensorFlow или PaddleFluid, вы обычно можете использовать API более высокого уровня напрямую, в которых инкапсулированы почти все распространенные единицы нейронной сети, такие как полносвязные, LSTM, CNN и т. д. Эти пакеты были правильно созданы для пользователей. параметры, необходимые модулю. Обычно вам не нужно создавать обучаемые параметры самостоятельно.
3. Для специального тензора этого типа:
Используйте tf.placeholder для завершения функции-заполнителя в TensorFlow;
Для пользователей это можно считать логическим эквивалентом Fluid.layers.data в PaddleFluid;
Однако следует отметить, что механизм реализации в рамках фреймворка не одинаков. tf.placeholder — это тензор, а pd.layers.data создает выходной тензор и оператор, связанный с данными фида.
Вычислительные примитивы: операция/оператор
Тензор — это унифицированное представление данных всех основных сегодняшних фреймворков глубокого обучения (ввод, вывод, промежуточные результаты вычислений и обучаемые параметры модели — все это тензоры). С другой стороны, работа с данными также сильно унифицирована в основной структуре глубокого обучения следующим образом:Operator/Operation. На китайском мы обычно называем это оператором.
Примечание. В официальной документации TensorFlow нет существенной разницы между использованием Operation для вызова операций и изменений в Tensor и использованием Operator для вызова операций в Tensor в PaddleFluid. Ниже они будут использоваться взаимозаменяемо, но на самом деле это одна и та же концепция.
Операция/Оператор принимает несколько тензоров в качестве входных данных и выводит несколько тензоров, представляющих изменение от ввода к выводу.
Операции в TensorFlow
Операция, которая принимает на вход несколько тензоров и выводит несколько тензоров. Видно, что Оператор, как узел графа, получает данные от входящего в узел ребра (тензора) и завершает расчет, а затем полученный Тензор используется в качестве исходящего из узла ребра. Типичным оператором является tf.matmul , который принимает два входа тензора, умножает их и выводит тензор в качестве результата. Все операторы, предоставляемые TensorFlow, можно найти вСправочная документация APIПосмотреть в.
Операторы в PaddleFluid
Операторы в PaddleFluid полностью эквивалентны операциям в TensorFlow. Все операторы, поддерживаемые PaddleFluid, можно найти вСправочная документация APIПосмотреть в.
Для удобства пользователей на стороне Python оператор в Fluid дополнительно инкапсулирован в такие модули, как paddle.fluid.layers и paddle.fluid.networks. Это связано с тем, что: некоторые общие операции с тензором могут состоять из более простых операций, например: норма l2 дополняется комбинированной логикой вычисления нескольких операторов, таких как сокращение, elementwise_add, масштабирование и т. д. Для повышения удобства использования , структура внутри Базовый оператор имеет некоторую инкапсуляцию, включая создание зависимых от оператора обучаемых параметров, детали инициализации обучаемых параметров и т. д., чтобы снизить стоимость повторной разработки пользователями.
Все фреймворки глубокого обучения сталкиваются с одной и той же инкапсуляцией.В большинстве случаев пользователи редко напрямую взаимодействуют с операторами в нижней части фреймворка. Вместо этого они используют слои, сети и другие модули, предоставляемые фреймворком, чтобы уменьшить объем разрабатываемого кода. Независимо от того, что это за концепция, их суть и функция одинаковы между шахтами: трансформация Тензора.
Суммировать
Называется ли это операцией, оператором или слоями, их значение и функция на каждой платформе глубокого обучения одинаковы: преобразование тензора. Это базовая вычислительная мощность, предоставляемая платформой глубокого обучения. Его можно найти в соответствующей справочной документации по API для каждой платформы.
Сегодня каждая платформа глубокого обучения присоединилась к проекту ONNX, и базовые операторы, предоставляемые каждой платформой глубокого обучения, сошлись.В то же время каждая платформа имеет свои особенности и будет предоставлять некоторые уникальные операторы.Чтобы облегчить разработку определенного тип задачи.
Построить модель и выполнить
До сих пор мы видели основные элементы, из которых состоит модель: тензоры и операторы напрямую переносятся между двумя фреймворками. На последнем этапе давайте посмотрим, как вся задача обучения работает на двух платформах.
График и сеанс в TensorFlow
1. TensorFlow описывает модель машинного обучения с помощью вычислительного графа, узлы в графе — операции, а ребра — тензоры. В TensorFlow tf.Graph поддерживает информацию о топологии всего графа;
- Для графа необходимо дополнительное примечание: вычислительный граф TensorFlow имеет соответствующее ему понятие коллекции. Коллекция — это таблица «ключ-значение» с графом в качестве контекста для хранения данных на уровне графа (т. е. глобальных). Например, можно сделать переменную видимой во всем мире, и вся информация, относящаяся к этой переменной, будет храниться в коллекции, соответствующей графу расчета.
2. «Вверху» графика TensorFlow использует механизм сеанса для фактического выполнения модели.
- Для определенного графа TensorFlow (то есть определенной модели нейронной сети) создание для него tf.Session может выполнять операции на уровне процесса, такие как инициализация и запуск модели;
- Чтобы быть более точным, сеанс TensorFlow соединяет пользовательскую программу и внутреннюю среду выполнения.Упомянутая здесь «пользовательская программа» представляет собой определение и настройку модели машинного обучения пользователем TensorFlow, а внутренняя среда выполнения фактически завершает алгоритм. обучение и тестирование программ типа реальных вычислительных задач. Это «соединение» также является своего рода «изоляцией», которая изолирует пользователя от деталей распределенных вычислений, связанных с реальными вычислениями, и проста в использовании.
Программа и исполнитель в жидкости
1. PaddleFluid использует Программу для описания модели нейронной сети Для пользователей не существует понятия вычислительного графа. Все пользовательские тензоры и операции с тензорами: операторы будут добавлены в программу;
- Программа состоит из вложенных Блоков, но пользователям не нужно явно создавать Блоки или явно замечать существование Блоков;
- В программе PaddleFluid Блок создается этими Операторами при вызове while_op, if_op, parallel_do и других специальных Операторов;
- Чтобы пользователи могли использовать, им нужно только знать, что они добавляют переменные (тензор) и операции (оператор) в программу Fluid.
2. PaddleFluid использует Executor для выполнения программы Fluid.
- Чтобы лучше понять роль Исполнителя в Fluid, необходимо объяснить поток выполнения программы Fluid. На следующем рисунке показан поток выполнения программы Fluid на одном компьютере:
▲ Рис. Блок-схема выполнения гибкого локального обучающего задания
1. Дизайнерские идеи и вдохновение Fluid очень похожи на языки программирования, и процесс написания программ на компилируемых языках высокого уровня C++/Java очень похож Выполнение программы Fluid делится на два важных этапа: время компиляции и время выполнения;
2. Во время компиляции пользователь добавляет переменные (Тензор) и операции над переменными (Операторы или Слои) в Программу, вызывая операторы, предоставляемые Fluid. Пользователям нужно только описать прямой расчет ядра, и им не нужно заботиться об обратном расчете, как рассчитывать на распределенных и гетерогенных устройствах;
3. Исходная Программа конвертируется в промежуточный язык описания внутри платформы: ProgramDesc;
4. Одним из наиболее важных функциональных модулей во время компиляции является Transpiler. Transpiler принимает ProgramDesc и выводит измененное ProgramDesc в качестве Fluid Program, которую серверный Executor должен выполнить в конце;
Наиболее часто используемые трансиплеры включают в себя:
- Оптимизация памяти Transipler: благодаря анализу зависимостей чтения и записи переменных вставьте оператор восстановления памяти, чтобы поддерживать небольшие накладные расходы памяти во время работы;
- Транспилятор в распределенной среде: принимает определяемую пользователем локальную Программу и генерирует две программы, выполняемые Клиентом Параметров и Сервером Параметров.
5. Внутренний Исполнитель принимает выходные данные Программы от Транспилятора, по очереди выполняет Операторы (которые могут быть аналогичны инструкциям на языке программирования), а также создает и управляет требуемыми входными и выходными данными для Оператора в процессе выполнения.
Как видно из приведенного выше процесса, процесс выполнения программы Fluid делится на: определение Программы-компилятора и создание Исполнителя для запуска Программы. Процесс Исполнителя, выполняющего Программу, является неинтерактивным и непрерываемым. В PaddleFluid можно создать более одной программы. По умолчанию в программе PaddleFluid есть 2 программы:
1. Fluid.framework.default_startup_program: определяет различные операции, такие как создание параметров модели, ввод и вывод, а также инициализацию обучаемых параметров в модели;
- default_startup_program может автоматически генерироваться фреймворком и не требует явного создания при использовании;
- Если вызов изменяет метод инициализации параметров по умолчанию, платформа автоматически добавит соответствующие изменения в файл default_startup_program.
2. Fluid.framework.default_main_program : определяет модель нейронной сети, прямой и обратный расчет, а также обновление обучаемых параметров в сети с помощью алгоритма оптимизации;
- Суть использования Fluid заключается в создании default_main_program.
3. Область действия в PaddleFluid аналогична концепции сбора данных в TensorFlow, но в Fluid область действия — это базовая концепция фреймворка, с которой пользователи не могут работать напрямую. Так что вам не нужно заботиться об использовании фреймворка.
Суммировать
Для пользователей фреймворка можно считать, что Граф в TensorFlow эквивалентен Программе в PaddleFluid, и их роль во фреймворке точно такая же: определение модели завершено.
Сессия в TensorFlow по логике очень похожа на Executor в PaddleFluid.
TensorFlow завершает инициализацию графа вычислений, вычислений и другой работающей логики через сеанс и соединяет внешний и внутренний интерфейсы TensorFlow;
PaddleFluid использует Executor для выполнения определяемой пользователем программы Fluid.
1. Executor соединяет фронтенд и бэкенд PaddleFluid;
2. Исполнитель принимает определяемую пользователем исходную модель (часть Программы) и вносит изменения в исходную Программу, вызывая транспиляторы с различными функциями в системе для оптимизации.
Полный пример: как завершить обучение модели машинного обучения
В этом разделе мы берем в качестве примера задачу распознавания рукописных цифр MNIST — задачу «Hello World» и данные задач машинного обучения — на полном примере, который можно запустить, чтобы узнать, как представленные выше концепции работают в TensorFlow. и платформы PaddleFluid.Как использовать и мигрировать друг с друга.
Экземпляр TensorFlow
Ниже используется Tensorflow для определения базовой MLP (нейронной сети с одним скрытым слоем) для моделирования проблемы, чтобы проиллюстрировать основное использование Tensorflow.
Шаг 1. Определите данные
# 数据和标签定义
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.int32, shape=[None,])
Как упоминалось ранее, tf.placeholder — это специальный тензор, используемый для представления данных, где x и y_ используются для представления функций и меток данных соответственно.
Шаг 2: Определите модель
# opeartion的计算逻辑定义
y = tf.layers.dense(inputs=x, units=10)
# operation的loss计算方式指定
cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)
# operation优化方式指定
train_op = tf.train.AdamOptimizer().minimize(cross_entropy)
Эта процедура делится на три части:
1. Определение параметра:MLP с одним скрытым слоем, в соответствии с методом абстракции вычислительного графа Tensorflow, то есть для входа xx после вычисления y=\omega x+by=ωx+b получается выход yy. где xx, yy — входной и выходной тензоры, а \omegaω и bb — тензоры параметров.
tf.layers от Tensorflow обеспечивает общую логику расчета операций.Используемый здесь tf.layers.dense — это расчет полносвязного слоя в нейронной сети.
2. Определение метода расчета убытков:В процессе обучения модели потери используются для измерения разрыва между выходом текущей модели и целевым, а также являются основой для оптимизации итерационной модели алгоритма. Общие потери определяются в tf.losses, где используется перекрестная энтропия, обычно используемая потеря в ситуациях множественной классификации. Y_ в этом параметре относится к целевой метке, которая была определена в разделе введения данных выше.
3. Эксплуатационное строительство:В дополнение к уже определенным выше параметрам и потерям необходимо также указать алгоритм оптимизации, который будет использоваться во время итерации. Одна и та же операция может выполняться с использованием разных алгоритмов оптимизации.
Шаг 3: Инициализация параметров
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
Процессом обучения модели управляет tf.Session.tf.Session.run() принимает график после инициализации в качестве входного параметра для подготовки к обучению модели.
Здесь используется инициализация параметра по умолчанию. На самом деле существует множество вариантов инициализации параметров для обучения нейронной сети, что выходит за рамки данной статьи и будет подробно рассмотрено в следующих главах, не вдаваясь в подробности.
Шаг 4: ввод данных + выполнение обучения модели
train_reader = data_iterator()
test_lbl, test_img = load_MNIST("testing")
for step in range(100):
images_batch, labels_batch = next(train_reader)
_, loss_val = sess.run(
[train_op, cross_entropy],
feed_dict={
x: images_batch,
y_: labels_batch.astype("int32")
})
print("Cur Cost : %f" % loss_val)
Так называемая итерация модели обычно передает данные в модель партиями, а затем обновляет параметры модели в соответствии с указанным методом потерь и оптимизации. Основная функция — это вызов tf.Session.run(), который включает ранее определенную операцию, метод оптимизации и входные данные.
Среди них источником входных данных является следующая функция:
def data_iterator(dataset="training", path="data", batch_size=128):
batch_idx = 0
lbl, img = load_MNIST(dataset, path)
while True:
# shuffle labels and features
idxs = np.arange(0, len(lbl))
np.random.shuffle(idxs)
shuf_features = img[idxs]
shuf_labels = lbl[idxs]
for batch_idx in range(0, len(lbl), batch_size):
images_batch = shuf_features[batch_idx:
batch_idx + batch_size] / 255.
images_batch = images_batch.astype("float32")
labels_batch = shuf_labels[batch_idx:
batch_idx + batch_size].astype("int32")
yield images_batch, labels_batch
tf_load_MNIST, используемый в этой программе, предназначен для чтения данных из файла. Функция этой программы состоит в том, чтобы перемешать данные, а затем упорядочить данные каждого пакета с размером пакета в качестве длины.
Шаг 5: Наблюдайте за эффектом модели
Вышеуказанные шаги создали полную программу обучения модели Tensorflow, и каждая пакет разметят потерю один раз, и вы можете интуитивно видеть итеративный эффект модели:
▲ Рис. Кривая снижения стоимости задачи распознавания рукописных цифр TensorFlow MNIST
Прикрепленный: полный код
import numpy as np
import tensorflow as tf
from tf_load_MNIST import load_MNIST
def data_iterator(dataset="training", path="data", batch_size=128):
batch_idx = 0
lbl, img = load_MNIST(dataset, path)
while True:
# shuffle labels and features
idxs = np.arange(0, len(lbl))
np.random.shuffle(idxs)
shuf_features = img[idxs]
shuf_labels = lbl[idxs]
for batch_idx in range(0, len(lbl), batch_size):
images_batch = shuf_features[batch_idx:
batch_idx + batch_size] / 255.
images_batch = images_batch.astype("float32")
labels_batch = shuf_labels[batch_idx:
batch_idx + batch_size].astype("int32")
yield images_batch, labels_batch
def main():
# define the network topology.
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(
tf.int32, shape=[
None,
])
y = tf.layers.dense(inputs=x, units=10)
cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)
train_op = tf.train.AdamOptimizer().minimize(cross_entropy)
# define the initializer.
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
train_reader = data_iterator()
for step in range(100):
images_batch, labels_batch = next(train_reader)
_, loss_val = sess.run(
[train_op, cross_entropy],
feed_dict={
x: images_batch,
y_: labels_batch.astype("int32")
})
print("Cur Cost : %f" % loss_val)
if __name__ == "__main__":
main()
Полный код tf_load_MNIST.py:
import os
import struct
import numpy as np
def load_MNIST(dataset="training", path="."):
"""
Python function for importing the MNIST data set. It returns an iterator
of 2-tuples with the first element being the label and the second element
being a numpy.uint8 2D array of pixel data for the given image.
"""
path = os.path.join(os.path.abspath('.'), "data")
if dataset is "training":
fname_img = os.path.join(path, "train-images.idx3-ubyte")
fname_lbl = os.path.join(path, "train-labels.idx1-ubyte")
elif dataset is "testing":
fname_img = os.path.join(path, "t10k-images.idx3-ubyte")
fname_lbl = os.path.join(path, "t10k-labels.idx1-ubyte")
else:
raise ValueError("dataset must be 'testing' or 'training'")
# Load everything in some numpy arrays
with open(fname_lbl, "rb") as flbl:
magic, num = struct.unpack(">II", flbl.read(8))
lbl = np.fromfile(flbl, dtype=np.int8)
with open(fname_img, "rb") as fimg:
magic, num, rows, cols = struct.unpack(">IIII", fimg.read(16))
img = np.fromfile(fimg, dtype=np.uint8).reshape(len(lbl), rows * cols)
return lbl, img
Экземпляр PaddleFluid
Шаг 1. Определите данные
PaddleFluid использует Fluid.layers.data для получения входных данных.
import numpy as np
import paddle.fluid as fluid
import paddle.v2 as paddle
# define the input layers for the network.
x = fluid.layers.data(name="img", shape=[1, 28, 28], dtype="float32")
y_ = fluid.layers.data(name="label", shape=[1], dtype="int64")
0-е измерение Tensor in Fluid привязано к размеру пакета. В приведенном выше фрагменте кода форма входного изображения x: [1, 28, 28]. Смысл этих трех измерений таков: количество каналов, высота и ширина изображения.
Фактически, внутри среды Fluid входное изображение представляет собой 4-мерный тензор, а 0-е измерение всех тензоров привязано к размеру пакета. Платформа автоматически заполнит заполнитель для размера пакета. Нет необходимости указывать заполнители-заполнители для размера пакета.
Если размер пакета (0-е измерение) исключен, если размер измерения Tensor может быть определен только во время выполнения, вы можете напрямую указать None в этой позиции, чтобы занять это место.
Шаг 2: Определите модель
Нейронная сеть с одним скрытым слоем определяется путем вызова операторов, предоставляемых Fluid. Модель Fluid разделена на две части: структура модели и метод оптимизации. Это очень похоже на программы TensorFlow, использующие понятия, непосредственно соответствующие миграциям.
# define the network topology.
y = fluid.layers.fc(input=x, size=10, act="softmax")
loss = fluid.layers.cross_entropy(input=y, label=y_)
avg_loss = fluid.layers.mean(loss)
# define the optimization algorithm.
optimizer = fluid.optimizer.Adam(learning_rate=1e-3)
optimizer.minimize(avg_loss)
Fluid использует программу вместо вычислительного графа для описания модели.В общем, пользователям не нужно заботиться о деталях программы.При вызове вышеуказанных слоев переменные (тензоры) и операции над переменными будут вставлены в глобальную программу: жидкость .framework.default_main_program (слои и оптимизатор во фрагменте выше).
Шаг 3: Инициализация параметров
Как упоминалось выше, Executor в программе Fluid — это интерфейс, который соединяет внешний и внутренний интерфейс Fluid.
По умолчанию модель Fluid имеет как минимум две программы. Часть программы, которая инициализирует обучаемые параметры в сети, называется Fluid.default_startup_program().
Только исполнитель может выполнять Fluid-программу, поэтому перед инициализацией обучаемых параметров в сети необходимо сначала создать Fluid-исполнитель.
# define the executor.
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
В приведенном выше фрагменте кода место используется, чтобы сообщить исполнителю, на каком устройстве выполняется Fluid-программа.
Шаг 4: ввод данных + выполнение обучения модели
Наконец, модель нейронной сети, которую мы определили на шаге 2, вставляется в программу Fluid с именем Fluid.framework.default_main_program.
После инициализации обучаемых параметров сети их можно обучить, заставив исполнителя выполнить эту программу Fluid.framework.default_main_program.
train_reader = paddle.batch(
paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=5000),
batch_size=BATCH_SIZE)
feeder = fluid.DataFeeder(place=place, feed_list=[x, y_])
for pass_id in range(100):
for batch_id, data in enumerate(train_reader()):
loss = exe.run(
fluid.framework.default_main_program(),
feed=feeder.feed(data),
fetch_list=[avg_loss])
print("Cur Cost : %f" % (np.array(loss[0])[0]))
Как видно из приведенного выше фрагмента кода, процесс обучения программы Fluid очень близок к процессу обучения программы TensorFlow, они обе помещаются в цикл for, циклически считывают мини-пакет данных и вызывают исполнителя. для выполнения Fluiddefault_main_program: получить мини-пакетный ввод, на котором выполняются вычисления вперед, назад и обновление параметров.
Примечание. В приведенной выше программе используются встроенные данные MNIST Fluid, которые точно такие же, как данные MNIST, которые мы предоставили для примера программы TensorFlow.
Шаг 5: Наблюдайте за эффектом модели
Вышеуказанные шаги составили полную программу обучения модели Tensorflow.Потери наблюдаются один раз за партию, и итеративный эффект модели можно увидеть интуитивно:
▲ Рис. Кривая снижения стоимости задачи распознавания рукописных цифр Fluid MNIST
Прикрепленный: полный код
import numpy as np
import paddle.fluid as fluid
import paddle.v2 as paddle
def main():
BATCH_SIZE = 128
# define the input layers for the network.
x = fluid.layers.data(name="img", shape=[1, 28, 28], dtype="float32")
y_ = fluid.layers.data(name="label", shape=[1], dtype="int64")
# define the network topology.
y = fluid.layers.fc(input=x, size=10, act="softmax")
loss = fluid.layers.cross_entropy(input=y, label=y_)
avg_loss = fluid.layers.mean(loss)
optimizer = fluid.optimizer.Adam(learning_rate=5e-3)
optimizer.minimize(avg_loss)
# define the executor.
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
train_reader = paddle.batch(
paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=5000),
batch_size=BATCH_SIZE)
feeder = fluid.DataFeeder(place=place, feed_list=[x, y_])
for pass_id in range(100):
for batch_id, data in enumerate(train_reader()):
loss = exe.run(
fluid.framework.default_main_program(),
feed=feeder.feed(data),
fetch_list=[avg_loss])
print("Cur Cost : %f" % (np.array(loss[0])[0]))
if __name__ == "__main__":
main()
Суммировать
В этом разделе на основе набора данных MNIST для распознавания рукописных цифр мы демонстрируем реализацию той же полностью подключенной нейронной сети с одним скрытым слоем с использованием TensorFlow и PaddleFluid на полностью работоспособном примере. В этом примере демонстрируются основные концепции, пользовательские интерфейсы и варианты дизайна основных сред глубокого обучения.
Можно видеть, что, хотя внутренние реализации сильно различаются, для пользователей основные концепции модели глубокого обучения, в том числе: тензор, операция, оптимизатор, инициализация сети и т. д., имеют соответствующие реализации в каждой основной среде глубокого обучения. Если у вас есть опыт работы с одним фреймворком, этот опыт будет очень легко перенести на другие фреймворки глубокого обучения.
Из-за итеративного эффекта простая модель в этой статье соответствует обучающим данным, как и ожидалось, но эффект не впечатляет. Причина в том, что входными данными является значение пикселя изображения, модель нейронной сети здесь очень проста, а возможности подгонки ограничены. На следующих страницах мы будем использовать более сложные и практические примеры для дальнейшего сравнения того, как разные платформы глубокого обучения обучают одну и ту же нейронную сеть, и как наш опыт может переключаться и обобщаться между различными платформами, чтобы помочь нам выбрать наиболее подходящие инструменты для повышения эффективности. исследований и производства.
Группа обмена разработчиками PaddlePaddle
Хотите получить больше продуктов для глубокого обучения? Присоединяйтесь к группе обмена и общайтесь с инженерами в режиме реального времени!
Как вступить в группу: добавьте WeChat ID: pwbot02, отметьте «PaddlePaddle», чтобы присоединиться к группе.
О PaperWeekly
PaperWeekly — это академическая платформа для рекомендаций, интерпретации, обсуждения и публикации передовых статей об искусственном интеллекте. Если вы занимаетесь исследованиями или занимаетесь ИИ, нажмите на фон официальной учетной записи."Коммуникационная группа", ассистент перенесет вас в коммуникационную группу PaperWeekly.
Присоединяйтесь к сообществу:paperweek.ly
Общедоступный номер WeChat: paperweekly
Сина Вейбо: @PaperWeekly