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



Эта статья TensorFlow Image Classification предоставит вам подробные и исчерпывающие знания о классификации изображений.

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

Что такое TensorFlow?

TensorFlow - это платформа машинного обучения Google с открытым исходным кодом для программирования потоков данных для различных задач. Узлы в графе представляют математические операции, а ребра графа представляют многомерные массивы данных, передаваемые между ними.





TensorFlow-Image-Recognition
Тензоры - это просто многомерные массивы, расширение двумерных таблиц для данных с более высокой размерностью. Tensorflow обладает множеством функций, которые делают его подходящим для глубокого обучения, а его основная библиотека с открытым исходным кодом помогает вам разрабатывать и обучать модели машинного обучения.

Что такое классификация изображений?

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



Теперь, в зависимости от взаимодействия между аналитиком и компьютером во время классификации, существует два типа классификации:



как установить hadoop на Linux
  • Под присмотром и
  • Без присмотра

Итак, не теряя времени, давайте перейдем к классификации изображений TensorFlow. У меня 2 примера: легкий и сложный. Перейдем к самому простому.

Классификация изображений TensorFlow: Fashion MNIST

Набор данных Fashion MNIST

Здесь мы собираемся использовать набор данных Fashion MNIST, который содержит 70 000 изображений в оттенках серого в 10 категориях. Мы будем использовать 60000 для обучения, а остальные 10 000 - для тестирования. Вы можете получить доступ к Fashion MNIST прямо из TensorFlow, просто импортируйте и загрузите данные.

  • Давайте сначала импортируем библиотеки
from __future__ import absolute_import, Division, print_function # TensorFlow и tf.keras импортируют тензорный поток как tf из tensorflow import keras # Вспомогательные библиотеки импортируют numpy как np import matplotlib.pyplot as plt
  • Загрузим данные
fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data ()
  • Далее мы собираемся сопоставить изображения с классами
class_names = ['футболка / топ', 'брюки', 'пуловер', 'платье', 'пальто', 'сандалии', 'рубашка', 'кроссовки', 'сумка', 'ботильоны']
  • Изучение данных
train_images.форма 
# Каждый ярлык находится в диапазоне от 0 до 9
train_labels 
test_images.форма
  • Пришло время предварительно обработать данные.
plt.фигура() plt.imshow(train_images[0]) plt.цветная полоса() plt.сетка(Ложь) plt.шоу() 
#Если вы проверите первое изображение в обучающем наборе, вы увидите, что значения пикселей попадают в диапазон от 0 до 255.

  • Мы должны масштабировать изображения от 0 до 1, чтобы передать их в нейронную сеть.
train_images знак равно train_images / 255,0 test_images знак равно test_images / 255,0
  • Давайте покажем несколько изображений.
plt.фигура(фиговыйзнак равно(10,10)) для я в ассортимент(25): plt.подсюжет(5,5,я+один) plt.xticks([]) plt.yticks([]) plt.сетка(Ложь) plt.imshow(train_images[я], cmapзнак равноplt.см.двоичный) plt.xlabel(class_names[train_labels[я]]) plt.шоу()
 

  • Настройте слои
модель знак равно жесткий.Последовательный([ жесткий.слои.Сплющивать(input_shapeзнак равно(28, 28)), жесткий.слои.Плотный(128, активациязнак равноtf.нет.relu), жесткий.слои.Плотный(10, активациязнак равноtf.нет.softmax) ])
  • Скомпилируйте модель
модель.компилировать(оптимизаторзнак равно'Адам', потерязнак равно'sparse_categorical_crossentropy', метрикизнак равно['точность'])
  • Модельное обучение
модель.поместиться(train_images, train_labels, эпохизнак равно10)

  • Оценка точности
test_loss, test_acc знак равно модель.оценивать(test_images, test_labels) Распечатать('Точность теста:', test_acc)

  • Делать прогнозы
предсказания знак равно модель.предсказывать(test_images)
предсказания[0]

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

например.argmax(предсказания[0])# Модель уверена, что это ботинок по щиколотку. Посмотрим, правильно ли это

Выход: 9

test_labels[0]

Выход: 9

