Да, как гласит название, среди специалистов по обработке данных (даже вас!) Были очень обычные разговоры, когда некоторые говорят, что TensorFlow лучше, а некоторые говорят, что Keras хорош! Давайте посмотрим, как это работает на практике в случае классификации изображений.

Перед этим давайте познакомимся с этими двумя терминами Keras и Tensorflow и поможем вам создать мощный классификатор изображений за 10 минут!

Tensorflow:

Tensorflow - это наиболее используемая библиотека для разработки моделей в глубоком обучении. Это была лучшая библиотека, которую полностью выбрали многие компьютерные фанаты в своих ежедневных экспериментах. Можете ли вы представить, если я скажу, что Google разместил блоки тензорной обработки (TPU) только для работы с тензорами? Да у них есть. Они поместили отдельный класс экземпляров под названием TPU, который обладает наибольшей вычислительной мощностью для обработки моделей глубокого обучения тензорного потока.

Пора СОЗДАТЬ ЕГО!

Теперь я помогу вам создать мощный классификатор изображений с помощью tensorflow. Ждать! что такое классификатор? Это простой вопрос, который вы задаете своему коду тензорного потока, спрашивая, является ли данное изображение розой или тюльпаном. Итак, обо всем по порядку. Давайте установим tenorflow на машине. Официальная документация содержит две версии: CPU и GPU. Для версии процессора:

pip install tensorflow

И обратите внимание, я пишу этот блог после экспериментов с графическим процессором, а не с процессором. Установка GPU аккуратно вынесена здесь.

А теперь давайте возьмем Tensorflow от Google для эксперимента поэтов по обучению модели. В этом репозитории Google есть потрясающие скрипты для простых экспериментов с изображениями. Это очень кратко и достаточно для нашей цели. Помните слово мощный, которое я использовал раньше? Да, это слово вступает в действие, когда мы используем так называемое трансферное обучение. Трансферное обучение - это эффективный способ использования предварительно обученных моделей, которые обучались в течение нескольких дней или недель, а затем изменить последний слой, чтобы приспособиться к нашему собственному набору классов.

Inception V3 - очень хорошая модель, занявшая 2-е место в 2015 ImageNet Challenge по классификации изображений. Он был упомянут как лучшая сеть для передачи обучения для наборов данных с меньшим количеством изображений на класс.

Теперь клонируйте репозиторий git:

git clone https://github.com/googlecodelabs/tensorflow-for-poets-2
cd tensorflow-for-poets-2

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

 — Dataset folder -
       class1/
           — image1
           — image2
       class2/
           — image1
           — image2

Он должен выглядеть примерно так (не обращайте внимания на image.py). У меня есть указанная выше папка flower_photos от:

curl http://download.tensorflow.org/example_images/flower_photos.tgz | tar xz -C tf_files

Создание набора данных

Вы можете использовать любые изображения, какие захотите. Чем больше, тем лучше (стремитесь к нескольким тысячам). Разделите их по категориям, как описано выше, и убедитесь, что они находятся в папке с именем tf_files..

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

Или, если у вас есть свой уникальный вариант использования, вы можете создать для него свой собственный набор данных. Вы можете загружать изображения из Интернета и быстро создавать большой набор данных, используя инструмент аннотации, такой как Dataturks, куда вы загружаете изображения и помечаете изображения вручную в ziffy. Более того, вывод Dataturks можно легко использовать для создания tf_files.

Я нашел отличный плагин, который позволяет загружать пакетные изображения в Google Chrome - это + Dataturks сделает создание обучающих данных легкой прогулкой. Связано здесь.

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

-------> for tensorflow
python3 tensorflow_json_parser.py — json_file “flower.json” — dataset_path “Dataset5/”
-------> for keras
python3 keras_json_parser.py --json_file "flower.json" --dataset_path "Dataset5/" --train_percentage 80 --validation_percentage 20

Обучение

Пришло время обучить модель. В папке tensorflow-for-poets-2 есть папка scripts, в которой есть все необходимое для переобучения модели. retrain.py имеет особый способ обрезки и масштабирования изображений, что слишком круто.

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

python3 -m scripts.retrain \ 
 --bottleneck_dir=tf_files/bottlenecks \ 
 --model_dir=tf_files/models/inception \
 --output_graph=tf_files/retrained_graph.pb \
 --output_labels=tf_files/retrained_labels.txt \
 --image_dir=tf_files/flower_photos

Это загружает начальную модель и соответствующим образом обучает последний слой, используя папку обучения и указанные аргументы. Я обучил его 4000 шагов на экземпляре GCP с 12 ГБ Nvidia Tesla k80 и 7 ГБ Vram.

Обучение было проведено с 80–20, разделение тест-поездов, и, как мы видим выше, оно дало test_accuracy 91%. Пришло время проверить! У нас есть файл .pb в tf_files /, который можно использовать для тестирования. Следующие изменения были добавлены в label_image.py

from PIL import Image,ImageDraw,ImageFont
results = results.tolist()
image = Image.open(file_name)
fonttype = ImageFont.truetype(“/usr/share/fonts/truetype/dejav/DejaVuSans.ttf”,18)
 
