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

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

Прежде всего, нам нужно установить deployml (этот выпуск поддерживает сверточные сети, стандартная установка pip будет работать после выхода версии 0.0.4):

pip install deployml==0.0.3bis

Теперь новый патч использует OpenCV 2, который можно установить с помощью следующей команды:

pip install opencv-python

После установки зависимостей нам нужно настроить среду для обучения. Сейчас deployml поддерживает только двоичные результаты. В будущем я буду работать над поддержкой обучения, оценки и развертывания классификаторов для более чем двух результатов. Пока нам нужны две папки. Один называется positive_images и negative_images:

Допустим, вы хотите отличить кошек от собак или рентген грудной клетки при инфекциях и нормальных инфекциях грудной клетки. Вы помещаете все фотографии своих собак в положительные_изображения, а фотографии кошек - в отрицательные_изображения. Сейчас ваши изображения должны иметь расширение PNG, но в будущем они будут работать с другими форматами файлов. Теперь, когда наши изображения отсортированы, мы можем запустить наш скрипт python в папке, в которой находятся два файла изображений. В скрипт импортируем сверточную нейронную сеть и загрузчик:

from deployml.keras import ConvolutionalNeuralNetwork
from deployml.keras import KerasLoader
import cv2

Затем мы определяем нашу нейронную сеть

net = ConvolutionalNeuralNetwork(dropout_option=False, 
                                 batch_norm=False, 
                                 first_layer=(32, 3, 3),
                                 con_hidden_layers=[(32, 3, 3), 
                                 (32, 2, 2), (15, 1, 1)],
                                 hidden_layers=(10, 10, 5),
                                 optimizer='adam',
                                 activation_fn='relu',
                                 input_dims=(28, 28))

Здесь у нас есть четыре сверточных слоя и три обычных скрытых слоя. У нас также есть функции relu для слоев. Затем мы обучаем нашу сеть:

net.train()

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

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

net.evaluate_outcome()

Это даст вам следующий отчет:

Хорошо, это не здорово, но, как вы можете видеть, здесь всего 7 изображений для этого урока. Рекомендуется использовать гораздо больше. Теперь мы хотим его развернуть. Мы можем сделать это, вызвав функцию развертывания, в свою очередь сохранив модель под именем файла «test.sav»:

net.deploy_model(description="this is a test", 
                 author="maxwell flitton", 
                 organisation='test', 
                 contact="ex",        
                 file_name="test.sav")

Deployml поддерживает обработку моделей Keras. В будущем мы рассмотрим возможность поддержки полных файлов JSON. На данный момент этот файл имеет ряд параметров, включая модель, параметры конфигурации (для KerasLoader). Показанный выше отчет также включается в сохраненный файл для справки при необходимости. Теперь мы хотим загрузить нашу модель:

loader = KerasLoader(file_path="test.sav")

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

image = cv2.imread("some_file_path/test.png")

Теперь мы можем вычислить вероятность того, что это изображение является членом группы positive_image:

loader.calculate(image=image)

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