как компилировать Java-программы
  • Теперь пора взглянуть на полный набор из 10 каналов.
def plot_image(я, predictions_array, true_label, img): predictions_array, true_label, img знак равно predictions_array[я], true_label[я], img[я] plt.сетка(Ложь) plt.xticks([]) plt.yticks([]) plt.imshow(img, cmapзнак равноplt.см.двоичный) предсказанная_метка знак равно например.argmax(predictions_array) если предсказанная_метка == true_label: цвет знак равно 'зеленый' еще: цвет знак равно 'сеть' plt.xlabel('{} {: 2.0f}% ({}) '.формат(class_names[предсказанная_метка], 100*например.Максимум(predictions_array), class_names[true_label]), цветзнак равноцвет) def plot_value_array(я, predictions_array, true_label): predictions_array, true_label знак равно predictions_array[я], true_label[я] plt.сетка(Ложь) plt.xticks([]) plt.yticks([]) этот сюжет знак равно plt.бар(ассортимент(10), predictions_array, цветзнак равно'# 777777') plt.Илим([0, один]) предсказанная_метка знак равно например.argmax(predictions_array) этот сюжет[предсказанная_метка].set_color('сеть') этот сюжет[true_label].set_color('зеленый')
  • Давайте сначала посмотрим на 0-е и 10-е изображения
я знак равно 0 plt.фигура(фиговыйзнак равно(6,3)) plt.подсюжет(один,2,один) plot_image(я, предсказания, test_labels, test_images) plt.подсюжет(один,2,2) plot_value_array(я, предсказания, test_labels) plt.шоу()

я знак равно 10 plt.фигура(фиговыйзнак равно(6,3)) plt.подсюжет(один,2,один) plot_image(я, предсказания, test_labels, test_images) plt.подсюжет(один,2,2) plot_value_array(я, предсказания, test_labels) plt.шоу()

  • Теперь давайте построим несколько изображений и их прогнозов. Правильные - зеленые, неправильные - красные.
num_rows знак равно 5 num_cols знак равно 3 num_images знак равно num_rows*num_cols plt.фигура(фиговыйзнак равно(2*2*num_cols, 2*num_rows)) для я в ассортимент(num_images): plt.подсюжет(num_rows, 2*num_cols, 2*я+один) plot_image(я, предсказания, test_labels, test_images) plt.подсюжет(num_rows, 2*num_cols, 2*я+2) plot_value_array(я, предсказания, test_labels) plt.шоу()

  • Наконец, мы будем использовать обученную модель, чтобы сделать прогноз для одного изображения.
# Возьмите изображение из тестового набора данных img знак равно test_images[0] Распечатать(img.форма)
# Добавить изображение в пакет, в котором он единственный член. img знак равно (например.expand_dims(img,0)) Распечатать(img.форма)
predictions_single знак равно модель.предсказывать(img) Распечатать(predictions_single)

plot_value_array(0, predictions_single, test_labels) plt.xticks(ассортимент(10), class_names, вращениезнак равноЧетыре пять) plt.шоу()

  • Как видите, прогноз для нашего единственного изображения в партии.
prediction_result знак равно например.argmax(predictions_single[0])

Выход: 9

CIFAR-10: CNN

Набор данных CIFAR-10 состоит из самолетов, собак, кошек и других объектов. Вы предварительно обработаете изображения, а затем обучите сверточную нейронную сеть на всех образцах. Изображения должны быть нормализованы, а метки - горячим кодированием. Этот вариант использования наверняка рассеет ваши сомнения относительно классификации изображений TensorFlow.

  • Скачивание данных
