Как сделать нейронную сеть в матлаб
В прошлом я задал несколько вопросов о нейронных сетях на этом веб-сайте и получил отличные ответы, но я все еще пытаюсь реализовать его для себя. Это довольно длинный вопрос, но я надеюсь, что он послужит руководством для других людей, создающих собственные базовые нейронные сети в MATLAB, поэтому он стоит того.
То, что я сделал до сих пор, может быть совершенно неправильным. Я следую онлайн-курс обучения машинам в Стэнфорде профессором Эндрю Я. Нг и старался реализовать то, что он преподал, насколько это возможно.
Не могли бы вы рассказать мне, правильны ли функции прямого перевода и функции затрат моего кода, и где я ошибаюсь в части минимизации (оптимизации)?
У меня есть канал подачи 2-го уровня для первичной нейронной сети.
Код MATLAB для части форматирования:
Итак, например, двухслойная нейронная сеть с двумя входами и двумя выходами будет выглядеть примерно так:
если мы добавим:
Это представляет значения y1 и y2, показанные на рисунке нейронной сети
Код MATLAB для функции вычисления квадратов ошибок:
Пример
Так, например, если данные обучения:
Начнем с начальных случайных весов
Если мы добавим:
Это далеко не так, как показывают данные обучения (8/57 = 0.1404). Итак, начальные случайные веса W1 и W2, где плохое предположение.
Чтобы точно определить, насколько плохи/хороши догадки, вес случайных весов мы используем функцию стоимости:
Это дает значение:
Сведение к минимуму функции затрат
Если мы минимизируем функцию стоимости, выполнив поиск всех возможных переменных W1 и W2, а затем выбрав самый низкий, это даст сети, которая наилучшим образом приблизит данные обучения
Но когда я использую код:
Не могли бы вы рассказать мне, правильны ли функции прямого перевода и функции затрат моего кода, и где я ошибаюсь в части минимизации (оптимизации)?
Ваша нейронная сеть кажется в порядке, хотя вид обучения, который вы пытаетесь сделать, довольно эффективен, если вы тренируетесь против помеченных данных, как вы делаете. В этом случае я бы предложил заглянуть в Back-propagation
Как аргумент x0 в fminsearch , который является исходным предположением для оптимизатора, вы отправляете [W1, W2] , но из того, что я вижу, эти матрицы не имеют одинакового количества строк, и поэтому вы можете ‘ t добавьте их вместе. Я бы предложил изменить вашу функцию стоимости, чтобы взять вектор в качестве аргумента, а затем сформировать ваши весовые векторы для разных слоев из этого одного вектора.
Вы также не правильно используете функцию затрат fminsearch , поскольку вы просто оцениваете cost с помощью w1, w2, Xtrain и Ytrain на месте.
В соответствии с документацией (прошло много лет с тех пор, как я использовал Matlab) кажется, что вы передаете указатель на функцию стоимости как
fminsearch(cost, [W1; W2])
EDIT: вы можете выразить свои веса и изменить свой код следующим образом:
Функция затрат должна быть изменена таким образом, чтобы она не принимала Xtrain, Ytrain в качестве входных данных, потому что fminsearch затем попытается их оптимизировать. Измените свою стоимость-функцию следующим образом:
Сформируем последовательность входов и целей в рабочей области GUI-интерфейса, используя окно Create New Data.
Ввод завершим нажатием кнопки Create.
Аналогичную операцию проделаем для вектора Y, с указанием (с помощью кнопки Targets), что это -- вектор целевых данных.
Создадим новую нейронную сеть.
Для этого в окне Network/Data Manager нажмем кнопку New Network.
В открывшемся окне Create New Network (рисунок 2) выберем нейронную сеть типа feed-forward backprop с прямой передачей сигнала и с обратным распространением ошибки.
При создании сети сохраним ей имя, даваемое по умолчанию (network1).
Диапазон входов определим (в окне Create New Network) с помощью опции Get from input.
Количество нейронов (Number of neurons) первого слоя (Layer 1) установим равным двум.
Остальные установки при создании сети оставим по умолчанию.
Создание сети завершим нажатием кнопки Create.
После этого в окне Network/Data Manager, в области Networks появится имя новой созданной сети -- network1. Выберем это имя с помощью мышки, что приведет к активизации всех кнопок указанного окна (рисунок 3).
Выполним инициализацию сети, с помощью кнопки Reinitialize Weights Это приведет к открытию диалоговой панели Network: network1 (рисунок 4)
Для установления диапазонов входа и инициализации весов используем кнопки Set input Ranges и Initialize Weights. Если требуется вернуться к прежним диапазонам, то следует выбрать кнопки Revert input Ranges (Вернуть диапазоны) и Revert Weights (Вернуть веса).
Для обучения созданной сети, выбирается закладка Train в панели Network: network1 и открывается новая диалоговая панель (рисунок 5)
Рисунок 5. Обучение нейронной сети.
Панель имеет две закладки:
- 1) Training Info (Информация об обучении);
- 2) Training Parameters (Параметры обучения);
Применяя эти закладки, можно установить имена последовательностей входа и цели (на вкладке Training Info -- в левой ее части необходимо указать X и Y), а также значения параметров процедуры обучения (на вкладке Training Parameters.
Далее нажимаем кнопку Train Network, что вызовет обучение сети. Качество обучения сети можно посмотреть на графике во время обучения. По оси Y отображается среднеквадратическая ошибка, а по оси X - итерации обучения.
Результаты обучения можно просмотреть в окне Network/Data Manager, активизируя имена последовательностей выходов network1_outputs или ошибок network1_errors, и используя кнопку View (рисунок 6).
Рисунок 6. Результаты обучения.
Для просмотра структурной схемы сети необходимо, выбрав имя сети (network1), воспользоваться кнопкой View (рисунок 7).
Рисунок 7. Схема созданной сети.
Дальше экспортируем созданную нейронную сеть в рабочую область системы MATLAB (нажав кнопку Export и далее, в открывшемся окне Export or Save from Network/Data Manager, -- кнопки Select All и Export) (рисунок 8).
Рисунок 8. Экспорт нейронной сети.
Получить информацию о весах и смещениях в рабочем окне системы можно выполнив команду:
Теперь можно построить модель НС в среде Simulink (рисунок 8) и отобразить ее схему, используя команду:
Используя Матлаб можно очень быстро создать и обучить нейронную сеть практически на любой выборке. Обучается очень быстро и довольно точно! То что ниже сохранить как матлабовский файл (например neural.m):
function [TRAIN1, TRAIN2] = NeuralNet1()
clear;
[A] = csvread('oil.csv'); %чтение csv-файла
[m,n] = size(A); %размерность входного массива
[TRAIN1] = A(1:m); % входная серия, то есть первый столбец входного файла
[TRAIN2] = A(m+1:m*2); %выходная серия, в данном случае второй столбец
mx = max(TRAIN1); % максимальное значение входного ряда
TRAIN1 = TRAIN1/mx; % приводим входной ряд в единичный интервал
TRAIN2 = TRAIN2/mx; % приводим выходной ряд в единичный интервал
%for k=2:m-1 % в этом цикле делаем нормальную входную и выходную выборки для прогнозирования
% RYD_IN(k-1) = TRAIN1(k+1) - TRAIN1(k); % то есть делаем разность между К-м и К+1 - м значениями ряда
% RYD_OUT(k-1) = TRAIN2(k+1) - TRAIN2(k);
% NUM(k-1) = k-1;
%end
%net = newff(TRAIN1, TRAIN2, [10],);
net = newff(TRAIN1, TRAIN2); % создаем нейронную сеть
net.trainParam.epochs = 200; % количество эпох для обучения
net = train(net, TRAIN1, TRAIN2); % собственно обучение нейросети
y1 = sim(net, TRAIN1); % имитация работы сети
c = y1 - TRAIN2; % разность между тем, что должно было быть и тем, что получилось
plot(c); % вывод графика того, что должно было быть и того что получилось
% если ниже расскоментировать, а предыдущую строчку закоментировать, то будет вывод в отдельных рядах
%subplot(2,1,1); plot(RYD_OUT)
%title('Real data')
%subplot(2,1,2); plot(y1)
%title('NN out')
Символ % - означает комментирование в Матлаб. Соотвественно, чтобы получить разные представления графиков - раскомментировать поблочно в коде
Файл oil.csv, который читается в начале имеет следующую структуру:
16.44000,16.50000,16.18000,16.19000
16.35000,16.54000,16.20000,16.27000
16.25000,16.25000,16.01000,16.20000
Можно естесственно другой файл - главное, чтобы он был csv. Можно и другие форматы, только немного код изменить надо будет
Преимущество пакета MATLAB состоит в том, что при его использовании пользователь не ограничен моделями нейронных сетей и их параметрами, жестко заложенными в нейросимуляторе, а имеет возможность самостоятельно сконструировать ту сеть , которую считает оптимальной для решения поставленной задачи.
Рассмотрим пример конструирования нейронной сети в пакете Matlab.
Пусть имеется 15 независимых переменных - показателей деятельности фирмы и одна зависимая переменная - объем продаж. Имеем базу данных за прошедший год. Необходимо построить понедельный прогноз объемов продаж на месяц. Для решения задачи предлагается использовать трехслойную сеть обратного распространения .
Сформируем такую сеть , которая включает 15 нейронов во входом слое ( по количеству входных переменных), 8 нейронов во втором слое и 1 нейрон в выходном слое ( по количеству выходных переменных).
Для каждого слоя выберем передаточную функцию: первый слой - tansig, второй - logsig, третий - purelin.
В среде Matlab синтаксис такой нейронной сети выглядит следующим образом:
где PR - массив минимальных и максимальных значений для R векторов входа;
Si - количество нейронов в i-м слое ;
TFi - функция активации слоя i;
btf - обучающая функция , реализующая метод обратного распространения ;
blf - функция настройки, реализующая метод обратного распространения ;
pf - критерий качества обучения.
Активационной функцией может выступать любая дифференцируемая функция , например, tansig, logsig, purelin.
где P - множество входных векторов;
n - количество входов НС;
m - количество нейронов в скрытом слое ;
l - количество выходов НС.
Необходимо также установить метод расчета значения ошибки. Например, если выбран метод наименьших квадратов , то эта функция будет выглядеть так: Net .performFcn=' SSE '.
Для установления максимального количества эпох равным 10000 воспользуемся функцией: net.trainParam.epochs=10000 .
Запустить процесс обучения можно таким образом:
После окончания обучения сети ее можно сохранить в файле, например, с именем nn1. mat .
Для этого необходимо выполнить команду:
Таким образом, в пакете возможно конструирование сети любой сложности и нет необходимости привязываться к ограничениям, накладываемым нейросимуляторами. Однако для работы с нейронными сетями в пакете Matlab необходимо изучить как саму среду, так и большинство функций Neural Network Toolbox . Для более детального изучения конструирования нейронных сетей в Neural Network Toolbox можно порекомендовать [49, 50].
В пакете Matlab предусмотрен набор функций для синтеза и обучения нейронных сетей. Этапы, необходимые для создания нейронной сети включают в себя:
- подготовку данных для тренировки сети;
- собственно создание сети;
- использование сети для решения поставленной задачи.
Этап подготовки данных включает в себякодирование входов-выходов (нейросети могут работать только с числами), нормировку данных (результаты нейроанализа не должны зависеть от выбора единиц измерения), предобработку данных (удаление очевидных регулярностей из данных облегчает нейросети выявление нетривиальных закономерностей).
Этот этап может быть выполнен с помощью различных функций пакета Matlab не относящихся к нейросетевому анализу. Например, удаление трендов из данных можно выполнить с помощью команды detrend (x), где x- вектор данных
Для создания нейросети предусмотрен следующий набор функций:
network – создание нейронной сети пользователя;
newc – создание конкурентного слоя;
newcf – создание каскадной направленной сети;
newelm – создание сети обратного распространения Элмана (Elman);
newff – создание однонаправленной сети;
newfftd – создание однонаправленной сети с входными задержками;
newgrnn – создание обобщенной регрессонной нейронной сети;
newhop – создание рекуррентной сети Хопфилда;
newlin – создание линейного слоя;
newlind – конструирование линейного слоя;
newlvq – создание квантованной сети;
newp – создание перцептрона;
newpnn – конструирование вероятностной нейронной сети;
newrb – конструирование сети с радиальным базисом;
newrbe – конструирование точной сети с радиальными базисными функциями;
newsom – создание самоорганизующейся карты.
Соответственно, для выполнения всех этапов создания нейросети необходимо написать скрипт, который выполняет вся последовательность этапов создания нейросети.
В данной лабораторной работе для создания и обучения нейронной сети используется встроенная в пакет Matlab утилита Network/Data manager, которая упрощает создание и обучение нейросети.
УТИЛИТА NETWORK/ DATA MANAGER
Рисунок 11- Выбор Launch Pad.
Далее, необходимо выбрать Neural Network Toolbox и в нем NNTool. После этого появится окно утилиты Network/Data manager (рис.12). Создание новой нейросети и ее обучение с помощью утилиты Network/Data manager включает в себя следующие этапы:
Рисунок 12- Интерфейс утилиты Network/Data manager
Рассмотрим подробнее этапы создания и обучения нейросети с помощью Network/Data manager на примере обучения распознаванию QRS комплексов. Сначала сформируем набор входных векторов. Этот набор должен быть задан в виде матрицы NxM, где N- количество признаков QRS- комплекса, M- количество обучающих примеров: .
Рисунок 13- Загрузка обучающих векторов в Network/Data manager
Так, если принадлежит первому классу, то значение будет равно единице.
Рисунок 14- Загрузка целевого вектора в Network/Data manager
Рисунок 15- Окно выбора типа и параметров нейронной сети.
Рисунок 16- Пример нейронной сети, созданной с помощью Network/Data manager
Данная последовательность процедур создания нейронной сети является упрощенной, создающей общее представление о синтезе нейронных сетей. Для более подробного изучения вопроса следует обратиться к дополнительной литературе, например /1/.
3. ОПИСАНИЕ ДАННЫХ И ЭКСПОРТ ДАННЫХ В ПАКЕТ MATLAB.
Рисунок 17- Нормальный QRS- комплекс
Загрузить файлы в среду Matlab можно с помощью команды load. Например, load 1 загружает данные из файла 1.mat и автоматически создает переменную в рабочем пространстве (workspace) A1. Соответственно load 1V загружает файл 1V.mat и создает переменную A1v. Просмотреть загруженные данные можно с помощью команды plot. Так, plot (A1v) выведет желудочковую экстрасистолу, хранящуюся в файле 1V.mat.
Визуально видно, что существуют различия между QRS- комплексами на рисунках 17 и 18 и они могут быть отнесены к разным группам (например, длительность желудочковой экстрасистолы примерно в 2 раза больше нормального комплекса).
В данной лабораторной работе необходимо научить многослойный перцептрон распознаванию исходных файлов.
В качестве пространства признаков использовать:
1) вектор исходного сигнала (размерность пространства=64);
2) сжатое описание QRS-комплекса в пространстве меньшей размерности. В качестве параметров сжатого описания выбрать максимальное значение, дисперсию и среднее значение QRS-комплекса (размерность пространства=3).
- ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ.
- Создать матрицу входных векторов, содержащую по 15 векторов (64 отсчета) нормальных и желудочковых QRS-комплексов и соответствующую ей матрицу целевого вектора.
- Сформировать нейронную сеть и обучить ее на созданных примерах.
- Протестировать полученную нейронную сеть на матрице созданной из оставшихся 5 векторов нормальных и желудочковых QRS- комплексов.
- Аналогично для сжатого описания QRS- комплекса повторить пункты 1-3.
СОДЕРЖАНИЕ ОТЧЕТА
1. Наименование и цель работы.
2. Матрицы для двух видов описания QRS комплекса, соответствующие им целевые матрицы и обученные нейронные сети.
3. Графики ошибки обучения для нейронных сетей.
4. Значение ошибки распознавания, полученную в п.3.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Что такое искусственные нейронные сети. В чем их отличие от биологических нейронных сетей?
2. Нарисуйте модель нейрона МакКаллока- Питса.
3. Каким образом формируется выходной сигнал в модели нейрона МакКаллока- Питса?
4. Чем определяется выбор функции активации?
5. Приведите примеры наиболее часто используемых функций активации.
6. Приведите примеры нейронных сетей прямого распространения.
7. Приведите примеры нейронных сетей с обратными связями.
8. Какие основные типы задач можно решать с помощью нейронных сетей?
9. Какие задачи в общем случае решают многослойные перцептроны?
10. Каким образом можно использовать одиночный нейрон для распознавания образов?
11. В каких случаях линейный дискриминатор является наилучшим?
12. Сколько точек в d-мерном пространстве можно разделить гиперплоскостью произвольным образом?
13. Как связаны число нейронов в скрытом слое и число классифицируемых точек в d-мерном пространстве?
14. Как зависит точность аппроксимации от числа нейронов скрытого слоя?
15. В чем заключается обучение перцептрона?
16. В чем заключается алгоритм back-propagation?
17. В каком случае достигается минимум ошибки обобщения нейронной сети?
18. Как оценить сложность обучения нейронной сети?
СПИСОК ЛИТЕРАТУРЫ
Учебное издание
© 2014-2022 — Студопедия.Нет — Информационный студенческий ресурс. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав (0.009)
Читайте также: