Подробный обзор машинного обучения классификации CIFAR-10 и решения задач компьютерного зрения в TensorFlow.

Ранее размещено по адресу: http://www.aimechanic.com/2016/10/13/d242-tensorflow-cifar-10-tutorial-detailed-step-by-step-review-part-1/

вступление

В чем проблема компьютерного зрения cifar-10?
«CIFAR-10 — это установленный набор данных компьютерного зрения, используемый для распознавания объектов. Это подмножество набора данных 80 миллионов крошечных изображений и состоит из 60 000 цветных изображений 32x32, содержащих один из 10 классов объектов, по 6000 изображений на класс. Его собрали Алекс Крижевский, Винод Наир и Джеффри Хинтон». https://www.kaggle.com/c/cifar-10

Классификация CIFAR-10 — распространенная проблема в машинном обучении. Задача состоит в том, чтобы классифицировать изображения RGB размером 32×32 пикселя по 10 категориям: самолет, автомобиль, птица, кошка, олень, собака, лягушка, лошадь, корабль и грузовик. https://www.tensorflow.org/versions/r0.10/tutorials/deep_cnn/index.html

Классы полностью взаимоисключающие. Между легковым и грузовым транспортом нет пересечения. «Автомобиль включает в себя седаны, внедорожники и тому подобное. Грузовик включает только большие грузовики. Ни один из них не включает пикапы». http://www.cs.toronto.edu/~kriz/cifar.html

Ссылки для скачивания набора данных Cifar-10
Оригинал: http://www.cs.toronto.edu/~kriz/cifar.html
Хостинг на Kaggle: https: //www.kaggle.com/c/cifar-10/data

Цель руководства TensorFlow CIFAR-10:

Изучите TensorFlow и "Создание небольшой сверточной нейронной сети (CNN) для распознавания изображений"

Что такое сверточная нейронная сеть (CNN)?. Сверточная нейронная сеть (connets) — это нейронные сети, которые совместно используют свои параметры в пространстве. Подробное объяснение сверточных сетей:

Как работает сверточная нейронная сеть? https://www.youtube.com/watch?v=SQ67NBCLV98

Кашиф Расул — Введение в сверточную нейронную сеть: https://www.youtube.com/watch?v=W9_SNGymRwo

Узнайте о распознавании изображений: https://www.quora.com/Computer-Vision-What-are-the-best-resources-for-learning-about-image-recognition | Глубокое обучение и недавний прогресс в распознавании изображений: http://neuralnetworksanddeeplearning.com/chap6.html#recent_progress_in_image_recognition

Методы, используемые в этом уроке

Выпрямленные линейные активации (ReLU) — функция активации, определяемая

, он возвращает 0 для всех значений ниже 0 и само значение для любого > 0. Это намного проще в вычислениях. Подробнее читайте в статье ReLU против Sigmoind.

Максимальное объединение — объединяет наибольшее значение из выборки.

(https://en.wikipedia.org/wiki/Convolutional_neural_network#Pooling_layer)

Локальная нормализация ответа: позволяет обнаруживать высокочастотные функции с большим ответом нейронов, при этом подавляя ответы, которые одинаково велики в локальной выборке. Оригинальное описание можно найти в главе 3.3 Нормализация локального ответа здесь: http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf). Дополнительная литература: «Важность нормализации локального отклика в CNN» | «Что такое локальная нормализация ответов в сверточных нейронных сетях»

Эти слои в последнее время потеряли популярность, потому что на практике их вклад оказался минимальным (Класс Стэнфордского университета: CS231n Convolutional Neural Networks for Visual Recognition)

График скорости обучения: применяет экспоненциальное затухание к скорости обучения. Вычисляется как:

(https://www.tensorflow.org/versions/r0.11/api_docs/python/train.html#exponential_decay)

Threading and Queues — механизм асинхронных вычислений. Потоки и очереди в TensorFlow.

Классификатор Softmax — предоставляет «вероятности» для каждого класса.

Подробная лекция Джеффри Хинтона: https://www.youtube.com/watch?v=mlaLLQofmR8

Узнайте больше о softmax: http://cs231n.github.io/linear-classify/#softmax | Полный плейлист: https://www.youtube.com/watch?v=mlaLLQofmR8&list=PLoRl3Ht4JOcdU872GhiYWf6jwrk_SNhz9&index=18 | SVM против SoftMax (CS231n)

Файлы в этом руководстве

  • cifar10_input.py — обрабатывает формат бинарного файла CIFAR-10.
  • cifar10.py — строит модель TensorFlow CIFAR-10.
  • cifar10_train.py — обучает модель TensorFlow CIFAR-10.
  • cifar10_eval.py — оценивает производительность модели

cifar10_input.py — обработка бинарника CIFAR-10

Методы:

read_cifar10(filename_queue) — читает и анализирует примеры из файлов данных (из ‘filename_queue’), возвращает объект, представляющий отдельный пример (поля: высота, ширина, глубина, ключ, метка, uint8image)

_generate_image_and_label_batch(image, label, min_queue_examples, batch_size, shuffle) — строит перемешанную (если shuffle == true) очередь изображений с метками, возвращает изображения (тензор 4D: batch_size, высота, ширина, глубина), и метки (тензор 1d: batch_size).

distorted_inputs(data_dir, batch_size) — создает искаженный ввод, возвращает искаженные изображения и метки. Искажения, применяемые к изображению: обрезка; отразить изображение по горизонтали; изменение яркости, изменение контраста.

inputs(eval_data, data_dir, batch_size) — создание входных данных для оценки CIFAR.

используемые библиотеки:
numpy — научные вычисления с Python
six.moves — поддержка кодовых баз для работы на Python 2 и Python 3
«from tensorflow.models.image.cifar10 import cifar10» следует заменить на «import cifar10», если вы хотите изменить код.

cifar10.py — строит модель

«из tensorflow.models.image.cifar10 импортировать cifar10_input» следует заменить на «импортировать cifar10_input»:

Флаги по умолчанию:

  • data_dir (путь к каталогу данных CIFAR-10): ‘/tmp/cifar10_data’
  • batch_size (количество изображений для обработки в пакете): 128
  • use_fp16 (обучить модель с помощью fp16): False

определено здесь:

Глобальные константы, описывающие набор данных CIFAR-10:

IMAGE_SIZE: 24 | <type 'int'>
NUM_CLASSES: 10 | <type 'int'>
NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN: 50000 | <type 'int'>
NUM_EXAMPLES_PER_EPOCH_FOR_EVAL: 10000 | <type 'int'>

определено здесь:

и в cifar10_input.py:

Константы, описывающие процесс обучения:

MOVING_AVERAGE_DECAY: 0.9999 | <type 'float'>
NUM_EPOCHS_PER_DECAY: 350.0 | <type 'float'>
LEARNING_RATE_DECAY_FACTOR: 0.1 | <type 'float'>
INITIAL_LEARNING_RATE: 0.1 | <type 'float'>

определено здесь:

TOWER_NAME = 'tower'
DATA_URL = 'http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz'

Методы:

_activation_summary(x) — помощник создает сводку для активаций тензора «, предоставляет гистограмму и измеряет разреженность активаций.

_variable_on_cpu(name, shape, initializer) — помощник создает и возвращает переменную, хранящуюся в памяти процессора, со следующими параметрами: name (имя переменной), shape (список целых чисел) и initializer (инициализатор для переменной). dtape (DataType) имеет значение float32, если use_fp16==False.

_variable_with_weight_decay(name, shape, stddev, wd) — хелпер создает и возвращает инициализированную Variable с уменьшением веса со следующими параметрами: name (имя переменной), shape(список целых чисел), stddev (стандартное отклонение усеченной гауссианы) и wd (уменьшение веса L2Loss будет умножено на это число с плавающей запятой, если = = Нет, без уменьшения веса). dtape (DataType) имеет значение float32, если use_fp16==False. Справочный материал: Усеченное нормальное распределение (вики).

distorted_inputs() — создает искаженные входные данные для обучения CIFAR, возвращает искаженные изображения и метки. Подробнее см. в разделе cifar10_input.py/distorted_inputs. Возвращает изображения (тензор 4D: размер_пакета, высота, ширина, глубина) и метки (тензор 1D: размер_пакета).

inputs(eval_data) — создает входные данные для оценки CIFAR с помощью ‘eval_data’.

inference(images) — строит модель TensorFlow CIFAR-10 с «изображениями» из distorted_inputs или входных данных, возвращает softmax_linear.

Эта модель CIFAR-10 состоит из следующих слоев:

  • местный4

  • softmax_linear — классификатор Softmax (см. объяснение выше).

потеря(логики, метки) — добавьте L2Loss (сумму потерь и потерь/средних) ко всем обучаемым переменным, используйте логиты (логиты из вывода) и метки из distorted_inputs' или 'входные данные'. Подробнее читайте в статье Функция потерь в машинном обучении.

_add_loss_summaries(total_loss) — генерирует среднее значение для всех потерь и сводки для визуализации производительности сети. Вызывается из «поезда»:

train(total_loss, global_step) — обучает модель TensorFlow CIFAR-10: создает оптимизатор и применяет ко всем обучаемым переменным, добавляет скользящие средние для всех обучаемых переменных, использует «total_loss» («loss» ) и 'global_step' (целое число, количество обработанных шагов обучения). Уменьшает скорость обучения ("LEARNING_RATE_DECAY_FACTOR"). Создает скользящие средние всех потерь ("total_loss"). Вычисляет и применяет градиенты («tf.train.GradientDescentOptimizer(lr)» и «tf.train.GradientDescentOptimizer(lr).apply_gradients(tf.train.GradientDescentOptimizer(lr).compute_gradients(total_loss), global_step=global_step)»). Создает гистограммы для обучаемых переменных и градиентов. Отслеживает скользящие средние переменных.

maybe_download_and_extract() — загружает и извлекает архив из http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz » на FLAGS.data_dir (по умолчанию /tmp/cifar10_data).

cifar10_train.py — Обучение модели TensorFlow CIFAR-10

Использует библиотеки «six.moves» и «tensorflow».

«from tensorflow.models.image.cifar10 import cifar10» следует заменить на «import cifar10», если вы хотите внести изменения в файл.

Обучение Cifar-10 — флаги по умолчанию:

  • train_dir (каталог для записи журналов событий и контрольной точки): ‘/tmp/cifar10_train
  • max_steps (количество пакетов для запуска): 1 000 000
  • log_device_placement (регистрировать размещение устройства): False (для параметра log_device_placement задано значение True, помогает найти узнать, каким устройствам назначены ваши операции и тензоры, используемые в вычислениях с несколькими графическими процессорами в TensorFlow).

main(argv=None) — проверяет, существует ли каталог «FLAGS.train_dir», если нет, создает каталог и загружает набор данных, в противном случае запускает train().

train() — основная функция обучения Cifar-10, обучает количество шагов, указанное в 'FLAGS.max_steps' (значение по умолчанию: 1'000'000) .

  • Получает набор данных (

  • ).
  • Создает график, который вычисляет прогнозы логитов на основе модели вывода «cifar10.inference(images)».
  • Вычисляет ‘потери’ (cifar10.loss(logits, labels)). Определяет train_op (train_op = cifar10.train(loss, global_step)).
  • Создает заставку (tf.train.Saver), которая сохраняет и восстанавливает (при необходимости) все переменные:

  • Создает сводную операцию на основе набора сводок TensorFlow («summary_op»).
  • Строит операцию инициализации init:

  • Создает и запускает 'tf.Session'' (sess.run) с 'init' и 'config=tf .ConfigProto(log_device_placement=FLAGS.log_device_placement)'.
  • Запускает потоки для всех обработчиков очередей, собранных в графе, и возвращает список всех потоков.
  • Записывает буферы сводного протокола с помощью ‘tf.train.SummaryWriter’ в файлы событий.
  • Запускает ‘tf.Session’ с функциями ‘train_op’ и ‘loss’:

  • в цикле, пока не будет достигнуто значение «FLAGS.max_steps» (1 000 000 шагов).
  • Периодически сообщает (каждый 10-й шаг) и сохраняет (каждый 1000-й шаг) контрольные точки модели.

cifar10_eval.py — оценка производительности модели TensorFlow CIFAR-10.

Оценка Cifar-10 — флаги по умолчанию:

  • eval_dir (каталог для записи журналов событий и контрольной точки): ‘/tmp/cifar10_eval
  • eval_data (либо «test», либо «train_eval»): «test»
  • checkpoint_dir (где читать контрольные точки модели): ‘/tmp/cifar10_train
  • eval_interval_secs (как часто проводить оценку) — каждые 5 минут (60*5)
  • num_examples (количество примеров для оценки) — 10 000
  • run_once (если True, оценка будет запущена только один раз) — False

main(argv=None) — проверяет, существует ли каталог ‘FLAGS.eval_dir’, при необходимости создает каталог и запускает evaluate().

eval_once(saver,summ_writer,top_k_op,summ_op) — запускает одну оценку:

  • Проверяет, записаны ли какие-либо контрольные точки в FLAGS.checkpoint_dir(‘/tmp/cifar10_train’). Если ничего не найдено, возвращается ‘Файл контрольной точки не найден’. Если вы получаете эту ошибку, убедитесь, что вы запустили «cifar10_train.py» как минимум на 1000 шагов.
  • Запускает обработчиков очередей (Читать далее: Координатор TensorFlow и QueueRunner), которые подсчитывают количество правильных предсказаний и вычисляют точность.

evaluate() — оценка модели TensorFlow CIFAR-10 за несколько шагов.

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

Дополнительная литература:

d246: Учебное пособие по TensorFlow CIFAR-10, подробный пошаговый обзор, часть 2