В предыдущих статьях мы узнали о классических архитектурах сверточных нейронных сетей (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)
Резюме:
Мы можем использовать предварительно обученные модели в качестве отправной точки для нашего процесса обучения, вместо того, чтобы обучать нашу собственную модель с нуля.