
Нейронные сети (ВМ) / Задания / laba4
.pdfУДК 519.68:007.5
Лабораторная работа 4. Сверточные сети
Цели работы: работа с предобученными сверточными сетями. Адаптация готовых сетей под новые задачи распознания изображений.
Ключевые слова: сверточные сети, распознание изображений, позиционирование объектов на изображениях.
§1. Общая схема для адаптации предобученных сверточных сетей
Уготовой сверточной сети мы изменяем (или заменяем) последние слои, которые отвечали за итоговую классификацию объектов. При этом все внутренние слои мы сохраняем без изменений, используя для них старые веса. Это позволяет избежать длительного обучения сверточных слоёв, которые уже были обучены на выделение примитивных признаков: границ, контуров, распознание цветов, кластеров из линий или контуров и т.д.
1.1. Подключение готовой сверточной сети в Matlab. Загружаем одну из предобученных сетей (требуется Deep Learning Toolbox).
net = googlenet; % или более простую = squeezenet inputSize = net.Layers(1).InputSize; analyzeNetwork(net)
Определяем какие из слоев отвечают за финальную классификацию и заменяем их на новые, соотвествующие размерности нашей задачи.
numClasses = 10; % новые классы для изображений.
lgraph = layerGraph(net); % переведём модель к формату графа. [learnableLayer,classLayer] = findLayersToReplace(lgraph)
newLearnableLayer = fullyConnectedLayer(numClasses, ...
’Name’,’altered_fc’, ...
’WeightLearnRateFactor’,5, ... % ускорим обучение слоя
’BiasLearnRateFactor’,5);
lgraph = replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);
newClassLayer = classificationLayer(’Name’,’new_classoutput’); lgraph = replaceLayer(lgraph,classLayer.Name,newClassLayer);
Слой классификации использует оценку ошибки на основе перекрестной энтропии (cross entropy), поэтому проверьте что после нового полносвязного слоя сохранился старый softmax. В противном случае оценка ошибки будет считаться некорректно. Убедиться в том, что слой остался на месте можно либо распечатав граф командой plot, либо командой analyzeNetwork.
Заморозим первые 10 слоев, чтобы для них не обновлялись веса и не вычислялся градиент ошибки при обучении сети.
2
layers = lgraph.Layers; connections = lgraph.Connections;
layers(1:10) = freezeWeights(layers(1:10));
lgraph = createLgraphUsingConnections(layers,connections);
Выберем размер блоков для одного прогона и проведем обучение сети.
miniBatchSize = 5;
options = trainingOptions(’sgdm’, ...
’MiniBatchSize’,miniBatchSize, ...
’MaxEpochs’,6, ...
’InitialLearnRate’,2e-4, ...
’Shuffle’,’every-epoch’, ...
’ValidationData’,Valid_Data, ...
’Verbose’,false, ...
’Plots’,’training-progress’);
net = trainNetwork(Train_Data,lgraph,options);
Подготовить данные для обучение и валидации можно с помощью операций:
1.imageDatastore — считывание картинок из файловой системы. imds = imageDatastore(’Our_Data’, ...
’IncludeSubfolders’,true, ...
’LabelSource’,’foldernames’);
2.splitEachLabel — вероятностного разделения по меткам.
[Train_Raw,Valid_Raw] = splitEachLabel(imds,0.7);
3.imageDataAugmenter — внесение искажений в исходные изображения. pixelRange = [-30 30];
scaleRange = [0.9 1.1];
imageAugmenter = imageDataAugmenter( ...
’RandXReflection’,true, ... % случайные отражения ’RandXTranslation’,pixelRange, ...% случайные сдвиги ’RandYTranslation’,pixelRange, ...% ’RandXScale’,scaleRange, ...% случайные деформации ’RandYScale’,scaleRange);. %
4.augmentedImageDatastore — перевод к формату модели (+деформации).
Train_Data = augmentedImageDatastore(inputSize(1:2),Train_Raw, ...
’DataAugmentation’,imageAugmenter);
Valid_Data = augmentedImageDatastore(inputSize(1:2),Valid_Raw, ...
’DataAugmentation’,imageAugmenter);
Вэтих примерах inputSize(1:2) — это линейные размеры изображений, на которые обучалась сеть googlenet (224*224). Деформации мы вводим для того чтобы предотвратить переобучение, а также увеличить вероятность обучения сети на конкретных объектах, а не на не связанных с ними особенностях изображений (фон, освещение, позиции объекта на изображении).
ЛАБОРАТОРНАЯ РАБОТА 4. СВЕРТОЧНЫЕ СЕТИ |
3 |
1.2. Подключение готовой сверточной сети в Python. Загружаем любую одну из предобученных сетей (требуется Keras).
from keras.applications.resnet50 import ResNet50 from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input from keras.layers import Dense
from keras.models import Model from keras.utils import plot_model import numpy as np
numClasses = 10 # новые классы для изображений.
base_model = ResNet50(weights=’imagenet’,include_top=False) trimmed_output = base_model.output
our_output = Dense(numClasses, activation=’softmax’)(trimmed_output)
model = Model(inputs=base_model.input, outputs=our_output)
# распечатаем модель в виде графа plot_model(model, to_file=’model.png’)
Заморозим все слои сети, кроме нашего нового слоя и соберем модель. for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer=’rmsprop’, loss=’categorical_crossentropy’)
Выберем размер блоков для одного прогона и проведем обучение сети. maxEpochs = 8; % число эпох для обучения
miniBatchSize = 5;% мини блоки обучающей выборки
train_Data = image.img_to_array(train_generator) train_Data = np.expand_dims(train_Data, axis=0) train_Data = preprocess_input(train_Data)
test_Data = image.img_to_array(validation_generator) test_Data = np.expand_dims(test_Data, axis=0) test_Data = preprocess_input(test_Data)
history = model.fit(train_Data epochs=maxEpochs, batch_size=miniBatchSize,
validation_data=test_Data, verbose=1, shuffle=True)
Изображения для обучения и валидации приведем к формату модели, проведя предобработку.
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
4
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory( ’data/train’,
target_size=(224, 224), batch_size=batch_size, class_mode=’binary’)
validation_generator = test_datagen.flow_from_directory( ’data/validation’,
target_size=(224, 224), batch_size=batch_size, class_mode=’binary’)
§ 2. Практические задания
Задание № 1: Классификация изображений.
1.Выбрать изображения как минимум с 10 классами объектов.
2.Импортировать сверточную сеть и адаптировать для обработки и распознания этих классов.
3.Сравнить качество и скорость обучения при использовании аугментации данных и при обучении без него.
Задание № 2: Позиционирование объектов на изображениях.
1.Доработать модель из задания 1, предусмотрев возможность обнаружения конкретных позиций объектов на изображениях.
2.Если объект нужного класса распознается на изображении, то вернуть координаты контуров.
3.Визуализировать обнаружение, обводя объекты на изображении.
4.Провести сравнение с моделью, обучавшейся на данных без аугментации.
Список литературы
[1]Y. LeCun, B. Boser, J. S. Denker, D. Henderson, R. E. Howard, W. Hubbard and L. D. Jackel, “Backpropagation Applied to Handwritten Zip Code Recognition”, Neural Computation, 4:1 (1989), 541–551.