В этой части мы используем функции, которые мы реализовали в предыдущих частях, чтобы построить глубокую сеть и применить ее к классификации кошек и собак.

Глубокая нейронная сеть для классификации изображений:

В этом руководстве будут использоваться функции, которые мы реализовали в предыдущих частях, для создания глубокой нейронной сети и применения ее к классификации кошек и собак. Надеюсь, мы увидим повышение точности по сравнению с нашей предыдущей реализацией логистической регрессии. После этой части мы создадим и применим глубокую нейронную сеть для контролируемого обучения, используя только библиотеку NumPy.

Давайте сначала импортируем все пакеты, которые нам понадобятся в этой части. Мы будем использовать тот же набор данных Кошка против собаки, что и в учебнике Логистическая регрессия как нейронная сеть. Модель, которую мы построили, имела 60-процентную точность при классификации изображений кошек и собак. Надеюсь, наша новая модель будет работать лучше!

Я импортирую код, который мы уже написали, из серии руководств Логистическая регрессия:

Глубокая нейронная сеть L-уровня:

Глубокую нейронную сеть сложно представить в виде фигуры. Однако вот упрощенное представление сети:

Модель можно резюмировать следующим образом: [LINEAR -> RELU] × (L-1) -> LINEAR -> SIGMOID. Подробная архитектура приведенного выше рисунка:

  • Входные данные представляют собой (64,64,3) изображение, сглаженное до вектора размера (12288,1);
  • Соответствующий вектор:

  • затем умножается на весовую матрицу W[1], а затем добавляется точка пересечения b[1]. Результат называется линейной единицей;
  • Далее вы берете ReLu линейной единицы. Этот процесс может повторяться несколько раз для каждого (W[l], b[l]) в зависимости от архитектуры модели;
  • Наконец, вы берете сигмовидную последнюю линейную единицу. Если он больше 0,5, вы классифицируете его как кошку.

Общая методология:

Как обычно, мы будем следовать методологии глубокого обучения для построения модели:

1. Инициализировать параметры/Определить гиперпараметры.
2. Цикл для num_iterations:

  • прямое распространение;
  • Вычислить функцию стоимости;
  • обратное распространение;
  • Обновить параметры (используя параметры и градации из backprop).

3. Используйте обученные параметры для прогнозирования меток.

Нейронная сеть L-уровня:

Мы будем использовать вспомогательные функции, которые мы реализовали ранее, чтобы построить нейронную сеть L-уровня со следующей структурой: [LINEAR -> RELU]×(L-1) -> LINEAR -> SIGMOID.

Аргументы:

X — данные, массив NumPy формы (количество примеров, ROWS * COLS * CHANNELS );
Y — истинный вектор «меток» (содержащий 0, если кошка, 1, если собака), формы (1, количество примеров) );
layers_dims — список, содержащий входной размер и размер каждого слоя, длиной (количество слоев + 1);
learning_rate — скорость обучения правила обновления градиентного спуска;
num_iterations — количество итераций цикла оптимизации;
print_cost — если True, печатает стоимость каждые 100 шагов.

Возврат:

Параметры — параметры, полученные моделью. Затем их можно использовать для прогнозирования.

Функция прогнозирования:

Перед обучением нашей модели нам нужно написать функцию прогнозирования, которая будет использоваться для прогнозирования результатов нейронной сети L-слоя:

Аргументы:

X — набор данных примеров, которые вы хотите пометить.
Параметры — параметры обученной модели.

Возврат:

p — прогнозы для данного набора данных X.

Теперь мы готовы обучить нашу модель глубоких нейронных сетей. Таким образом, мы можем запустить ячейку ниже, чтобы обучить нашу модель. Стоимость должна уменьшаться с каждой итерацией. В моем случае, с 6000 изображений, моему процессору может потребоваться больше дня для выполнения 10000 итераций. Вот код:

Мои обновленные результаты дрессировки кошек против собак:

А вот график стоимости обучения:

Судя по точности нашего теста, вы можете видеть, что он почти не лучше в классификации кошек по сравнению с собаками. Это потому, что простые нейронные сети не могут делать это очень хорошо. Нам нужно использовать сверточные нейронные сети, чтобы получить лучшие результаты (используя их в будущих руководствах).

Мы проверим наш код глубокой нейронной сети с помощью приведенного ниже кода. Итак, есть две функции: для создания данных, которые мы будем использовать для обучения нашей модели. Другая функция будет использоваться для построения границы решения на нашем графике, которая была предсказана нашей нейронной сетью; не углубляясь в эти функции, вот они:

Давайте визуализируем наши тренировочные данные с помощью следующей строки:

Давайте построим наши тренировочные данные:

Сначала попробуем использовать нейросеть с одним скрытым слоем, где вход 2, 4 скрытых слоя и выход равен 1:

С 15000 итераций и скоростью обучения 0,2 мы получили точность 61%:

А вот и график классификации:

Выглядит не очень красиво, поэтому давайте попробуем те же 15000 итераций и скорость обучения 0,2 с 10 скрытыми слоями:

Теперь мы получили точность 73%. Это мило; давайте построим наш результат:

А теперь давайте проверим нашу тяжелую работу и попробуем более глубокую сеть с layer_dims = [2, 128, 4, 1].

Теперь мы получили точность 74%. Это хорошо, но, как видите, добиться лучших результатов становится все труднее. Давайте построим наш результат:

Вывод:

Поздравляю! Кажется, что наша глубокая нейронная сеть имеет лучшую производительность (74%), чем наша двухслойная нейронная сеть (73%) на том же наборе данных. Это вполне хорошие показатели для этой задачи. Хорошая работа!

Это был довольно длинный урок. Теперь, когда мы знаем, как создавать глубокие нейронные сети, мы можем научиться их оптимизировать. В следующих уроках мы узнаем, как добиться еще более высокой точности путем систематического поиска лучших гиперпараметров (learning_rate, Layers_Dims, num_iterations и других). Увидимся в следующем уроке.

Полный код руководства и набор данных изображений кошек и собак можно найти на моей странице GitHub.

Первоначально опубликовано на https://pylessons.com/Deep-neural-networks-part5

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.