draw = ImageDraw.Draw(image)
draw.text(xy=(5,5),text=str(labels[results.index(max(results))])+”:”+str(max(results)),fill = (255,255,255,128),font = fonttype)
image.show()
image.save(file_name.split(“.”)[0]+”1"+”.jpg”)

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

Показаны некоторые результаты тестирования:

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

КЕРАС:

Keras - это API высокого уровня, построенный на TensorFlow (и его также можно использовать поверх Theano). Он более удобен и прост в использовании по сравнению с Tensorflow. Если бы мы были новичками во всем этом глубоком обучении и хотели бы написать новую модель с нуля, то я бы посоветовал Keras из-за его простоты как для чтения, так и для записи. Его можно установить с помощью:

pip install keras

и даже эта штука оборачивается тензорным потоком, так что снова здесь будут применяться вариации совместимости CPU v / s с GPU.

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

from keras.applications.inception_v3 import preprocess_input

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

 — Dataset folder -
  — train/ 
       class1/
          — image1
          — image2
       class2/
          — image1
          — image2
  — test/ 
      class1/
          — image1
          — image2
      class2/
          — image1
          — image2

Это должно выглядеть примерно так:

а затем этот поезд и тест должны иметь папки, как показано ниже:

Поскольку мы закончили с настройкой набора данных, пришло время для обучения! Я написал небольшой фрагмент кода для обучения, описанного ниже:

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

python3 inception_train.py 
 — train_dir flower_photos/train \
 — val_dir flower_photos/validation \ 
 — nb_epoch 50 \ 
 — batch_size 10 \ 
 — output_model_file inception_yo1.model

и обучение на моем графическом процессоре занимало около 1 минуты на эпоху с 292 шагами на эпоху и было обучено для 50 эпох (что намного больше!) с размером пакета 10 и разделением данных 80–20.

Ой! мы закончили с обучением и достигли test_accuracy ~ 91% и потери 0,38. Модель была сохранена как файл inception.model, который можно снова загрузить и протестировать. Для этого был написан еще один скрипт, который наносит предсказанный класс на изображение и сохраняет его. Сценарий тестирования выглядит следующим образом:

Этот сценарий можно протестировать как:

python3 -m scripts.label_image — graph=tf_files/retrained_graph.pb — image=rose.jpeg

Прогнозируемые проценты достоверности по всем классам выводятся следующим образом:

и ниже приведены несколько выходных данных с графиком:

Наконец-то! вы узнали, как создать мощный классификатор, используя как Keras, так и тензорный поток. Но какой из них лучше - все еще вопрос в наших головах! Итак, давайте проведем сравнительное исследование только на основе этой классификационной задачи на данный момент.

Весь основной и тестовый код keras, а также измененные скрипты tensorflow доступны в моем гитхабе здесь.

Прототипирование:

Если вы действительно хотите быстро написать код и построить модель, тогда Keras вам подойдет. Мы можем построить сложные модели за считанные минуты! API Model и Sequential настолько мощны, что даже не дадут вам понять, что вы создаете мощные модели, благодаря простоте их использования.

Готово, модель готова! Даже трансферное обучение проще закодировать в Keras, чем в тензорном потоке. Tensorflow слишком сложен, чтобы кодировать с нуля, пока вы не станете крутым программистом.

Скретч-кодирование и гибкость:

Поскольку тензорный поток - это библиотека низкого уровня по сравнению с Керасом, многие новые функции могут быть реализованы лучше в тензорном потоке, чем в Керасе, например, любая функция активации и т. Д. А также тонкая настройка и настройка модели очень гибки. в тензорном потоке, чем в Керасе, поскольку доступно гораздо больше параметров.

Время обучения и вычислительная мощность:

Вышеупомянутые модели были обучены на одном наборе данных, мы видим, что Keras требует больше времени для обучения, чем тензорный поток. Tensorflow завершил обучение 4000 шагов за 15 минут, тогда как Керасу потребовалось около 2 часов на 50 эпох. Возможно, мы не можем сравнивать шаги с эпохами, но, как вы видите, в этом случае оба дали точность теста 91%, что сопоставимо, и мы можем изобразить, что keras тренируется немного медленнее, чем tenorflow. Помимо этого, это имеет смысл, потому что tensorflow является библиотекой низкого уровня.

Предусмотрены дополнительные функции:

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

Tensorflow даже поддерживает потоки и очереди для асинхронного обучения тяжелых тензоров! Это обеспечивает TPU более высокую и намного более высокую скорость обработки. Пример кода для потоков показан ниже:

Мониторинг и контроль:

Судя по моему опыту ди-обучения, я считаю, что тензорный поток очень подходит для многих случаев, хотя это немного сложно. Например, мы можем очень легко контролировать все и вся, например, управлять весами и градиентами вашей сети. Мы можем выбрать, какой шаг нужно тренировать, а какой нет. В Керасе это невозможно. Строка, приведенная ниже, творит чудеса!

step = tf.Variable(1, trainable=False, dtype=tf.int32)

Заключение:

В любом случае, Keras скоро будет интегрирован в тензорный поток! Так почему же питонический? (Керас питонический). Я предлагаю потратить немного времени и привыкнуть к тензорному потоку. Проблема классификации выше, если вы следили за блогом и выполнили соответствующие шаги, тогда вы почувствуете, что Keras немного болезненен и убивает терпение, чем tensorflow во многих аспектах. Итак, попробуйте использовать другие классы и попробуйте обучить классификаторы для таких приложений, как обнаружение фальшивых заметок и т. Д.

Надеюсь, этот блог поможет вам лучше понять, что и когда использовать!

Я хотел бы услышать любые предложения или вопросы. Напишите мне на [email protected]