Tensorflow (1) ИТ-мужчины, идентифицирующие розы

искусственный интеллект TensorFlow Архитектура Обычные выражения

Это история про айтишника

ИТ-специалист начинает учиться распознавать розы с помощью кодовой базы Inception

жизненный опыт

    В области машинного обучения сверточные нейронные сети лежат в основе большинства современных решений компьютерного зрения и подходят для самых разных задач. Среди них кодовая база Tensorflow Inception также решает проблему классификации изображений на основе этой сети. Сеть Inception реализует документ «Переосмысление исходных архитектур для компьютерного зрения», опубликованный в 2015 году (Rethinking the Inception Architecture for Computer Vision).
    в статье исследуется, что за счет правильной декомпозиции свертки и агрессивной регуляризации увеличенная вычислительная мощность может быть использована максимально эффективно для достижения существенных преимуществ, которые лучше, чем современные. В документе также описаны некоторые поучительные принципы проектирования сетей. Хотя практичность этих принципов проектирования, основанных на крупномасштабных испытаниях, является спекулятивной, для оценки их точности и достоверности в будущем потребуются дополнительные экспериментальные данные. Серьезные отклонения от этих принципов будут часто приводят к ухудшению качества сети, а реализация исправления отклонений по принципам также улучшит общую архитектуру.

Первый принцип заключается в том, что входные и выходные данные не должны подвергаться чрезмерному сжатию на ранней стадии проектирования сети. При проектировании сети необходимо грубо извлечь объекты в соответствии с данными каждого измерения карты объектов.Обычно размер данных карты объектов, достигающих сетевого слоя, постепенно уменьшается от входа к выходу, но если данные чрезмерно сжатый на ранней стадии, это приведет к массивной потере информации. Информативность оценивается не только размерностью карты объектов, но также требует таких важных факторов, как структура корреляции. Потеря информации повлияет на качество обучения сети.
Второй принцип заключается в том, что представление карты объектов в высоких широтах может быть локально заменено сетью. Постепенно увеличивая нелинейный ответ активации в сверточной нейронной сети, можно получить больше возможностей и ускорить обучение сети.
Третий принцип заключается в уменьшении размерности многоканальных низкоразмерных признаков перед сверточной сетью без уменьшения информации о признаках. Например, перед выполнением (например, 3×3) сверток можно уменьшить размерность входного представления до пространственного агрегирования без серьезных побочных эффектов. Причина основана на предположении, что сильная корреляция между соседними ячейками приводит к гораздо меньшим потерям информации при уменьшении размерности. Учитывая эти принципы, должно быть возможно сжатие данных, а уменьшение размера должно способствовать более быстрому обучению.
Четвертый принцип заключается в том, чтобы найти наилучшую структуру сети, сбалансировать ширину и глубину сети и оптимизировать производительность сети. Уравновешивание количества фильтров на этапе и глубины сети может улучшить оптимальную производительность сети. Увеличение ширины и глубины сети может улучшить качество сети. Если два параметра увеличиваются параллельно, можно достичь наилучшего результата оптимизации при постоянном объеме вычислений. Поэтому вычислительный бюджет должен распределяться между глубиной и шириной сети сбалансированным образом.

    Хотя эти принципы могут иметь смысл, их непосредственное применение для улучшения качества Интернета — непростая задача. Сеть Inception только постепенно приближается к этим принципам проектирования, используя их смутно.
   Бумажная часть подробно описываться не будет, пожалуйста, обратитесь к бумаге:Rethinking the Inception Architecture for Computer Vision.
    Аналитический документ с ICLR 2017An analysis of deep neural network models for practical applicationsВсесторонний анализ важных методов в практических приложениях: точность, объем памяти, параметры, количество операций, время логического вывода и энергопотребление. Среди них, с точки зрения точности, сеть Inception показала наилучшую производительность, но, конечно, она не достигла наилучшей производительности в других измерениях. Результаты оценки точности следующие:

Введение в начальный код

   В то же время Google открыл инструмент под названием Tensorflow.Modelsкодовая база. Кодовая база содержит множество различных моделей, реализованных в [TensorFlow] (https://www.tensorflow.org), и имеет следующую структуру:
   -official: набор примеров моделей, использующих высокоуровневый API TensorFlow. Разработан для разработки с использованием новейшего и наиболее стабильного API TensorFlow, протестирован и поддерживает актуальность кода. Официально рекомендуется, чтобы новые пользователи TensorFlow начинали обучение здесь.
   -research: это большая коллекция моделей, реализованных исследователями в TensorFlow. Официально они не поддерживаются, модели поддерживаются отдельными исследователями, но также являются наиболее активными каталогами кода.
   -samples: содержит фрагменты кода и меньшие модели, демонстрирующие возможности TensorFlow, включая код, предоставленный в различных сообщениях блога.
   -tutorials:ДаУчебник по TensorFlowКоллекция моделей, описанных в .
    Среди нихInceptionКодовая базаresearchЧасть файловой структуры и описания выглядит следующим образом:

├── README.md  #非常全面的inception代码库的描述
├── WORKSPACE #bazel编译使用
├── g3doc
│   └── inception_v3_architecture.png #inception_v3网络体系结构的说明图示
└── inception
    ├── BUILD
    ├── data #训练数据的标注和代码目录
    │   ├── build_image_data.py #使用protos将图片数据转换为TFRecord文件格式
    │   ├── build_imagenet_data.py #使用protos将ImageNet图片数据集转换为TFRecord文件格式
    │   ├── download_and_preprocess_flowers.sh #下载花朵数据集并将数据集转化为TFRecord文件格式
    │   ├── download_and_preprocess_flowers_mac.sh 
    │   ├── download_and_preprocess_imagenet.sh #下载2012ImageNet训练和评估数据集并将数据集转化为TFRecord文件格式
    │   ├── download_imagenet.sh # 下载2012ImageNet训练和评估数据集
    │   ├── imagenet_2012_validation_synset_labels.txt #训练数据的标签与preprocess_imagenet_validation_data.py一起对数据进行处理
    │   ├── imagenet_lsvrc_2015_synsets.txt #训练数据的标签
    │   ├── imagenet_metadata.txt #训练数据的标签和对应的语义
    │   ├── preprocess_imagenet_validation_data.py #将2012 ImageNet图片和标签相关联
    │   └── process_bounding_boxes.py #将图片数据和标签数据相关联的脚本
    ├── dataset.py # 轻量级的管理训练数据集合的库
    ├── flowers_data.py # 使用DataSet管理的花朵训练数据
    ├── flowers_eval.py # 对花朵分类训练模型的评估脚本,对inception_eval.py的封装
    ├── flowers_train.py # 对花朵分类的训练脚本,对inception_train.py的封装
    ├── image_processing.py #处理单张图片的库,支持多个线程并行和预处理图片。
    ├── imagenet_data.py # 使用DataSet管理的ImageNet训练数据
    ├── imagenet_distributed_train.py #支持分布式系统进行ImageNet训练的库,对inception_distributed_train.py的封装
    ├── imagenet_eval.py # 对ImageNet数据集训练模型的评估脚本
    ├── imagenet_train.py #对ImageNet数据集的训练脚本
    ├── inception_distributed_train.py # 支持分布式系统进行inception的网络的训练
    ├── inception_eval.py # inception网络训练模型的评估验证库
    ├── inception_model.py # 构建inception v3网络的模型在数据集上
    ├── inception_train.py # inception网络训练脚本库
    └── slim  #Tensorflow中一个轻量级的包含设计,训练和评估模型的代码库,本文不做讨论。

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

Во-первых, объясняются параметры флага, используемые сценарием обучения начальной сети.

Параметры флага следующие:
   train_dir:Он используется для записи журналов событий и контрольных точек, то есть файлов events.out.xxx и model.ckpt-xxxx, сгенерированных обучением.Значение по умолчанию — «/tmp/imagenet_train».
   макс_шагов:Максимальное количество шагов для обучения, значение по умолчанию 10000000.
   подмножество:Описывает, следует ли обучать или проверять. Значение по умолчанию — «поезд».

    используется для управления оборудованием, используемым для запуска тензорного потока.
   num_gpus:Управляет аппаратным обеспечением, используемым для запуска tensorflow, этот параметр указывает количество используемых графических процессоров, значение по умолчанию — 1.
   log_device_placement:Укажите, следует ли записывать устройство, значение по умолчанию — False.

    Типы обучения для управления
   тонкая настройка:Управляет типом обучения, если установлено, случайным образом инициализируются веса последнего слоя, чтобы обучить сеть новым задачам. Значение по умолчанию — False, что означает, что вы можете продолжить обучение на предварительно обученной модели.
   pretrained_model_checkpoint_path:Укажите путь к предобучающей модели, сохраненной в начале новой обучающей задачи.

    Ниже приведены параметры настройки скорости обучения, которые сильно зависят от аппаратной архитектуры, размера партии и изменений в спецификации архитектуры модели. Выбор точно настроенной скорости обучения — это эмпирический процесс, требующий некоторых экспериментов.
   начальная_учебная_ставка:Начальная скорость обучения. Значение по умолчанию — 0,1.
   num_epochs_per_decay:Период адаптации для снижения скорости обучения.
   Learning_rate_decay_factor:Фактор параметра для настройки скорости обучения.

Во-вторых, проанализируйте метод Tower_loss, определенный в скрипте.

функция:_tower_loss
    используется для расчета общих потерь на одной башне обученной модели. Во время обучения программа разделит задачу пакетного изображения, и пакет изображений будет разделен на разные башни. т.е. если batch_size = 32 и num_gpus = 2, то каждая башня будет обрабатывать 16 изображений.
1. Используйте начало для построения графа сетевых рассуждений.

with tf.variable_scope(tf.get_variable_scope(), reuse=reuse_variables):
    logits = inception.inference(images, num_classes, for_training=True,
                                 restore_logits=restore_logits,
                                 scope=scope)

2, расчет порции потерь построил рассуждение на фиг.

split_batch_size = images.get_shape().as_list()[0]
inception.loss(logits, labels, batch_size=split_batch_size)

3. Соберите все потери только в текущей башне.

losses = tf.get_collection(slim.losses.LOSSES_COLLECTION, scope)

где slim исходит из файла loss.py в изначальном каталоге slim. Этот метод получает все значения потерь сети. где LOSSES_COLLECTION = '_потери'

4. Рассчитайте все потери текущей башни.

regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
total_loss = tf.add_n(losses + regularization_losses, name='total_loss')

Добавление регулярного члена к функции потерь является важным способом предотвращения переобучения.Получите регуляризованное значение потерь, получив все переменные в наборе tf.GraphKeys.REGULARIZATION_LOSSES.

5. Настройте параметры, начальная скорость затухания равна 0,9, и рассчитайте скользящее среднее всех потерь и общих потерь.

loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg')
loss_averages_op = loss_averages.apply(losses + [total_loss])

Используйте функцию tf.train.ExponentialMovingAverage для создания скользящего среднего и обновления параметров для управления скоростью обновления модели. Сохраните все потери в глобальной переменной (GraphKeys.MOVING_AVERAGE_VARIABLES), а затем выполните каждый итеративный расчет скользящей средней для каждой переменной посредством применения.

Наконец, для некоторого анализа тренировочная функция Inception.

Функция: тренироваться на наборе данных.

# Создайте переменную global_step для подсчета количества вызовов поездов. Это равно количеству обработанных пакетов * FLAGS.num_gpus.

global_step = tf.get_variable(
        'global_step', [],
        initializer=tf.constant_initializer(0), trainable=False)

# Рассчитайте схему корректировки, чтобы получить скорость обучения.

num_batches_per_epoch = (dataset.num_examples_per_epoch() / FLAGS.batch_size)
decay_steps = int(num_batches_per_epoch * FLAGS.num_epochs_per_decay)

# Экспоненциально уменьшайте скорость обучения в зависимости от количества шагов.

lr = tf.train.exponential_decay(FLAGS.initial_learning_rate,
                                    global_step,
                                    decay_steps,
                                    FLAGS.learning_rate_decay_factor,
                                    staircase=True)

# Создайте оптимизатор, выполняющий градиентный спуск с использованием алгоритма RMSProp.

opt = tf.train.RMSPropOptimizer(lr, RMSPROP_DECAY,
                                    momentum=RMSPROP_MOMENTUM,
                                    epsilon=RMSPROP_EPSILON)

# Получайте изображения и метки для ImageNet и разделяйте пакеты между графическими процессорами.

split_batch_size = int(FLAGS.batch_size / FLAGS.num_gpus)

# Переопределить количество потоков предварительной обработки, чтобы учесть возросшее количество башен.

num_preprocess_threads = FLAGS.num_preprocess_threads * FLAGS.num_gpus
images, labels = image_processing.distorted_inputs(
        dataset,
        num_preprocess_threads=num_preprocess_threads)

#Dataset Количество классов в наборе меток плюс 1. Метка 0 зарезервирована для (неиспользуемых) фоновых классов.

num_classes = dataset.num_classes() + 1

# Разделите башни на пакеты изображений и меток.

images_splits = tf.split(axis=0, num_or_size_splits=FLAGS.num_gpus, value=images)
labels_splits = tf.split(axis=0, num_or_size_splits=FLAGS.num_gpus, value=labels)

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

with slim.arg_scope([slim.variables.variable], device='/cpu:0'):
	loss = _tower_loss(images_splits[i], labels_splits[i], num_classes,
                           scope, reuse_variables)

# Повторно используйте переменные для следующей башни.

reuse_variables = True

# Держите сводку финальной башни.

summaries = tf.get_collection(tf.GraphKeys.SUMMARIES, scope)

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

batchnorm_updates = tf.get_collection(slim.ops.UPDATE_OPS_COLLECTION, scope)

# Рассчитайте градиент пакета ImageNet на этой башне.

grads = opt.compute_gradients(loss)

# Отслеживание градиентов для всех башен.

tower_grads.append(grads)

# Рассчитать среднее значение каждого градиента. Обратите внимание, что здесь все башни начинают синхронизироваться.

grads = _average_gradients(tower_grads)

#Добавить сводку для отслеживания скорости обучения.

summaries.append(tf.summary.scalar('learning_rate', lr))

# Добавить гистограмму градиента.

for grad, var in grads:
      if grad is not None:
        summaries.append(
            tf.summary.histogram(var.op.name + '/gradients', grad))

# Применение градиентов для настройки общих переменных.

apply_gradient_op = opt.apply_gradients(grads, global_step=global_step)

# Добавьте гистограмму для обучаемых переменных.

for var in tf.trainable_variables():
      summaries.append(tf.summary.histogram(var.op.name, var))

# Отслеживайте скользящее среднее всех обучаемых переменных. Поддерживает «двойное среднее» глобальной статистики BatchNormalization. Это сложнее, чем необходимо, но его использование обратно совместимо с предыдущими моделями.

variable_averages = tf.train.ExponentialMovingAverage(
        inception.MOVING_AVERAGE_DECAY, global_step)
variables_to_average = (tf.trainable_variables() +  tf.moving_average_variables())
variables_averages_op = variable_averages.apply(variables_to_average)

# Сгруппировать все обновления в один тренинг.

batchnorm_updates_op = tf.group(*batchnorm_updates)
train_op = tf.group(apply_gradient_op, variables_averages_op, batchnorm_updates_op)

# Создать заставку.

saver = tf.train.Saver(tf.global_variables())

# Создайте сводное действие из последней сводки башни.

summary_op = tf.summary.merge(summaries)

# Создайте действие инициализации для запуска ниже.

init = tf.global_variables_initializer()

# Начать выполнение операций на графике. Для построения башен на графическом процессоре параметру Allow_soft_placement должно быть присвоено значение True, поскольку некоторые операционные системы не имеют реализации графического процессора.

sess = tf.Session(config=tf.ConfigProto(
        allow_soft_placement=True,
        log_device_placement=FLAGS.log_device_placement))
    sess.run(init)

    if FLAGS.pretrained_model_checkpoint_path:
      …
      variables_to_restore = tf.get_collection(slim.variables.VARIABLES_TO_RESTORE)
      restorer = tf.train.Saver(variables_to_restore)
      restorer.restore(sess, FLAGS.pretrained_model_checkpoint_path)
      …

#Нужно запустить очередь.

tf.train.start_queue_runners(sess=sess)

    # 创建写入器
    summary_writer = tf.summary.FileWriter(FLAGS.train_dir, graph=sess.graph)
    for step in range(FLAGS.max_steps):
      …
      # 执行本步的训练操作
      start_time = time.time()
      _, loss_value = sess.run([train_op, loss])

     …

      # 每100步更新一次摘要信息
      if step % 100 == 0:
        summary_str = sess.run(summary_op)
        summary_writer.add_summary(summary_str, step)

      # 周期的保存checkpoint文件,这里是5000步执行一次
      if step % 5000 == 0 or (step + 1) == FLAGS.max_steps:
        checkpoint_path = os.path.join(FLAGS.train_dir, 'model.ckpt')
        saver.save(sess, checkpoint_path, global_step=step)

Поняв метод обучения, вы можете точно настроить сеть.

Практическая проверка

Практическая ссылка на началоREADMEДокументация, в этой статье представлены только 4 из них: ###Как настроить предварительно обученную модель для новой задачи

Один, начало

    Перед вызовом метода обучения данные изображения и метки должны быть предварительно обработаны, то есть новый набор данных преобразуется в сегментированный формат TFRecord, а каждая запись представляет собой сериализованную протоструктуру tf.Example. Кодовая база предоставляет сценарий, демонстрирующий, как это сделать для небольшого набора данных из нескольких тысяч изображений цветов, разбросанных по 5 меткам.

daisy, dandelion, roses, sunflowers, tulips

Кодовая база     предоставляет автоматический скрипт (download_and_preprocess_flowers.sh) для загрузки набора данных и преобразования его в формат TFRecord. Как и в наборе данных ImageNet, каждая запись в формате TFRecord представляет собой сериализованную протоструктуру tf.Example, записи которой включают строки в формате JPEG и целочисленные метки. Подробнее см. в разделе parse_example_proto.
    Скрипт должен выполняться всего несколько минут, в зависимости от скорости вашего интернет-соединения для загрузки и обработки изображений. Вам нужно 200 МБ свободного места на жестком диске (что намного меньше, чем полный набор данных ImageNet объемом 500 ГБ+ 2012 года). Здесь мы выбираем DATA_DIR=/tmp/flowers-data/ в качестве такого местоположения, но не стесняйтесь редактировать его.

# 设置flower数据存储位置 
FLOWERS_DATA_DIR=/tmp/flowers-data/

# 构建预处理脚本
cd tensorflow-models/inception
bazel  
build //inception:download_and_preprocess_flowers

# 运行脚本下载并处理数据 
bazel-bin/inception/download_and_preprocess_flowers "${FLOWERS_DATA_DIR}"

Если сценарий работает успешно, последняя строка вывода терминала должна выглядеть так:

2016-02-24 20:42:25.067551: Finished writing all 3170 images in data set.

    Когда сценарий завершится, в DATA_DIR будут найдены 2 шарда для файлов обучения и проверки. Эти файлы аналогичны файлам train-?????-of-00002 и validation-?????-of-00002, представляя набор данных для обучения и набор данных для проверки соответственно.
Уведомление:
    Если вы готовите пользовательский набор данных изображений, вам необходимо вызвать build_image_data.py для пользовательского набора данных.

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

# 指定下载模型要存储的路径
INCEPTION_MODEL_DIR=$HOME/inception-v3-model
  
mkdir -p ${INCEPTION_MODEL_DIR}

cd ${INCEPTION_MODEL_DIR}

# 通过curl命令下载模型压缩包
curl -O http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz
tar xzf inception-v3-2016-03-01.tar.gz

# 将会在目录中创建一个名为inception-v3的目录,并包含下面的文件
> ls inception-v3

README.txt

checkpoint

model.ckpt-157585

Предварительно обученную модель Inception v3 теперь можно настроить с помощью набора данных цветов.

Во-вторых, как переобучить модель на цветочных данных.

Чтобы настроить предварительно обученную модель Inception-v3 на наборе данных цветов, вам необходимо изменить 2 параметра обучающего скрипта:
   -pretrained_model_checkpoint_path: Путь к предварительно обученной модели Inception-v3. Если этот флаг указан, он будет загружать всю модель из контрольной точки до того, как скрипт начнет обучение.
   -fine_tune: логическое значение, указывающее, следует ли инициализировать последний слой классификации случайным образом или восстановить. Вы можете установить для этого флага значение false, если хотите продолжить обучение предварительно обученной модели с контрольной точки. Если для этого флага установлено значение true, новый классификационный слой можно обучить с нуля.

В совокупности предварительно обученную модель Inception-v3 для набора данных цветов можно переобучить с помощью следующих команд.

# 通过bazel构建flowers_train网络,该网络在源码上封装了对inception_train的调用。
cd tensorflow-models/inception

bazel build //inception:flowers_train

# 设置下载好的预训练的模型路径.

MODEL_PATH="${INCEPTION_MODEL_DIR}/inception-v3/model.ckpt-157585"

# 设置数据保存的路径,该数据已经是TFRecord文件格式
FLOWERS_DATA_DIR=/tmp/flowers-data/

# 设置保存训练中输出的事件日志和检查点数据
TRAIN_DIR=/tmp/flowers_train/

# 通过flowers_train网络开始使用预训练的模型重新训练花朵数据,fine_tune设置为True。
bazel-bin/inception/flowers_train --train_dir="${TRAIN_DIR}" 
--data_dir="${FLOWERS_DATA_DIR}" 
--pretrained_model_checkpoint_path="${MODEL_PATH}" 
--fine_tune=True 
--initial_learning_rate=0.001 
--input_queue_memory_factor=1

Добавлено несколько дополнительных опций во время обучения.

  • Тонкая настройка модели на отдельный набор данных требует значительного снижения начальной скорости обучения. Мы устанавливаем начальную скорость обучения на 0,001.
  • Набор данных цветов очень мал, поэтому мы уменьшили размер очереди примеров. Дополнительные сведения см. в разделе Настройка требований к памяти.

Обучающий скрипт сообщит только о проигрыше. Чтобы оценить качество доработанной модели, нужно запустить скрипт валидации flowers_eval:

# 开始构建flowers_eval模型
cd tensorflow-models/inception

bazel build //inception:flowers_eval

# 设置训练中输出的事件日志和检查点的目录
TRAIN_DIR=/tmp/flowers_train/

# 设置训练数据集所在目录,该数据集是TFRecord文件格式
FLOWERS_DATA_DIR=/tmp/flowers-data/

# 设定保存验证结果日志文件的目录
EVAL_DIR=/tmp/flowers_eval/

# 通过flowers_eval开始验证flowers_train训练的结果
bazel-bin/inception/flowers_eval 
--eval_dir="${EVAL_DIR}" 
--data_dir="${FLOWERS_DATA_DIR}" 
--subset=validation 
--num_examples=500 
--checkpoint_dir="${TRAIN_DIR}" 
--input_queue_memory_factor=1 
--run_once

В ходе обучения было установлено, что после прогона модели на 2000 шагов точность оценки достигла примерно 93,4%.

Successfully loaded model from /tmp/flowers/model.ckpt-1999 at step=1999.
2016-03-01 16:52:51.761219: starting evaluation on (validation).
2016-03-01 16:53:05.450419: [20 batches out of 20] (36.5 examples/sec; 0.684sec/batch)
2016-03-01 16:53:05.450471: precision @ 1 = 0.9340 recall @ 5 = 0.9960 [500 examples]

В-третьих, как построить новый набор данных для переобучения

Используйте существующие сценарии, прилагаемые этой моделью для создания нового набора данных для обучения или тонкой настройки. Главный скрипт - build_image_data.py. Короче говоря, этот скрипт принимает структурированный каталог изображений и преобразует его в Sharded Tfrecord, который может быть прочитан модели создания. В частности, вам необходимо создать каталог тренировочных изображений указанной структуры, эти изображения расположены в urch_dir и Validation_dir, аранжированные следующим образом:

$TRAIN_DIR/dog/image0.jpeg

$TRAIN_DIR/dog/image1.jpg

$TRAIN_DIR/dog/image2.png

...

$TRAIN_DIR/cat/weird-image.jpeg

$TRAIN_DIR/cat/my-image.jpeg

$TRAIN_DIR/cat/my-image.JPG

...

$VALIDATION_DIR/dog/imageA.jpeg

$VALIDATION_DIR/dog/imageB.jpg

$VALIDATION_DIR/dog/imageC.png

...

$VALIDATION_DIR/cat/weird-image.PNG

$VALIDATION_DIR/cat/that-image.jpg

$VALIDATION_DIR/cat/cat.JPG
...

Примечание. Сценарий добавит дополнительный фоновый класс с индексом 0, поэтому ваши метки классов варьируются от 0 до num_labels. Используя приведенный выше пример, соответствующие метки классов, сгенерированные из build_image_data.py, будут выглядеть так:

0
  
1 dog
 
2 cat

Каждый подкаталог в TRAIN_DIR и VALIDATION_DIR соответствует уникальной метке для изображения, находящегося в этом подкаталоге, изображение может быть в формате JPEG или PNG, другие типы изображений в настоящее время не поддерживаются. Данные расположены в этой структуре каталогов, и build_image_data.py может быть запущен для данных для создания сегментированного набора данных TFRecord. Полный список информации, содержащейся в tf.Example, описан в комментариях к файлу build_image_data.py. Чтобы запустить build_image_data.py, вы можете запустить следующую командную строку:

# 设置生成TFRecord文件的目录
OUTPUT_DIRECTORY=$HOME/my-custom-data/

# 构建脚本build_image_data
cd tensorflow-models/inception
bazel 
build //inception:build_image_data

# 运行脚本进行转化
bazel-bin/inception/build_image_data 
--train_directory="${TRAIN_DIR}" 
--validation_directory="${VALIDATION_DIR}" 
--output_directory="${OUTPUT_DIRECTORY}" 
--labels_file="${LABELS_FILE}" 
--train_shards=128 
--validation_shards=24 
--num_threads=8

OUTPUT_DIRECTORY — это расположение сегментированных записей TFRecord.
LABELS_FILE будет текстовым файлом, читаемым сценарием, который предоставляет список всех меток. Например, в случае с набором данных о цветах LABELS_FILE содержит следующие данные:
daisy

dandelion

roses

sunflowers

tulips
Обратите внимание, что каждая строка каждой метки соответствует записи в последнем классификаторе модели. То есть ромашка соответствует классификатору для записи 1, одуванчик — записи 2 и так далее. Мы пропускаем метку 0 как фоновый класс. После запуска этого скрипта будет создан файл, подобный следующему:

$TRAIN_DIR/train-00000-of-00128

$TRAIN_DIR/train-00001-of-00128

...

$TRAIN_DIR/train-00127-of-00128
and
$VALIDATION_DIR/validation-00000-of-00024

$VALIDATION_DIR/validation-00001-of-00024

...

$VALIDATION_DIR/validation-00023-of-00024

где 128 и 24 — количество сегментов, указанное для каждого набора данных, соответственно. Цель состоит в том, чтобы подобрать количество фрагментов таким образом, чтобы в каждом фрагменте было около 1024 изображений. После того, как этот набор данных создан, начальную модель можно обучить или настроить на этом наборе данных. Кроме того, если вы используете обучающий скрипт, измените num_classes() и num_examples_per_epoch() в flowers_data.py, чтобы они соответствовали вновь созданным данным.

4. Практические аспекты обучающих моделей

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

1) Найдите хорошие гиперпараметры

Около 5-10 гиперпараметров контролируют скорость обучения сети. В дополнение к --batch_size и --num_gpus в inception_train.py определено несколько констант, которые определяют задачу обучения.

RMSPROP_DECAY = 0.9 # RMSProp算法的衰减项.

MOMENTUM = 0.9 # RMSProp算法的Momentum值.

RMSPROP_EPSILON = 1.0 # RMSProp算法的Epsilon项.

INITIAL_LEARNING_RATE = 0.1 # 学习速录初始化时的值.

NUM_EPOCHS_PER_DECAY = 30.0 # 学习速率开始衰减的时期Epochs.

LEARNING_RATE_DECAY_FACTOR = 0.16 # 学习速率衰减因子.

Регулировка следующих параметров во время тренировки оказывает большее влияние на результаты.

  • INITIAL_LEARNING_RATE: более высокая скорость обучения может ускорить обучение. Но слишком высокие скорости могут вызвать нестабильность, заставляя параметры модели расходиться до бесконечности или NaN.
  • batch_size: Большие размеры пакетов могут улучшить оценку качества градиентов и могут обучать модели с более высокой скоростью обучения.
  • num_gpus: обычно память графического процессора является узким местом, препятствующим принятию больших пакетов, использование большего количества графических процессоров позволяет использовать большие пакеты.
2) Отрегулируйте требования к памяти

    Обучение этой модели имеет большие требования к памяти с точки зрения ЦП и ГП, а память ГП относительно мала по сравнению с памятью ЦП. Два элемента определяют использование памяти GPU — архитектура модели и размер пакета (batch_size). Предполагая, что вы сохраняете свою архитектуру модели неизменной, единственным параметром, который контролирует потребность в графическом процессоре для обучения, является размер пакета.

«Хорошее эмпирическое правило — попытаться использовать как можно больший размер пакета, чтобы он поместился на GPU».

    Если у вас закончилась память графического процессора, уменьшите --batch_size или используйте больше графических процессоров для рабочего процесса. Модель выполняет разбиение пакетов между графическими процессорами, поэтому N графических процессоров могут обрабатывать в N раз больше размера пакета, чем 1 графический процессор. Эта модель также требует много памяти процессора. Inception настроил эту модель так, чтобы она использовала около 20 ГБ памяти процессора. Таким образом, было бы идеально получить около 40 ГБ памяти процессора.
    Если это невозможно, вы можете уменьшить требования к памяти модели, уменьшив --input_queue_memory_factor. Асинхронная предварительная обработка изображений относительно основного обучения в потоках –num_preprocess_threads.
Утвержденные изображения хранятся в очереди, где каждый графический процессор выполняет операцию Deckeue для получения партий изображений. Чтобы гарантировать хорошую последовательность данных, мы поддерживаем большую очередь 1024 x input_queue_memory_facfactor изображения. Для архитектуры текущей модели это соответствует около 4 ГБ памяти ЦП. След памяти может быть уменьшен путем опускания Input_Queue_Memory_Factor. Но снижение этого значения существенно может привести к снижению менее точных прогнозов, когда модель тренируется с нуля.
Подробнее см. в iMage_Processing.py.

