flatten keras что это

Какова роль Flatten в Керасе?

Я пытаюсь понять роль Flatten функции в Керасе. Ниже мой код, который представляет собой простую двухуровневую сеть. Он принимает двумерные данные формы (3, 2) и выводит одномерные данные формы (1, 4):

Это распечатает, что y имеет форму (1, 4). Однако, если я удалю Flatten линию, она распечатает y форму (1, 3, 4).

Я этого не понимаю. Насколько я понимаю нейронные сети, model.add(Dense(16, input_shape=(3, 2))) функция создает скрытый полносвязный слой с 16 узлами. Каждый из этих узлов подключен к каждому из входных элементов 3×2. Следовательно, 16 узлов на выходе этого первого слоя уже являются «плоскими». Итак, форма вывода первого слоя должна быть (1, 16). Затем второй уровень принимает это как входные данные и выводит данные формы (1, 4).

Итак, если результат первого слоя уже «плоский» и имеет форму (1, 16), зачем мне его еще больше сглаживать?

Вот как работает Flatten, преобразуя матрицу в единый массив.

Сглаживание тензора означает удаление всех измерений, кроме одного. Это именно то, что делает слой Flatten.

Если мы возьмем исходную модель (со слоем Flatten), созданную, мы можем получить следующую сводку модели:

Надеюсь, что для этого резюме следующее изображение даст немного больше смысла о размерах ввода и вывода для каждого слоя.

Роль слоя Flatten в Keras очень проста:

Источник

На этом занятии мы посмотрим на построение архитектур нейронных сетей под новым углом зрения – с позиции функционального API пакета Keras. Давайте вначале разберемся, что это такое. Предположим, что мы хотим создать следующую модель НС:

И мы уже знаем, что это можно реализовать с помощью класса Sequential, о котором мы говорили на предыдущем занятии. Но эту же самую архитектуру можно описать подобно графам –через связи между слоями. Именно эта идея и положена в основу функционального описания модели.

Давайте посмотрим, как это делается.В начале программы подключим необходимые модули:

И установим зерно датчика случайных чисел в 1, чтобы обеспечить воспроизводимость результатов:

Затем, сформируем первыедва слоя так, как это мы обычно делали:

А, далее, свяжем их между собой, следующим образом:

Эта строчка и есть элемент функционального API пакета Keras. Но как это работает? Все очень просто. Смотрите, объект input – это тензор специального вида, имеющий типKerasTensor:

То есть, это объект, представляющий слой, а не конкретные данные. Далее, так как каждый слой в Keras является функтором (реализует магический метод __call__ и может быть вызван как функция), то при подаче ему на вход другого слоя, он делает не вычисления, а формирует связку с указанным слоем. Вот и все.

Конечно, эту связь можно описать короче, в виде:

Здесь мы сразу создаем объект и выполняем связывание со слоем input. В итоге, вся структура нейронной сети может быть описана в виде:

Но это еще не модель. Конечно, мы можем использовать сеть в таком виде, подавать на вход числовые данные и получать выходные значения, но нам бы хотелось получить полноценную модель, чтобы средствами Keras обучать ее и производить оценку эффективности. Для этого достаточно воспользоваться классом Model, о котором мы с вами уже говорили на предыдущих занятиях, и указать входы и выходы:

Все, модель сформирована с использованием функционального подхода и готова к использованию. Чтобы убедиться, что структура сети верная, выведем ее с помощью метода:

Как видите, все было сделано верно. Возможно, у вас возникнет вопрос: а зачем было все так усложнять? Почему бы не воспользоваться классом Sequential? Это было бы проще. Все верно. Для последовательных структур так и следует поступать. Однако, на практике относительно часто встречаются и другие архитектуры, которые не удается описать последовательными моделями. Либо, сделать это сложнее. В таких ситуациях, как раз, и используется функциональный подход к проектированию архитектур сетей.

Обучение сверточной нейронной сети

Давайте теперь обучим полученную модель сверточной НС для классификации изображений БД CIFAR-10. Сразу отмечу, что современные нейросети достигают здесь точности около 96,5%, а человек – всего 94%. Посмотрим, что получится у нас.

