В предыдущих статьях мы узнали о классических архитектурах сверточных нейронных сетей (CNN) (LeNet-5, AlexNet, VGG16 и ResNets). Мы создали все модели с нуля с помощью Keras, но не обучали их, потому что обучение таких глубоких нейронных сетей требует больших затрат и времени на вычисления. Но благодаря трансферному обучению, когда модель, обученная одной задаче, может быть применена к другим задачам. Другими словами, модель, обученную одной задаче, можно настроить или настроить для работы с другой задачей без явного обучения новой модели с нуля. Мы называем такую ​​модель предварительно обученной моделью.

Предварительно обученная модель

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

Ниже представлены модели, доступные в Керасе:

  • Xception
  • VGG16
  • VGG19
  • ResNet50
  • НачалоV3
  • InceptionResNetV2
  • MobileNet
  • DenseNet
  • NASNet
  • MobileNetV2

Все эти архитектуры совместимы со всеми бэкэндами (TensorFlow, Theano и CNTK).

Для получения дополнительной информации и справочной информации посетите: https://keras.io/applications

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

Сначала мы импортируем Keras и требуемую модель из keras.applications, а затем создадим экземпляр архитектуры модели вместе с весами изображений. Если вам нужна только архитектура модели, создайте экземпляр модели с весами «Нет».

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

VGG16

import keras import numpy as np
from keras.applications import vgg16
#Load the VGG16 model
 vgg_model = vgg16.VGG16(weights=’imagenet’)

Inception_v3

import keras import numpy as np
from keras.applications import inception_v3
#Load the Inception_V3 model
 inception_model = inception_v3.InceptionV3(weights=’imagenet’)

ResNet50

import keras import numpy as np
from keras.applications import resnet50
#Load the ResNet50 model
 resnet_model = resnet50.ResNet50(weights=’imagenet’)

Мобильная сеть

import keras import numpy as np
from keras.applications import mobilenet
#Load the MobileNet model
 mobilenet_model = mobilenet.MobileNet(weights=’imagenet’)

Загрузить и предварительно обработать изображение

Мы будем использовать функции Keras для загрузки и предварительной обработки изображения. Должны быть выполнены следующие шаги:

1- Загрузите изображение с помощью функции load_img (), указав целевой размер.

from keras.preprocessing.image import load_img 
from keras.preprocessing.image import img_to_array 
from keras.applications.imagenet_utils import decode_predictions 
import matplotlib.pyplot as plt 
import numpy as np
%matplotlib inline #For jupyter notebook
filename = ‘images/cat.jpg’ # load an image in PIL format
original_image = load_img(filename, target_size=(224, 224))

2- Keras загружает изображение в формате PIL (ширина, высота), который должен быть преобразован в формат NumPy (высота, ширина, каналы) с помощью функции image_to_array ().

# convert the PIL image (width, height) to a NumPy array (height, width, channel)
 numpy_image = img_to_array(original_image)

3. Затем входное изображение должно быть преобразовано в 4-мерный тензор (размер пакета, высота, ширина, каналы) с помощью функции NumPy expand_dims.

# Convert the image into 4D Tensor (samples, height, width, channels) by adding an extra dimension to the axis 0.
 input_image = np.expand_dims(numpy_image, axis=0)

Вы можете распечатать размер изображения после каждой обработки.

print(‘PIL image size = ‘, original_image.size) print(‘NumPy image size = ‘, numpy_image.shape) print(‘Input image size = ‘, input_image.shape)
plt.imshow(np.uint8(input_image[0]))

4- Нормализация изображения

В некоторых моделях используются изображения со значениями от 0 до 1 или от -1 до +1 или стиль «кофе». Input_image дополнительно нормализуется путем вычитания среднего значения данных ImageNet. Нам не нужно беспокоиться о внутренних деталях, и мы можем использовать функцию preprocess_input () из каждой модели для нормализации изображения.

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

#preprocess for vgg16
 processed_image_vgg16 = vgg16.preprocess_input(input_image.copy())
#preprocess for inception_v3
 processed_image_inception_v3 = inception_v3.preprocess_input(input_image.copy())
#preprocess for resnet50
 processed_image_resnet50 = resnet50.preprocess_input(input_image.copy())
#preprocess for mobilenet
 processed_image_mobilenet = mobilenet.preprocess_input(input_image.copy())

Предсказать изображение

Используйте функцию model.predict (), чтобы получить результаты классификации и преобразовать их в метки с помощью функции decode_predictions ().

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

# vgg16 
predictions_vgg16 = vgg_model.predict(processed_image_vgg16) label_vgg16 = decode_predictions(predictions_vgg16)
print (‘label_vgg16 = ‘, label_vgg16)
# inception_v3 
predictions_inception_v3 = inception_model.predict(processed_image_inception_v3) label_inception_v3 = decode_predictions(predictions_inception_v3)
print (‘label_inception_v3 = ‘, label_inception_v3)
# resnet50 
predictions_resnet50 = resnet_model.predict(processed_image_resnet50) 
label_resnet50 = decode_predictions(predictions_resnet50)
print (‘label_resnet50 = ‘, label_resnet50)
# mobilenet 
predictions_mobilenet = mobilenet_model.predict(processed_image_mobilenet) 
label_mobilenet = decode_predictions(predictions_mobilenet)
print (‘label_mobilenet = ‘, label_mobilenet)

Резюме:

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