Благодаря вышеуказанному обучению и фактической боевой проверке ИТ-специалист может, наконец, определить, что именно выросло, с высокой вероятностью, используя обученную модель.

Цитаты и примечания

Цитировать:
1.Inception
2.Rethinking the Inception Architecture for Computer Vision
3.An analysis of deep neural network models for practical applications
4.ImageNetЭто общий академический набор данных, используемый в машинном обучении для обучения систем распознавания изображений.
5. Схема архитектуры модели Inception выглядит следующим образом:

6. Алгоритм RMSProp — метод градиентного спуска, полное название — Root Mean Square Prop. 7.tower: эта концепция четко не определена в тензорном потоке, Насколько я понимаю, башня является частью модели нейронной сети тензорного потока и представляет собой функцию, которую можно абстрагировать и вычислить независимо при расчете градиента градиента. Вычисления могут выполняться на одном графическом процессоре, а также независимые вычисления на нескольких графических процессорах.

Уведомление:
    Разработчики Google перенесли большую часть последующих улучшений исходной кодовой базы с открытым исходным кодом в Research наslimв кодовой базе. то есть вslimНайдите последнюю версию этой базы кода в , и вы можете обращаться к ней для непрерывного обучения.

P.S. Как новичок в машинном обучении, я не знаком со многими концепциями и алгоритмами в процессе обучения.Пожалуйста, покритикуйте и поправьте меня, если я ошибаюсь.

Сканируйте QR-код и подписывайтесь на официальный аккаунт. Получите новейшие технологии мобильной разработки.