Академический Документы
Профессиональный Документы
Культура Документы
ВЫПУСКНАЯ
КВАЛИФИКАЦИОННАЯ РАБОТА
МАГИСТРА
Исследование, разработка глубокой нейронной сети для задачи
распознавания картинок
Магистерская диссертация
/ Крамаренко К.Е./
Новосибирск 2017 г.
2
СОДЕРЖАНИЕ
Введение ................................................................................................................... 3
1 Задача классификации ...................................................................................... 6
1.1. Основные задачи теории распознавания образов ............................... 6
1.2. Типы характеристик образов. ............................................................... 9
1.3. Типы систем распознавания .................................................................. 9
1.4. Математическая постановка задачи классификации. ....................... 10
2 Машинное обучение ....................................................................................... 13
2.1. Задача обучения по прецедентам........................................................ 13
2.2. Основных методы машинного обучения для решения задачи
классификации................................................................................................. 20
3 Нейросетевая интерпретация задачи классификации изображений ......... 24
3.1. Основные понятия нейронных сетей ................................................. 25
3.2. Обучение нейронной сети методом обратного распространения
ошибок. ............................................................................................................. 28
3.3. Задачи, решаемые с помощью нейронных сетей .............................. 34
3.4. Решение задачи классификации изображений с помощью
сверточной нейронной сети. .......................................................................... 36
4 Экспериментальные исследования................................................................ 42
4.1. Среда и оборудование для экспериментов ........................................ 42
4.2. Выбор и подготовка данных для обучения ....................................... 44
4.3. Поиск оптимальных параметров нейронной сети ............................ 46
4.4. Анализ результатов. ............................................................................. 55
ЗАКЛЮЧЕНИЕ ..................................................................................................... 56
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ........................................... 57
ПРИЛОЖЕНИЯ А. Функции для загрузки данных ........................................... 61
ПРИЛОЖЕНИЕ Б. Скрипт тестирования конфигураций ................................. 63
ПРИЛОЖЕНИЕ В. Функции для изменения обучающей выборки ................. 65
3
ВВЕДЕНИЕ
1 Задача классификации
2 Машинное обучение
Точка
Входной Нелинейный ветвления
суммато преобразователь
р
Рисунок 2.2 - Модель искусственного нейрона
как:
𝑁3
1
𝐸(𝑛) = ∑ 𝑒𝑗2 (𝑛) (3.2)
2
𝑗=1
(3.12), получим:
∆𝑤𝑗𝑖 (𝑛) = 𝜂𝛿𝑗 (𝑛) 𝑦𝑖 (𝑛) (3.13)
Обычный локальный градиент 𝛿𝑗 (𝑛) определяется с помощью выражения:
𝜕𝐸 (𝑛) 𝜕𝐸 (𝑛) 𝜕𝑒𝑗 (𝑛) 𝑦𝑗 (𝑛)
𝛿𝑗 (𝑛) = − = = 𝑒𝑗 (𝑛)𝜎𝑗 ′ (𝑣𝑗 (𝑛)) (3.14)
𝜕𝑣𝑗 (𝑛) 𝜕𝑒𝑗 (𝑛) 𝜕𝑦𝑗 (𝑛) 𝜕𝑣𝑗 (𝑛)
Как можно увидеть из этих выражений, сигнал ошибки 𝑒𝑗 (𝑛) необходим нам
для вычисления величины коррекции. В случае выходного нейрона, получить
сигнал ошибки не сложно, так как желаемый результат известен и остается только
вычислить локальный градиент используя (3.1) и (3.14), но, чтобы вычислить
сигнал ошибки нейрона в скрытом слое, необходимо вычислять рекурсивно
ошибки всех связанных с ним нейронов. Тогда для вычисления локального
градиента нейрона в скрытом слое можно использовать выражение [16]:
𝜕𝐸 (𝑛) 𝑦𝑗 (𝑛) 𝜕𝐸 (𝑛)
𝛿𝑗 (𝑛) = − =− 𝜎 ′ (𝑣 (𝑛)) (3.15)
𝜕𝑦𝑗 (𝑛) 𝜕𝑣𝑗 (𝑛) 𝜕𝑦𝑗 (𝑛) 𝑗 𝑗
𝜕𝐸(𝑛)
При вычислении частной производной в (3.16), где суммирование
𝜕𝑦𝑗 (𝑛)
Величина ошибки для k-го выходного нейрона при (3.1) и (3.5) составляет:
𝑒𝑘 (𝑛) = 𝑑𝑘 (𝑛) − 𝜎𝑘 (𝑣𝑘 (𝑛)) (3.18)
Отсюда
𝜕𝑒𝑘 (𝑛)
= −𝜎𝑘 ′(𝑣𝑘 (𝑛)) (3.19)
𝜕𝑣𝑘 (𝑛)
Чтоб не потерять общность рассуждений для нейрона в любом слое
32
(2.23) можно найти путем умножения производной 𝜎𝑗′ (𝑣𝑗 (𝑛)) на взвешенную
33
Прямой проход: 𝑦𝑖 (𝑛) = 𝜎𝑗 (𝑣𝑗 (𝑛)), где 𝑣𝑖 (𝑛) = ∑𝑖 𝑤𝑘𝑗𝑖 (𝑛)𝑦𝑖 (𝑛).
𝑦𝑖 (𝑛) = 𝑥𝑖 (𝑛), если нейрон находится в первом скрытом слое, и 𝑦𝑗 (𝑛) = 𝜎𝑗 (𝑛), где
𝜎𝑗 (𝑛) – на выходной терминале сети, если нейрон является выходным. Прямой
проход подает на вход очередной вектор 𝑥𝑛 и заканчивается, вычисляя ошибку на
выходе 𝑒𝑛 = 𝑑𝑛 − 𝑜𝑛 ;
Обратный проход, на котором на выходной слой подается сигнал
ошибки, и при движении справа налево параллельно производится вычисление
локального градиента. При движении в обратном направлении осуществляется
коррекция весов, вычисляется локальный градиент, который в дальнейшем
используется для вычисления градиента последующего (при обратном
распространении) слоя нейронов.
К функции активации в нейронных сетях при использовании алгоритма
обратного распространения ошибки предъявляется требование
дифференцируемости [23]. Наиболее часто встречаемые функции активации были
приведены в разделе 3.1. Так как через значение самой функции можно выразить
производную функции активации, это позволяет при прямом проходе не
производить непосредственное вычисление производной функции, а использовать
значения функции, вычисленные при прямом проходе [22].
Алгоритм обратного распространения строит в пространстве весов
некоторую траекторию аппроксимации, которая вычисляется с помощью метода
наискорейшего спуска. При меньшем параметре обучения 𝜂 корректировка
синоптических связей производится меньше, а траектория в пространстве весов
становится более гладкой. Но чрезмерное уменьшение этого параметра это
приводит к замедлению процесса обучения, а использование слишком большого
параметра приводит к неустойчивости алгоритма и минимизировать ошибку не
получится. Обобщенное дельта правило позволяет повышать скорость обучения
34
4 Экспериментальные исследования
градиент серого.
o imresize(image, [weight height]) - создает изображение изменяя
размер исходного image на [weight height];
o imrotate(arr, angle, 'bicubic','crop') - создает изображения, путем
поворота исходного image на угол angle, использую интерполяцию по
бикубической поверхности ('bicubic'), 'crop' используется для того, что
размер нового изображения соответствовал размерам исходного;
Для работы со сверточными нейронными сетями [30]:
o imageInputLayer(inputSize) - задает входной слой размером
inputSize;
o convolution2dLayer(filterSize, numFilters) - задает слой свертки с
размером фильтра filterSize и количество этих фильтров numFilters;
o maxPooling2dLayer(poolSize) - задает слой подвыборки, путем
поиска максимального элемента в окне подвыборки с размером
оpoolsize;
o averagePooling2dLayer(poolSize) - задает слой подвыбрки, путем
поиском среднего значения в окне подвыборки с размером poolSize;
o fullyConnectedLayer(outputSize) - задает полносвязанный слой с
количеством нейронов равных outputSize;
o dropoutLayer(probability) - задает слой DropOut с коэффициентом
probability;
o softmaxLayer() - задает слой, который находит максимальный
элемент в выходном векторе и сопоставляет его соответствующему
классу;
o classificationLayer() - задает выходной слой размером
предшествующего полносвязанного слоя , который хранит выходной
вектор.
o trainingOptions('sgdm', 'MaxEpoches', maxepochs, 'MiniBatchSize',
minibatchsize, InitealLearnRate', initeallearnRate) - задает параметры
44
изображений для обучения и 1/3 для проверки качества работы сети во время
обучения. Все изображения являются цветными, поэтому они были
преобразованы в градиент серого, т.к. цвет символов не должен оказывать
влияния на процесс классификации.
Для загрузки и предобработки изображений в среду Matlab были написаны
следующие функции (Приложение A):
Load2ConvertSize (pathFolder, size, startIndex, finishIndex) – функция
для загрузки изображений из папки pathFolder, изменение размеров до size без
сохранения пропорций и преобразование в градиент серого;
Load2ConvertSizeProp (pathFolder, size, startIndex, finishIndex) –
функция для загрузки изображений из папки pathFolder, изменение размеров до
size c сохранением пропорций и преобразование в градиент серого.
8
16 0,4831 0,5101 0,498 0,4958 0,5011 0,4993 0,505 0,509 0,5101
256 0,5106 0,5126 0,5164 0,5134 0,5142 0,5164 0,5155 0,5156 0,5164
0,67
Точность классификации
0,62
0,57
0,52
0,47
50 100 150 200 250 300 350 400
Количество эпох
Стартовая конфигурация Конфигурация 1
Конфигурация 2 Конфигурация 1 с ReLu
Конфигурация 2 с ReLu Конфигурация 1 с Dropout
0,74
Точность классификации
0,72
0,7
0,68
0,66
0,64
0,62
0,6
50 100 150 200 250 300 350 400
Количество эпох обучения
0,73 0,7227
Точность классификации
0,72
0,71 0,7162
0,7
0,69
0,68
0,67
0,66
0,65
0,64
0,63
0 2000 4000 6000 8000 10000 12000
Количество добавляемых изображений
Конф. 1 Конф. 2
0,82
Точность распознавания
0,81
0,8121 0,8138 0,8135
0,8 0,8081
0,79
0,78 0,7885 0,7911
0,7832
0,77
0,76
0,75
50 100 150 200 250 300 350 400
Количество эпох
Конф. 1 Конф. 2
ЗАКЛЮЧЕНИЕ
В результате теоретических и экспериментальных исследований были
получены следующие научные и практические результаты:
1. В работе были изучены теоретических аспекты задачи классификации
и современных методов ее решения, исследованы возможности сверточной
нейронной сети в задачи распознавания. Проведен анализ и возможности методов
машинного обучения в решении данной задачи
2. Разработана нейронная сеть для задачи классификации символов на
естественных изображений с точностью классификации порядка 81%, что
позволило занять 16 место в соревновании по классификации символов «First
Steps With Julia». Для выполнения работы использовались зарекомендовавший в
решении задачи классификации изображений алгоритм сверточных нейронных
сетей. Экспериментальные исследования проводились в среде Matlab.
3. Были изучены и опробованы методы, улучшающие качество обучение
сети и точность классификации в задачи распознавания символов. В работе
показано, как влияет выбор архитектуры, оптимальных параметров обучения и
размер обучающей выборки на точность классификации.
4. Проведен анализ аналогичных решений по задачи классификации
символов на естественных изображений участников соревнования на Kaggle «First
Steps With Julia», по которым получилось составить рекомендации по улучшению
качества обучения нейронной сети.
По ходу выполнения работы были получены навыки работы с методами
машинного обучения в прикладном программном обеспечении Matlab.
В перспективе данной работы исследовать полученные в четвертой главе
рекомендации по улучшению качества обучения нейросетевого алгоритма для
задачи классификации символов на изображении.
57
arr_image = [];
for i = startIndex:finishIndex;
if ~isempty(map)
X = ind2rgb(X,map);
end
X = im2double(X);
disp(info.ColorType);
if info.ColorType == 'truecolor'
X = rgb2gray(X);
end
X = imresize(X,[Size Size],'nearest');
arr_image = [arr_image [X]];
end
count = length(arr_image)/Size;
arr_image = reshape(arr_image, Size,Size,1, count);
end
for i = startIndex:finishIndex;
[X map] = imread(pathFile);
info = imfinfo(pathFile);
h = info.Height;
w = info.Width;
if ~isempty(map)
X = ind2rgb(X,map);
end
X = im2double(X);
disp(info.ColorType);
if info.ColorType == 'truecolor'
X = rgb2gray(X);
end
left = zeros(maxsize,ldw);
left(:) = color;
right = zeros(maxsize,rdw);
right(:) = color;
up = zeros(ldh,maxsize);
up(:) = color;
down = zeros(rdh,maxsize);
down(:) = color;
X = [left X right];
X = [up; X; down];
X = imresize(X,[Size Size],'nearest');
arr_image = [arr_image [X]];
end
count = length(arr_image)/Size;
arr_image = reshape(arr_image, Size,Size,1, count);
end
63
diary on
diary('D:\Studies\MastersWork\Garbage\NewWork\res\1_16.txt'); %путь сохранения результатов
rng('default');
epoche = 50
rng('default');
r = [];
arr_accuracy = [];
arr_accuracy_train = [];
r = [r rand];
64
tic
net = trainNetwork(x_train,y_train,layers,options); %обучение нейроной сети
time = toc
all_time=time;
h_epoche = 50;
%вывод результатов
arr_accuracy
arr_accuracy_train
all_time
net.Layers
r
options
diary off;
65
size_image = length(in_image);
%поворот изображения
out_image = imrotate(in_image,angle,'bicubic','crop');
%сдвиг изображения
if (step1<0) %влево
k = out_image;
dop = zeros(-step1,size_image);
dop(:) = color;
k = [k dop'];
out_image = k(:,-step1+1:size_image+(-step1));
end
if (step1>0) %вправо
k = out_image;
dop = zeros(step1,size_image);
dop(:) = color;
k = [dop' k];
out_image = k(:,1:size_image);
end
if (step2<0) %вниз
k = out_image;
dop = zeros(-step2,size_image);
dop(:) = color;
k = [dop; k];
out_image = k(1:size_image,:);
end
66
if (step2>0) %вверх
k = out_image;
dop = zeros(step2,size_image);
dop(:) = color;
k = [k; dop];
out_image = k(step2+1:size_image+step2,:);
end
%инвертирование цветов
if (flag_invert == 1 && invert==1)
out_image = 1-out_image;
end
%наложение фильтра
if (flag_filter == 1 && filter==1)
h=fspecial('log', 3, .5);
out_image = imfilter(out_image,h,'replicate');
end
out_image(out_image<0) = color;
end
size_in = length(arr_image1(1,1,1,:));;
size_change = length(arr_image2(1,1,1,:));
size_image = length(arr_image1(1,:,1,1));
for i=1:size_change
out = [out ChangeImage(arr_image2(:,:,:,i), angle, step1, step2, flag_invert, flag_filter)];
end
end