Сверточные нейронные сети могут стать настоящей головной болью для программирования. Их продвинутая структура и манипуляции с данными, необходимые для подачи изображений, делают его сложнее, чем обычная нейронная сеть.
Я работал над поддержкой сверточной нейронной сети для пакета 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)
Здесь происходит то, что размеры входных изображений были загружены из файла загрузчиком. Изображение, которое вы загрузили в функцию вычисления, принимает правильные размеры. Затем изображение загружается в сохраненную обученную нейронную сеть, и рассчитывается вероятность.