от urllib.request импорт urlretrieve от os.path импорт isfile, сажа от tqdm импорт tqdm импорт tarfile cifar10_dataset_folder_path знак равно 'cifar-10-batches-py' класс DownloadProgress(tqdm): last_block знак равно 0 def крюк(я, block_numзнак равноодин, размер блоказнак равноодин, общий размерзнак равноНикто): я.Всего знак равно общий размер я.Обновить((block_num - я.last_block) * размер блока) я.last_block знак равно block_num '' ' проверьте, загружен ли уже файл данных (zip) если нет, загрузите его с https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz и сохраните как cifar-10-python.tar.gz '' ' если не isfile('cifar-10-python.tar.gz'): с участием DownloadProgress(единица измерениязнак равно'B', unit_scaleзнак равноПравда, майнерызнак равноодин, descзнак равно'Набор данных CIFAR-10') так как pbar: urlretrieve( 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz', 'cifar-10-python.tar.gz', pbar.крюк) если не сажа(cifar10_dataset_folder_path): с участием tarfile.открыто('cifar-10-python.tar.gz') так как деготь: деготь.извлечь все() деготь.близко()
  • Импорт необходимых библиотек
импорт соленый огурец импорт тупой так как например импорт matplotlib.pyplot так как plt
  • Понимание данных

Исходный пакет данных представляет собой тензор 10000 × 3072, выраженный в массиве numpy, где 10000 - количество выборочных данных. Изображение цветное, размером 32 × 32. Подача может осуществляться в формате (ширина x высота x число_каналов) или (число_канал x ширина x высота). Давайте определим ярлыки.

def load_label_names(): вернуть ['самолет', 'автомобиль', 'птица', 'Кот', 'олень', 'собака', 'лягушка', 'лошадь', 'корабль', 'грузовая машина']
  • Изменение формы данных

Мы собираемся изменить форму данных в два этапа

Сначала разделите вектор-строку (3072) на 3 части. Каждая штука соответствует каждому каналу. В результате получается размерность тензора (3 x 1024). Затем разделите полученный тензор из предыдущего шага на 32. 32 здесь означает ширину изображения. В результате получается (3x32x32).

Во-вторых, нам нужно перенести данные из (num_channel, width, height) в (width, height, num_channel). Для этого воспользуемся функцией транспонирования.

def load_cfar10_batch(cifar10_dataset_folder_path, batch_id): с участием открыто(cifar10_dataset_folder_path + '/ data_batch_' + п(batch_id), Режимзнак равно'rb') так как файл: # обратите внимание, что тип кодировки - latin1 партия знак равно соленый огурец.грузить(файл, кодированиезнак равноlatin1) Особенности знак равно партия['данные'].изменить форму((len(партия['данные']), 3, 32, 32)).транспонировать(0, 2, 3, один) этикетки знак равно партия[ярлыки] вернуть Особенности, метка
  • Изучение данных
def display_stats(cifar10_dataset_folder_path, batch_id, sample_id): Особенности, этикетки знак равно load_cfar10_batch(cifar10_dataset_folder_path, batch_id) если не (0 <= sample_id < len(Особенности)): Распечатать('{}образцы в партии{}.{}вне досягаемости. '.формат(len(Особенности), batch_id, sample_id)) вернуть Никто Распечатать(' Статистика партии №{}: '.формат(batch_id)) Распечатать('Кол-во образцов:{} '.формат(len(Особенности))) label_names знак равно load_label_names() label_counts знак равно диктовать(застегивать(*например.уникальный(этикетки, return_countsзнак равноПравда))) для ключ, ценность в label_counts.Предметы(): Распечатать('Количество этикеток [{}] ({}):{}'.формат(ключ, label_names[ключ].верхний(), ценность)) sample_image знак равно Особенности[sample_id] sample_label знак равно этикетки[sample_id] Распечатать(' Пример изображения{}: '.формат(sample_id)) Распечатать(Изображение - Мин. Значение:{}Максимальное значение:{}'.формат(sample_image.мин(), sample_image.Максимум())) Распечатать(Изображение - Форма:{}'.формат(sample_image.форма)) Распечатать(Ярлык - Идентификатор ярлыка:{}Имя:{}'.формат(sample_label, label_names[sample_label])) plt.imshow(sample_image)
%matplotlib в соответствии %config InlineBackend.figure_format знак равно 'сетчатка' импорт тупой так как например # Изучить набор данных batch_id знак равно 3 sample_id знак равно 7000 display_stats(cifar10_dataset_folder_path, batch_id, sample_id)

как открыть aws cli
  • Реализация функций предварительной обработки

Мы собираемся нормализовать данные с помощью Min-Max Normalization. Это просто заставляет все значения x находиться в диапазоне от 0 до 1.
у = (х-мин) / (макс-мин)

def нормализовать(Икс): '' ' аргумент - x: входные данные изображения в массиве numpy [32, 32, 3] вернуть - нормализованный x '' ' min_val знак равно например.мин(Икс) max_val знак равно например.Максимум(Икс) Икс знак равно (Икс-min_val) / (max_val-min_val) вернуть Икс
  • Одно горячее кодирование
def one_hot_encode(Икс): '' ' аргумент - x: список меток вернуть - одна матрица горячего кодирования (количество меток, номер класса) '' ' закодированный знак равно например.нули((len(Икс), 10)) для idx, часы в перечислять(Икс): закодированный[idx] [часы] знак равно один вернуть закодированный
  • Предварительная обработка и сохранение данных
def _preprocess_and_save(нормализовать, one_hot_encode, Особенности, этикетки, имя файла): Особенности знак равно нормализовать(Особенности) этикетки знак равно one_hot_encode(этикетки) соленый огурец.свалка((Особенности, этикетки), открыто(имя файла, 'wb')) def preprocess_and_save_data(cifar10_dataset_folder_path, нормализовать, one_hot_encode): n_batches знак равно 5 valid_features знак равно [] valid_labels знак равно [] для batch_i в ассортимент(один, n_batches + один): Особенности, этикетки знак равно load_cfar10_batch(cifar10_dataset_folder_path, batch_i) # найти индекс, который будет точкой данных проверки во всем наборе данных пакета (10%) index_of_validation знак равно int(len(Особенности) * 0,1) # предварительно обработать 90% всего набора данных пакета # - нормализовать особенности # - one_hot_encode метки # - сохранить в новом файле с именем 'preprocess_batch_' + batch_number # - каждый файл для каждой партии _preprocess_and_save(нормализовать, one_hot_encode, Особенности[:-index_of_validation], этикетки[:-index_of_validation], 'preprocess_batch_' + п(batch_i) + '.п') # в отличие от набора данных для обучения, набор данных проверки будет добавлен во все пакетные наборы данных # - взять 10% от всего набора данных партии # - добавить их в список # - valid_features # - valid_labels valid_features.расширять(Особенности[-index_of_validation:]) valid_labels.расширять(этикетки[-index_of_validation:]) # обрабатываем весь набор данных проверки с накоплением _preprocess_and_save(нормализовать, one_hot_encode, например.массив(valid_features), например.массив(valid_labels), 'preprocess_validation.p') # загружаем тестовый набор данных с участием открыто(cifar10_dataset_folder_path + '/ test_batch', Режимзнак равно'rb') так как файл: партия знак равно соленый огурец.грузить(файл, кодированиезнак равноlatin1) # предварительно обрабатываем данные тестирования test_features знак равно партия['данные'].изменить форму((len(партия['данные']), 3, 32, 32)).транспонировать(0, 2, 3, один) test_labels знак равно партия[ярлыки] # Предварительная обработка и сохранение всех данных тестирования _preprocess_and_save(нормализовать, one_hot_encode, например.массив(test_features), например.массив(test_labels), 'preprocess_training.p')
preprocess_and_save_data(cifar10_dataset_folder_path, нормализовать, one_hot_encode)
  • Пропускной пункт
импорт соленый огурец valid_features, valid_labels знак равно соленый огурец.грузить(открыто('preprocess_validation.p', Режимзнак равно'rb'))
  • Создание сети

Вся модель состоит из 14 слоев.

импорт тензорный поток так как tf def conv_net(Икс, keep_prob): conv1_filter знак равно tf.Переменная(tf.truncated_normal(формазнак равно[3, 3, 3, 64], значитьзнак равно0, stddevзнак равно0,08)) conv2_filter знак равно tf.Переменная(tf.truncated_normal(формазнак равно[3, 3, 64, 128], значитьзнак равно0, stddevзнак равно0,08)) conv3_filter знак равно tf.Переменная(tf.truncated_normal(формазнак равно[5, 5, 128, 256], значитьзнак равно0, stddevзнак равно0,08)) conv4_filter знак равно tf.Переменная(tf.truncated_normal(формазнак равно[5, 5, 256, 512], значитьзнак равно0, stddevзнак равно0,08)) # 1, 2 conv1 знак равно tf.нет.conv2d(Икс, conv1_filter, шагизнак равно[один,один,один,один], набивказнак равно'ТАКОЙ ЖЕ') conv1 знак равно tf.нет.relu(conv1) conv1_pool знак равно tf.нет.max_pool(conv1, ksizeзнак равно[один,2,2,один], шагизнак равно[один,2,2,один], набивказнак равно'ТАКОЙ ЖЕ') conv1_bn знак равно tf.слои.batch_normalization(conv1_pool) № 3. 4 conv2 знак равно tf.нет.conv2d(conv1_bn, conv2_filter, шагизнак равно[один,один,один,один], набивказнак равно'ТАКОЙ ЖЕ') conv2 знак равно tf.нет.relu(conv2) conv2_pool знак равно tf.нет.max_pool(conv2, ksizeзнак равно[один,2,2,один], шагизнак равно[один,2,2,один], набивказнак равно'ТАКОЙ ЖЕ') conv2_bn знак равно tf.слои.batch_normalization(conv2_pool) # 5, 6 conv3 знак равно tf.нет.conv2d(conv2_bn, conv3_filter, шагизнак равно[один,один,один,один], набивказнак равно'ТАКОЙ ЖЕ') conv3 знак равно tf.нет.relu(conv3) conv3_pool знак равно tf.нет.max_pool(conv3, ksizeзнак равно[один,2,2,один], шагизнак равно[один,2,2,один], набивказнак равно'ТАКОЙ ЖЕ') conv3_bn знак равно tf.слои.batch_normalization(conv3_pool) # 7, 8 conv4 знак равно tf.нет.conv2d(conv3_bn, conv4_filter, шагизнак равно[один,один,один,один], набивказнак равно'ТАКОЙ ЖЕ') conv4 знак равно tf.нет.relu(conv4) conv4_pool знак равно tf.нет.max_pool(conv4, ksizeзнак равно[один,2,2,один], шагизнак равно[один,2,2,один], набивказнак равно'ТАКОЙ ЖЕ') conv4_bn знак равно tf.слои.batch_normalization(conv4_pool) №9 плоский знак равно tf.вклад.слои.сплющивать(conv4_bn) # 10 полный1 знак равно tf.вклад.слои.полностью подключено(входызнак равноплоский, num_outputsзнак равно128, Activation_fnзнак равноtf.нет.relu) полный1 знак равно tf.нет.выбывать(полный1, keep_prob) полный1 знак равно tf.слои.batch_normalization(полный1) # 11 полный2 знак равно tf.вклад.слои.полностью подключено(входызнак равнополный1, num_outputsзнак равно256, Activation_fnзнак равноtf.нет.relu) полный2 знак равно tf.нет.выбывать(полный2, keep_prob) полный2 знак равно tf.слои.batch_normalization(полный2) # 12 полный3 знак равно tf.вклад.слои.полностью подключено(входызнак равнополный2, num_outputsзнак равно512, Activation_fnзнак равноtf.нет.relu) полный3 знак равно tf.нет.выбывать(полный3, keep_prob) полный3 знак равно tf.слои.batch_normalization(полный3) # 13 полный4 знак равно tf.вклад.слои.полностью подключено(входызнак равнополный3, num_outputsзнак равно1024, Activation_fnзнак равноtf.нет.relu) полный4 знак равно tf.нет.выбывать(полный4, keep_prob) полный4 знак равно tf.слои.batch_normalization(полный4) # 14 вне знак равно tf.вклад.слои.полностью подключено(входызнак равнополный3, num_outputsзнак равно10, Activation_fnзнак равноНикто) вернуть вне
  • Гиперпараметры
эпохи знак равно 10 размер партии знак равно 128 keep_probability знак равно 0,7 Learning_rate знак равно 0,001
логиты знак равно conv_net(Икс, keep_prob) модель знак равно tf.идентичность(логиты, имязнак равнологиты) # Назовите logits Tensor, чтобы его можно было загрузить с диска после обучения # Потери и оптимизатор Стоимость знак равно tf.reduce_mean(tf.нет.softmax_cross_entropy_with_logits(логитызнак равнологиты, этикеткизнак равноY)) оптимизатор знак равно tf.поезд.AdamOptimizer(Learning_rateзнак равноLearning_rate).свести к минимуму(Стоимость) # Точность правильно_pred знак равно tf.равный(tf.argmax(логиты, один), tf.argmax(Y, один)) точность знак равно tf.reduce_mean(tf.бросать(правильно_pred, tf.float32), имязнак равно'точность')
  • Обучите нейронную сеть
# Единая оптимизация 
def
train_neural_network(сессия, оптимизатор, keep_probability, feature_batch, label_batch): сессия.бегать(оптимизатор, feed_dictзнак равно{ Икс: feature_batch, Y: label_batch, keep_prob: keep_probability })
#Showing Stats def print_stats(сессия, feature_batch, label_batch, Стоимость, точность): потеря знак равно сессия.бегать(Стоимость, feed_dictзнак равно{ Икс: feature_batch, Y: label_batch, keep_prob: один. }) valid_acc знак равно сессия.бегать(точность, feed_dictзнак равно{ Икс: valid_features, Y: valid_labels, keep_prob: один. }) Распечатать('Убыток:{:> 10.4f}Точность проверки:{: .6f}'.формат(потеря, valid_acc))
  • Полное обучение и сохранение модели
def batch_features_labels(Особенности, этикетки, размер партии): '' ' Разделять элементы и метки на партии '' ' для Начните в ассортимент(0, len(Особенности), размер партии): конец знак равно мин(Начните + размер партии, len(Особенности)) Уступать Особенности[Начните:конец], этикетки[Начните:конец] def load_preprocess_training_batch(batch_id, размер партии): '' ' Загрузите предварительно обработанные данные обучения и возвращайте их партиями или меньше '' ' имя файла знак равно 'preprocess_batch_' + п(batch_id) + '.п' Особенности, этикетки знак равно соленый огурец.грузить(открыто(имя файла, Режимзнак равно'rb')) # Возвращать обучающие данные партиями размером или меньше вернуть batch_features_labels(Особенности, этикетки, размер партии)
# Сохранение модели и пути 
save_model_path
знак равно './image_classification' Распечатать('Подготовка...') с участием tf.Сессия() так как сессия: # Инициализация переменных сессия.бегать(tf.global_variables_initializer()) # Цикл обучения для эпоха в ассортимент(эпохи): # Перебрать все партии n_batches знак равно 5 для batch_i в ассортимент(один, n_batches + один): для batch_features, batch_labels в load_preprocess_training_batch(batch_i, размер партии): train_neural_network(сессия, оптимизатор, keep_probability, batch_features, batch_labels) Распечатать('Эпоха{:> 2}, Партия CIFAR-10{}: '.формат(эпоха + один, batch_i), конецзнак равно'') print_stats(сессия, batch_features, batch_labels, Стоимость, точность) # Сохранить модель хранитель знак равно tf.поезд.Saver() save_path знак равно хранитель.спасти(сессия, save_model_path)

Теперь важная часть классификации изображений Tensorflow завершена. Пришло время протестировать модель.

  • Тестирование модели
импорт соленый огурец импорт тупой так как например импорт matplotlib.pyplot так как plt от sklearn.preprocessing импорт LabelBinarizer def batch_features_labels(Особенности, этикетки, размер партии): '' ' Разделять элементы и метки на партии '' ' для Начните в ассортимент(0, len(Особенности), размер партии): конец знак равно мин(Начните + размер партии, len(Особенности)) Уступать Особенности[Начните:конец], этикетки[Начните:конец] def display_image_predictions(Особенности, этикетки, предсказания, top_n_predictions): n_classes знак равно 10 label_names знак равно load_label_names() label_binarizer знак равно LabelBinarizer() label_binarizer.поместиться(ассортимент(n_classes)) label_ids знак равно label_binarizer.inverse_transform(например.массив(этикетки)) Инжир, Axies знак равно plt.подсюжеты(Nrowsзнак равноtop_n_predictions, ncolsзнак равно2, фиговыйзнак равно(двадцать, 10)) Инжир.tight_layout() Инжир.suptitle('Прогнозы Softmax', размер шрифтазнак равнодвадцать, Yзнак равно1.1) n_predictions знак равно 3 прибыль знак равно 0,05 инд знак равно например.апельсин(n_predictions) ширина знак равно (один. - 2. * прибыль) / n_predictions для image_i, (особенность, label_id, pred_indicies, pred_values) в перечислять(застегивать(Особенности, label_ids, предсказания.индексы, предсказания.ценности)): если (image_i < top_n_predictions): pred_names знак равно [label_names[pred_i] для pred_i в pred_indicies] правильное_имя знак равно label_names[label_id] Axies[image_i] [0].imshow((особенность*255).тип(например.int32, копироватьзнак равноЛожь)) Axies[image_i] [0].set_title(правильное_имя) Axies[image_i] [0].set_axis_off() Axies[image_i] [один].барх(инд + прибыль, pred_values[:3], ширина) Axies[image_i] [один].set_yticks(инд + прибыль) Axies[image_i] [один].set_yticklabels(pred_names[::-один]) Axies[image_i] [один].set_xticks([0, 0,5, 1.0])
%matplotlib в соответствии %config InlineBackend.figure_format знак равно 'сетчатка' импорт тензорный поток так как tf импорт соленый огурец импорт случайный save_model_path знак равно './image_classification' размер партии знак равно 64 n_samples знак равно 10 top_n_predictions знак равно 5 def test_model(): test_features, test_labels знак равно соленый огурец.грузить(открыто('preprocess_training.p', Режимзнак равно'rb')) загруженный_граф знак равно tf.График() с участием tf.Сессия(графикзнак равнозагруженный_граф) так как сессия: # Загрузить модель погрузчик знак равно tf.поезд.import_meta_graph(save_model_path + '.мета') погрузчик.восстановить(сессия, save_model_path) # Получить тензоры из загруженной модели loaded_x знак равно загруженный_граф.get_tensor_by_name('input_x: 0') loaded_y знак равно загруженный_граф.get_tensor_by_name('output_y: 0') loaded_keep_prob знак равно загруженный_граф.get_tensor_by_name('keep_prob: 0') loaded_logits знак равно загруженный_граф.get_tensor_by_name('logits: 0') loaded_acc знак равно загруженный_граф.get_tensor_by_name('точность: 0') # Получите точность в пакетах для ограничений памяти test_batch_acc_total знак равно 0 test_batch_count знак равно 0 для train_feature_batch, train_label_batch в batch_features_labels(test_features, test_labels, размер партии): test_batch_acc_total + = сессия.бегать( loaded_acc, feed_dictзнак равно{loaded_x: train_feature_batch, loaded_y: train_label_batch, loaded_keep_prob: 1.0}) test_batch_count + = один Распечатать('Точность тестирования:{} '.формат(test_batch_acc_total/test_batch_count)) # Распечатать случайные образцы random_test_features, random_test_labels знак равно кортеж(застегивать(*случайный.образец(список(застегивать(test_features, test_labels)), n_samples))) random_test_predictions знак равно сессия.бегать( tf.нет.top_k(tf.нет.softmax(loaded_logits), top_n_predictions), feed_dictзнак равно{loaded_x: random_test_features, loaded_y: random_test_labels, loaded_keep_prob: 1.0}) display_image_predictions(random_test_features, random_test_labels, random_test_predictions, top_n_predictions) test_model()

Вывод: Точность тестирования: 0,5882762738853503

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

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

Эдурека с сертификацией Python Обучение проводится профессионалами отрасли в соответствии с отраслевыми требованиями и требованиями. Вы освоите такие концепции, как функция SoftMax, нейронные сети автоэнкодера, ограниченная машина Больцмана (RBM), Keras и TFLearn. Курс был специально подготовлен отраслевыми экспертами с тематическими исследованиями в реальном времени.