Распознавание объектов – Распознавание эмоций – классическая задача Компьютерного зрения (CV), процесс узнавания различных предметов на изображении.
Давайте посмотрим, как задача решается с помощью Tensorflow. Для начала импортируем необходимые библиотеки:
import tensorflow as tf
import matplotlib.pyplot as plt
Мы будем обучать нейронную сеть распознавать предметы одежды из Датасета (Dataset) под названием Fashion MNIST. Он содержит 70 000 предметов одежды в 10 различных категориях. Каждый предмет одежды представлен в виде изображения в оттенках серого 28x28. Вот примеры здесь:
Данные Fashion MNIST доступны непосредственно в API tf.keras. Загрузим их:
mnist = tf.keras.datasets.fashion_mnist
Разделим набор на Тренировочные (Train Data) и Тестовые данные (Test Data):
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
Как выглядят эти данные в понятном компьютеру табличном виде? Давайте выведем тренировочное изображение в виде таблицы пикселей с той или иной степенью белого по шкале от 0 до 255:
plt.imshow(training_images[0])
print(training_labels[0])
print(training_images[0])
Если мы обучаем нейронную сеть, по разным причинам будет проще, если мы будем рассматривать все значения как от 0 до 1, процесс, называемый «нормализация». К счастью, в Python такой список легко нормализовать без циклов. Мы делаем это так:
training_images = training_images / 255.0
test_images = test_images / 255.0
Почему существует два набора – тренировочный и тестовый? Идея состоит в том, чтобы иметь один набор данных для обучения, а затем еще один набор данных, который модель еще не видела, чтобы определить, насколько хорошо он будет классифицировать значения. В конце концов, модель и предназначена для распознавания объектов с данными из реального мира.
Давайте теперь спроектируем модель. Здесь довольно много новых концепций, но не волнуйтесь, вы их освоите:
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
- Sequential: определяет ПОСЛЕДОВАТЕЛЬНОСТЬ слоев в нейронной сети.
- Flatten: Помните ранее, когда наши изображения были квадратными, когда вы их распечатывали? Flatten просто берет этот квадрат и превращает его в одномерный набор.
- Dense: добавляет слой нейронов. Каждому слою нейронов нужна функция активации, которая сообщает, что делать. Есть много вариантов, но пока используйте только эти.
- Функция активации выпрямителя (ReLu) фактически означает «Если X> 0 вернуть X, иначе вернуть 0» — так что он делает это, он только передает значения 0 или выше на следующий уровень в сети.
- Софтмакс (Softmax) принимает набор значений и эффективно выбирает самое большое, поэтому, например, если выходные данные последнего слоя выглядят как [0,1, 0,1, 0,05, 0,1, 9,5, 0,1, 0,05, 0,05, 0,05], он сохраняет вы просматриваете его в поисках наибольшего значения и превращаете его в [0,0,0,0,1,0,0,0,0]. Это позволяет сделать код короче.
Следующее, что нужно сделать — это построить модель. Мы делаем это, компилируя его с оптимизатором и Функцией потерь (Loss Function), как и раньше, а затем обучаете его, вызывая model.fit() и прося его сопоставить ваши данные обучения с вашими метками обучения, т.е. заставить его выяснить взаимосвязь между обучающие данные и их фактические метки, поэтому в будущем, если у вас будут данные, похожие на обучающие данные, он может сделать прогноз того, как эти данные будут выглядеть.
model.compile(optimizer = tf.keras.optimizers.Adam(),
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
Обучение разделено на эпохи:
Epoch 1/5
1875/1875 [==============================] - 13s 6ms/step - loss: 0.5011 - accuracy: 0.8236
Epoch 2/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.3728 - accuracy: 0.8648
Epoch 3/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.3384 - accuracy: 0.8762
Epoch 4/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.3138 - accuracy: 0.8854
Epoch 5/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.2932 - accuracy: 0.8917
<keras.callbacks.History at 0x7fb53ae2f6d0>
По завершении обучения мы увидим значение точности в конце последней эпохи. В данном случае это 0,8917. Это говорит о том, что точность вашей нейронной сети в классификации обучающих данных составляет около 89%. То есть она смогла правильно узнать предмет одежды в 89% случаев.
Но как это будет работать с неизвестными модели данными? Вот почему у нас есть тестовые изображения. Мы можем вызвать model.evaluate(), чтобы узнать о потерях. Давайте попробуем:
model.evaluate(test_images, test_labels)
313/313 [==============================] - 1s 2ms/step - loss: 0.3577 - accuracy: 0.8744
[0.35774385929107666, 0.8744000196456909]
Точность равна примерно 87%. Как и ожидалось, модель, вероятно, не будет так хорошо работать с неизвестными доселе данными. Однако в целом результат можно считать удовлетворительным.
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.
Автор оригинальной статьи: Arun Ponnusamy