CNTK - Создание первой нейронной сети
В этой главе подробно рассматривается создание нейронной сети в CNTK.
Постройте сетевую структуру
Чтобы применить концепции CNTK для создания нашей первой NN, мы собираемся использовать NN для классификации видов цветков ириса на основе физических свойств ширины и длины чашелистиков, а также ширины и длины лепестков. Набор данных, который мы будем использовать, набор данных ириса, который описывает физические свойства различных сортов цветов ириса -
- Длина чашелистики
- Ширина чашелистника
- Длина лепестка
- Ширина лепестка
- Сорт, т. Е. Iris setosa или iris versicolor, или iris virginica.
Здесь мы будем строить обычную NN, называемую NN прямого распространения. Давайте посмотрим на шаги реализации для построения структуры NN -
Step 1 - Во-первых, мы импортируем необходимые компоненты, такие как типы наших слоев, функции активации и функцию, которая позволяет нам определять входную переменную для нашей NN из библиотеки CNTK.
from cntk import default_options, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import log_softmax, relu
Step 2- После этого мы создадим нашу модель, используя последовательную функцию. После создания мы будем кормить его нужными слоями. Здесь мы собираемся создать два отдельных слоя в нашей сети; один с четырьмя нейронами и другой с тремя нейронами.
model = Sequential([Dense(4, activation=relu), Dense(3, activation=log_sogtmax)])
Step 3- Наконец, чтобы скомпилировать NN, мы привяжем сеть к входной переменной. Он имеет входной слой с четырьмя нейронами и выходной слой с тремя нейронами.
feature= input_variable(4)
z = model(feature)
Применение функции активации
Существует множество функций активации на выбор, и выбор правильной функции активации определенно будет иметь большое значение для того, насколько хорошо будет работать наша модель глубокого обучения.
На выходном слое
Выбор activation функция на уровне вывода будет зависеть от типа проблемы, которую мы собираемся решить с помощью нашей модели.
Для задачи регрессии мы должны использовать linear activation function на выходном слое.
Для задачи двоичной классификации мы должны использовать sigmoid activation function на выходном слое.
Для задачи классификации на несколько классов мы должны использовать softmax activation function на выходном слое.
Здесь мы собираемся построить модель для прогнозирования одного из трех классов. Значит, нам нужно использоватьsoftmax activation function на выходном слое.
На скрытом слое
Выбор activation Функция на скрытом уровне требует некоторых экспериментов для мониторинга производительности, чтобы увидеть, какая функция активации работает хорошо.
В задаче классификации нам необходимо предсказать вероятность принадлежности выборки к определенному классу. Вот почему нам нуженactivation functionчто дает нам вероятностные значения. Чтобы достичь этой цели,sigmoid activation function может нам помочь.
Одна из основных проблем, связанных с сигмовидной функцией, - проблема исчезающего градиента. Чтобы преодолеть такую проблему, мы можем использоватьReLU activation function который сводит все отрицательные значения к нулю и работает как сквозной фильтр для положительных значений.
Выбор функции потерь
Как только у нас есть структура для нашей модели NN, мы должны ее оптимизировать. Для оптимизации нам понадобитсяloss function. в отличиеactivation functions, у нас гораздо меньше функций потерь на выбор. Однако выбор функции потерь будет зависеть от типа проблемы, которую мы собираемся решить с помощью нашей модели.
Например, в задаче классификации мы должны использовать функцию потерь, которая может измерять разницу между предсказанным классом и фактическим классом.
функция потерь
Для проблемы классификации мы собираемся решить с нашей моделью NN, categorical cross entropyфункция потерь - лучший кандидат. В CNTK это реализовано какcross_entropy_with_softmax который можно импортировать из cntk.losses пакет, как показано ниже:
label= input_variable(3)
loss = cross_entropy_with_softmax(z, label)
Метрики
Имея структуру для нашей модели NN и применяемую функцию потерь, у нас есть все ингредиенты, чтобы начать создавать рецепт для оптимизации нашей модели глубокого обучения. Но прежде чем углубляться в это, мы должны узнать о показателях.
cntk.metrics
CNTK имеет пакет с именем cntk.metricsиз которого мы можем импортировать метрики, которые собираемся использовать. При построении модели классификации мы будем использоватьclassification_error матрица, которая даст число от 0 до 1. Число от 0 до 1 указывает процент правильно предсказанных выборок -
Во-первых, нам нужно импортировать метрику из cntk.metrics пакет -
from cntk.metrics import classification_error
error_rate = classification_error(z, label)
Вышеупомянутой функции на самом деле нужен вывод NN и ожидаемая метка в качестве ввода.