В этой БД имеется 50 000 полноцветных изображений, размером 32×32 пикселов в обучающей выборке и 10 000 таких же полноцветных изображений в тестовой выборке. Все изображения разбиты на 10 классов (см. рисунок). Наша задача отнести предъявленный образец нужному классу.

Вначале, как всегда, загрузим набор данных и стандартизуем их:

Затем, укажем оптимизатор и функцию потерь:

После этого, запустим процесс обучения:

В конце программы выполним оценку качества работы модели на тестовой выборке:

После запуска программы увидим качество распознавания на обучающей выборке в 87%, а на тестовой в 72%, что в целом неплохо, учитывая сложность задачи и простоту архитектуры НС. Предлагаю вам в качестве практики попытаться улучшить качество распознавания изображений БД CIFAR-10.

Читайте также:  пушкин песнь о вещем олеге какой жанр

Реализация сверточных слоев в Tensorflow

Так как этот курс посвящен не только Keras, но и Tensorflow, то я покажу пример реализации сверточных слоев на уровне Tensorflow. Делается относительно просто, но несколько сложнее, чем в Keras. Вначале определим вспомогательный класс слоя:

Я его взял из одного из предыдущих занятий и полносвязный слой заменил сверточным. Логика работы здесь следующая. Для сверток нужно задать размер фильтра (kernel), число выходных каналов (channels), смещение фильтров в плоскости входных каналов (strides) и режим формирования выходных каналов (padding). То есть, мы прописываем все те же параметры, что и в стандартном сверточном слое.

Затем, при первом вызове магического метода __call__() формируем наборы весовых коэффициентов размерностью:

[kernel_x,kernel_y, input_channels, output_channels]

И еще тензор коэффициентов для смещений (biases) размером:

После этого обращаемся к ветке tf.nn и вызываем функцию conv2d для применения фильтров к входному сигналу x. К полученному выходному тензору y применяем функцию активации и, таким образом, формируем выход сверточного слоя.

Использовать этот класс можно, следующим образом:

Применяя его к первому входному изображению, получаем на выходе 32 канала размерностью 16x 16 отсчетов:

Далее, можно применить операцию MaxPooling, например, так:

Сформируется тензор yразмерностью:

По аналогии можно реализовать и другие типы сверточных слоев. Затем, сформировать модель сети и обучить так, как мы это делали на первых занятиях.

Этот пример хорошо показывает, как Keras заметно облегчает описание архитектур нейронных сетей, а также их обучение.

Модели в функциональном API

Любую модель в Keras можно воспринимать как функциональный элемент и добавлять его в общую структуру сети, используя функциональный подход. В качестве примера давайте опишем архитектуру простого автоэнкодера, используя две независимые модели: модель кодера и модель декодера:

Если вы не знаете, что такое автоэнкодер, для чего он нужен и как работает, то смотрите занятие по этой теме в курсе «Нейронные сети»:

Вначале опишем модель кодера, используя сверточные слои:

А, затем, модельдекодера:

Теперь, используя модели encoder и decoder можно на их основе сформировать общую архитектуру автоэнкодера. Воспользуемся для этого функциональным подходом и будем рассматривать каждую модель как один единый элемент (объект):

Я здесь специально создал еще один входной слой, чтобы он был уникальным для автоэнкодера. Далее, связываем его с моделью кодера, а кодер с моделью декодера. Затем, из полученной структуры слоев и моделей формируем единую модель.

Причем, обратите внимание, в модели автоэнкодера не создаются копии архитектур кодера и декодера, а используются существующие. Это значит, что при обучении автоэнкодера мы будем автоматически обучать и модели кодера и декодера.

Давайте выполним этот шаг для БД изображений цифр MNIST. Вначале подготовим обучающую выборку:

Установим оптимизатор Adamдля автоэнкодера и потребуем минимум квадрата ошибки рассогласования между входным и выходным изображениями:

После этого можно запускать сам процесс обучения (одной эпохи вполне достаточно для этой задачи):

Все, модель обучилась, а это значит, что мы также обучили кодер и декодер. Давайте в этом убедимся. Пропустим первое тестовое изображение через кодер, а его выходной сигнал подадим на декодер:

В результате должны получить изображение похожее на входное. Для этого отобразим исходное изображение и восстановленное:

Как видим, результаты получились достаточно близкими. Это показывает, что кодер и декодер действительно обучились через автоэнкодер.

На следующем занятии мы продолжим эту тему и поближе познакомимся с принципом архитектуры ResNet, а также проблемами, связанными с обучением глубоких сетей.

Видео по теме

#1. Что такое Tensorflow? Примеры применения. Установка

#2. Тензоры tf.constant и tf.Variable. Индексирование и изменение формы

#3. Математические операции и функции над тензорами

#4. Реализация автоматического дифференцирования. Объект GradientTape

#5. Строим градиентные алгоритмы оптимизации Adam, RMSProp, Adagrad, Adadelta

#6. Делаем модель с помощью класса tf.Module. Пример обучения простой нейросети

#7. Делаем модель нейросети для распознавания рукописных цифр

#8. Декоратор tf.function для ускорения выполнения функций

#9. Введение в модели и слои бэкэнда Keras

#13. Создаем ResNet подобную архитектуру для классификации изображений CIFAR-10

#14. Тонкая настройка и контроль процесса обучения через метод fit()

#15. Тонкая настройка обучения моделей через метод compile()

#16. Способы сохранения и загрузки моделей в Keras

© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Источник

ML: Тензоры в Keras

Введение

Существует несколько фреймворков ( tensorflow, pytourch), которые обеспечивают эффективное вычисление подобных функций, в том числе на GPU. Первоначально синтаксис таких фреймворков был достаточно громоздким, поэтому Франсуа Шолле написал библиотеку в виде библиотеки keras, которая существенно упростила проектирование нейронных сетей. Со временем keras была поглощена Google и теперь развивается только в составе tensorflow версии 2.0 и выше.

Читайте также:  jitter что это в спидтест

Используемые ниже слои будем импортировать из tensorflow:

Тензоры в backend

Библиотека keras на нижнем уровне раньше могла работать с тензорами numpy, tensorflow или theano. Поэтому по традиции она оборачивает тензоры в свой собственный класс. Для этого используется окружение backend:

Так как тензоры участвуют в алгоритмах оптимизации, возникает необходимость различать постоянные ( constant) и переменные ( variable) тензоры:

Так как keras (вне tensorflow) может работать с различными бэкэндами, возвращаемый методом объект может быть, как numpy тензором, так и тензором tensorflow. Поэтому к их свойствам стоит «достукиваться» через функции backend:

Аналогично для переменных:

С тензорами keras можно обращаться подобно numpy тензорам:

Объекты слоёв

Первая особенность связана с тем, что вычисления выполняются не для одного тензора, а для их набора ( батча) размера batch_size. В задачах машинного обучения каждый тензор батча это один пример. При оптимизации параметров модели, ошибка вычисляется по всем примерам батча.

Слой Activation

Рассмотрим слой Activation, который вычисляет заданную функцию от каждого элемента тензора. Параметров для обучения у слоя нет и форма тензора на выходе совпадает с формой на входе.

Вычислим в numpy, например, гиперболический тангенса от тензора с формы (2,3):

В библиотеке keras мы должны преобразовать входной numpy-тензор val в keras-тензор x. Затем создаём экземпляр » a» класса слоя Activation и ему передаём входной тензор x. Слой возвращает выходной тензор y: Обратим внимание, что числа (собственно вычисления) получаются только после вызова K. eval(y). Эта функция запускает работу вычислительного графа ведущего в узел y.

Слой Flatten

Слой Flatten также не имеет параметров для обучения, но меняет форму тензора. Задача этого слоя состоит в преобразовании многомерного входного тензора в одномерный тензор (без учёта оси батча!).
На numpy это может выглядеть так:

На keras эти же вычисления выглядят следующим образом:

Полносвязный слой Dense

где многоточие обозначает, вообще говоря, произвольное число индексов, по-мимо обязательного нулевого индекса примеров батча: (batch_size. inputs) (inputs, units) + (units, ).

_\text \Bigg\< \overbrace< \begin <|c|c|c|c|>\hline 1 & 1 & 1 & 1 \\ \hline 1 & 1 & 1 & 1\\ \hline 1 & 1 & 1 & 1\\ \hline \end >^<\mathrm>

При добавлении вектора смещения ( bias) к матрице используется правило расширения ( broadcasting). По этому правилу вектор превращается в матрицу (inputs, units) с одинаковыми строчками.

Подчеркнём, что размерность входного тензора может быть любой:

Матрица в объекте слоя Dense создаётся, когда к нему присоединяется входой тензор (и становится известным размерность его последнего индекса:

Свёрточный слой Conv2D

Свёрточный слой Conv2D применяется к «картинкам» высотой rows, шириной cols и имеющих channels «цветовых» каналов. На самом деле графические термины условны и слой Conv2D может применяться не только при обработке изображений. Важно, что входящий в него тензор должен иметь форму: Для определённости будем использовать второй порядок, принятый в keras по умолчанию.

Задача слоя Conv2D состоит в обработке «изображения» небольшим фильтром, который по нему скользит. Фильтрация проводится одновременно по всем каналам. Ниже на рисунке картинка (вход x) имеет 3 строки, 4 колонки и 2 канала. Размер ядрa фильтра 2×2 пикселя и 2 в глубину для каналов ( 3D тензор: голубой кубик).

Элементы ядра (определяющие фильтр) перемножаются с соответствующими элементами такого же кубика на картинке (жёлтый цвет). Эти произведения складываются и к ним добавляется смещение bias (ещё один параметр фильтра). Результат вычислений помещается в первый пиксель на выходе y слоя (синий цвет). Затем жёлтый «кубик» сдвигается вправо (по умолчанию на один пиксель) и вычисляется следующее значение выхода.

У слоя может быть не один, а несколько фильтров с различными ядрами и смещениями (ниже голубой и салатовый кубики). В этом случае описанные выше вычисления проделываются для каждого фильтра f независимо. Выход слоя будет иметь число каналов (глубину) равное числу фильтров:

Свёртка на numpy и keras

Процесс вычисления одного пикселя выхода приведен на рисунке ниже (1*1+0*(-1)+1*1+0*(-1)=2):

Теперь выполним эти же вычисления на keras:

Универсальный слой Lambda

Если слои со стандартным поведением не подходят, можно воспользоваться слоем Lambda. Этому слою передаётся произвольная lambda-функция меняющая входящий в слой тензор. Единственное ограничение: внутри lambda-функции можно использовать только функции по работе с тензорами из backend. В противном случае keras не сможет вычислить градиент при обратном распространении ошибки.

Вычислим, например,сумму компонент входного тензора по axis=1 (второй индекс «признаков»):

На слой можно передать несколько тензоров, при помощи их списка. В качестве простого примера, сложим два тензора внутри lambda-функции:

Читайте также:  что делать если засохла гортензия в горшке

Источник

Нейронная сеть с использованием TensorFlow: классификация изображений

Привет, Хабр! Представляю вашему вниманию перевод статьи «Train your first neural network: basic classification».

Это руководство по обучению модели нейронной сети для классификации изображений одежды, таких как кроссовки и рубашки. Для создания нейронной сети используем python и библиотеку TensorFlow.

Установка TensorFlow

Для работы нам понадобятся следующие библиотеки:

Официальное руководство по установке TensorFlow (на англ.)
Запускаем Jupyter. Для запуска в командной строке пишем jupyter notebook.

Начало работы

В этом руководстве используется набор данных Fashion MNIST, который содержит 70 000 изображений в оттенках серого в 10 категориях. На изображениях показаны отдельные предметы одежды с низким разрешением (28 на 28 пикселей):

Мы будем использовать 60 000 изображений для обучения сети и 10 000 изображений, чтобы оценить, насколько точно сеть научилась классифицировать изображения. Вы можете получить доступ к Fashion MNIST непосредственно из TensorFlow, просто импортировав и загрузив данные:

Загрузка набора данных возвращает четыре массива NumPy:

Изображения представляют собой NumPy массивы 28×28, значения пикселей которых находятся в диапазоне от 0 до 255. Метки (labels) представляют собой массив целых чисел от 0 до 9. Они соответствуют классу одежды:

Метка Класс
0 T-shirt (Футболка)
1 Trouser (Брюки)
2 Pullover (Свитер)
3 Dress (Платье)
4 Coat (Пальто)
5 Sandal (Сандали)
6 Shirt (Рубашка)
7 Sneaker (Кроссовки)
8 Bag (Сумка)
9 Ankle boot (Ботильоны)

Имена классов не включены в набор данных, поэтому прописываем сами:

Исследование данных

Рассмотрим формат набора данных перед обучением модели.

Предварительная обработка данных

Перед подготовкой модели данные должны быть предварительно обработаны. Если вы проверите первое изображение в тренировочном наборе, вы увидите, что значения пикселей находятся в диапазоне от 0 до 255:

Мы масштабируем эти значения до диапазона от 0 до 1:

Отобразим первые 25 изображений из тренировочного набора и покажем имя класса под каждым изображением. Убедимся, что данные находятся в правильном формате.

Построение модели

Построение нейронной сети требует настройки слоев модели.

Основным строительным блоком нейронной сети является слой. Большая часть глубокого обучения состоит в объединении простых слоев. Большинство слоев, таких как tf.keras.layers.Dense, имеют параметры, которые изучаются во время обучения.

Первый слой в сети tf.keras.layers.Flatten преобразует формат изображений из 2d-массива (28 на 28 пикселей) в 1d-массив из 28 * 28 = 784 пикселей. У этого слоя нет параметров для изучения, он только переформатирует данные.

Следующие два слоя это tf.keras.layers.Dense. Это плотно связанные или полностью связанные нейронные слои. Первый слой Dense содержит 128 узлов (или нейронов). Второй (и последний) уровень — это слой с 10 узлами tf.nn.softmax, который возвращает массив из десяти вероятностных оценок, сумма которых равна 1. Каждый узел содержит оценку, которая указывает вероятность того, что текущее изображение принадлежит одному из 10 классов.

Скомпилирование модели

Прежде чем модель будет готова к обучению, ей потребуется еще несколько настроек. Они добавляются во время этапа компиляции модели:

Обучение модели

Обучение модели нейронной сети требует следующих шагов:

Чтобы начать обучение, вызовите метод model.fit:

При моделировании модели отображаются показатели потерь (loss) и точности (acc). Эта модель достигает точности около 0,88 (или 88%) по данным обучения.

Оценка точности

Сравним, как модель работает в тестовом наборе данных:

Оказывается, точность в тестовом наборе данных немного меньше точности в тренировочном наборе. Этот разрыв между точностью обучения и точностью тестирования является примером переобучения. Переобучение — это когда модель машинного обучения хуже работает с новыми данными, чем с данными обучения.

Прогнозирование

Используем модель для прогнозирования некоторых изображений.

Здесь модель предсказала метку для каждого изображения в тестовом наборе. Давайте посмотрим на первое предсказание:

Предсказание представляет собой массив из 10 чисел. Они описывают «уверенность» модели в том, что изображение соответствует каждому из 10 разных предметов одежды. Мы можем видеть, какая метка имеет наибольшее доверительное значение:

Таким образом, модель наиболее уверенна в том, что это изображение — Ankle boot (Ботильоны), или class_names [9]. И мы можем проверить тестовую метку, чтобы убедиться, что это правильно:

Напишем функции для визуализации этих предсказаний

Давайте посмотрим на 0-е изображение, предсказания и массив предсказаний.

Построим несколько изображений с их прогнозами. Правильные метки прогноза — синие, а неправильные метки прогноза — красные. Обратите внимание, что это может быть неправильно, даже когда он очень уверен.

Наконец, используем обученную модель, чтобы сделать предсказание об одном изображении.

Модели tf.keras оптимизированы для того, чтобы делать прогнозы на пакеты (batch) или коллекции (collection). Поэтому, хотя мы используем одно изображение, нам нужно добавить его в список:

Прогноз для изображения:

Как и прежде, модель предсказывает метку 9.

Если есть вопросы, пишите в комментариях или в личные сообщения.

Источник

Сказочный портал