Рубрики
Без рубрики

Демистификация градиентного происхождения и обратная обработка через изображение на основе логистической регрессии …

Автор оригинала: FreeCodeCapm Team.

Сачин Малхотра

Что все шумит о глубокой обучении и что такое нейронная сеть в любом случае?

По сути,

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

Если вам понравилась статья, распространите немного любви и поделитесь ее максимально возможной. Это все на сегодня люди. Надеюсь, у вас было веселое время, читая это. Вспомогательный

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

Если вы кто-то с абсолютно нулевым знанием о любом из этого материала, и все условия, упомянутые до того, как вам кажется греком, не раздражен. Потому что к концу этой статьи я уверен, что вы будете в состоянии тренировать его, тестируйте его, сделать его плотнее и, следовательно, умнее.

Давайте начнем сейчас, будем ли мы?

Оглавление

Старый алгоритм обучения машины

Давайте начнем с очень краткими (хорошо, слишком краткими) введением к тому, что один из старейших алгоритмов в машинном обучении по существу делает.

Возьмите несколько баллов на 2D график и нарисуйте линию, которая вписывается их как можно также. То, что вы только что сделали, обобщена из нескольких примеров пар входных значений (X) и выходов (y) в общей функции, которая может отображать любое входное значение в выходное значение.

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

И вот почему такая техника замечательно: существует бесчисленное количество функций в реальном мире, для которого нахождение уравнений – очень сложная задача, но собирание палей ввода-вывода является относительно простым задачей для выполнения, например, сопоставление функций Ввод записанного звука произнесенного слова к выходу то, что такое устное слово. [Источник]

Однако, как мы все знаем, мы можем иметь данные, которые не линейно отделяются. Точки данных могут быть слишком рассеяны, что мы не можем иметь линейную функцию, чтобы приблизиться к отображению заданных значений X к данным значения Y. Алгоритм линейного регрессии очень подходит для достижения прогнозирования цен на доме, учитывая набор ручной работы. Но он не сможет соответствовать данным, которые могут быть аппроксимированы только нелинейной функцией.

Что если утверждение проблемы состоит из Классификация изображений ? Скажем, нам дают изображение в качестве ввода, и мы хотим, чтобы наша модель выводила, если данное изображение – это кошка или собака.

Как мы идем о решении этой проблемы?

Давайте начнем с самого основного шага, который является то, что Подготовка набора данных для нашей модели Отказ Мы объясним работу модели позже в статье.

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

Подготовка данных

Набор данных, на котором мы смотрим в этой задаче, это Cats V/S Divers Binary Task, доступная на Kaggle Отказ Предполагая, что вы загрузили набор данных, давайте загрузим набор данных в память и посмотрите на несколько изображений, доступных в наборе данных.

Данные доступны в виде zip-файлов и после расстегивания, у вас должны быть две разные папки. Один для Поезд а другой для Тест Отказ Тест Данные не будут использоваться по всей статье, потому что мы сделали с самим набором данных поезда. Поезд Папка имеет около 25000 изображений, и мы разделили их в меньшее Поезд DataSet с 2000 изображений и еще один, который будет сервером как наш набор валидации, содержащий 5000 изображений.

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

cat..jpg or dog..jpg

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

Изображения как представления матрицы

Как обсуждалось ранее, при обучении нашей модели у нас будет определенное изображение, подаваемое в модель, и модель предоставит нам прогноз от того, следует ли оно думает, что изображение – это кошка или собака. Модель может быть или не может быть правильной, и если она не будет, то мы должны «тренировать» это так, чтобы она стала лучше на классификации кота и собачьих изображений.

Компьютер хранит данные изображения в виде M-BY-N-BY-3 Массив данных, определяющий красные, зеленые и синие цветные компоненты для каждого отдельного пикселя. Итак, если мы посмотрим на данные изображения в виде многомерного матрицы, у нас есть 3D-матрица с размерами (M, N, 3) И каждое значение будет целочисленное значение в диапазоне 0-255, где 0 обозначает черно-1 подставки для белых, а остальные значения составляют разные оттенки цветовых компонентов.

Imagio Является ли библиотека Python, которая обеспечивает легкий интерфейс для чтения и записи широкого спектра данных изображения, включая анимированные изображения, видео, объемные данные и научные форматы.

Numpy Научно-вычислительный пакет в Python и является одним из самых фундаментальных библиотек в Python, чтобы манипулировать и эффективно работать с высокомерными массивами. Для подробного грунтовки на Numpy и как мы манипулируем данные изображения, прочитайте это Отказ

Я настоятельно рекомендую пройти через Numpy Tutorial, упомянутый выше. Программирование модели, которую мы обсудим заранее, выполняются в основном в Numpy, и основное понимание операций в Numpy чрезвычайно важно.

Изменение размера изображений

Двигаясь, давайте посмотрим на то, что похоже на массив Nampy для некоторых из этих изображений. Какова размерность некоторых из этих массивов.

Мы случайным образом выбираем некоторые изображения из списка rain_data Что мы создали, и мы распечатаем форму I.e. Размеры navypy массивов, представляющих это изображение.

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

Нам нужны изображения, одинаковые размеры, прежде чем кормить их в нашу модель.

Если вы смутно осведомлены о любом из моделей машинного обучения или глубоких учебных моделей, вы, должно быть, слышали о чем-то известном как Параметры модели.

Параметры – это то, что носит суть информации, изученной нашими моделями, и количество параметров для модели должна быть исправлена, прежде чем мы начнем обучение модели.

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

Не волнуйтесь, если у вас нет представления о том, что эти Параметры на самом деле есть. Мы доберемся до них достаточно скоро.

На данный момент важно то, что Нам нужны все изображения для того же размера для нашей модели, чтобы обработать их.

Давайте посмотрим, сколько изображений размеры размеры больше, чем 64-BY-64 Высота и ширина.

Как мы можем четко видеть, 99% изображений имеют размеры больше, чем 64-BY-64 И, следовательно, мы можем сломать их до размера 64-BY-64-BY-3 Отказ

Этот подход – это просто наивный подход, который я принял, чтобы сделать все изображения того же размера, и я почувствовал, что внизу не будет ухудшать качество изображения столько же, сколько выяснение, потому что выясните очень маленькое изображение до большого в основном ведущих к пикселированным эффектам и сделает обучение для модели более жесткой. Кроме того, это измерение 64-BY-64-BY-3 не волшебный номер, просто то, с кем я пошел.

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

Давайте перейдем и посмотрим на код, который бы изменил бы все эти изображения, а также разделите данные в Поезд и Тест наборы. Мы разделим данные данные с использованием Split 80/20, то есть 80% данных будут использоваться для обучения наших данных, и остальные 20% будут использоваться для тестирования модели, чтобы увидеть конечную производительность в невидимых данных.

Для размера изображений мы использовали scipy.misc.imresize метод. Этот метод скоро будет устарел, поэтому лучше проверить некоторые другие Варианты Для размера изображений, а не полагаться на это для ваших будущих приключений.

Причина, что внутренняя работа scipy.misc.imresize Не предусмотрено здесь, потому что он не имеет отношения к объему этой статьи.

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

Сохранение данных

Теперь, когда мы обработали наши данные и имеем его в формате, который нам нужен, мы можем наконец сохранить его в два отдельных файла, а именно rain.npz и Valid.npz Отказ

Размер файла rain.npz 1,8 г и что из Valid.npz 469 м. Эти файлы содержат Numpy массивы, которые мы создали ранее, для представления наших тренировок и испытаний, соответственно.

Примечание, в этом наборе данных мы не используем никаких модных архитектур глубокой обучения. Мы также экспериментируем и показываем силу одного нейрона.

В результате у нас нет обширного списка гипер-параметров для настройки, и, следовательно, мы не разделили исходные данные в поезд, разработку и тест. Мы просто хватали с помощью тренировочного набора и разработчиком DEV (или набором проверки или тестовым набором, насколько связано с этой статьей.) Итак, мы используем срок проверки данных или тестовые данные взаимозаменяемых в этой статье.

ПРИМЕЧАНИЕ. Цель данных обучения данных, разработчика или данные проверки и тестовые данные сильно отличаются друг от друга. Все трое из них чрезвычайно важны

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

У нас здесь нет таких требований. И, следовательно, нет отдельной тестовой установки.

Посмотрите на ноутбук Jupyter, который приносит все, что мы обсуждали вместе для вас, чтобы увидеть.

Сказать привет нейрону

Теперь, когда мы предварительно получили наши данные, и у нас есть его в формате, что наша модель бинарной классификации сможет понять, позволить нам представить основной компонент нашей модели: Neuron!

Нейрон является основным вычислительным элементом нашей модели классификации. По сути, нейрон выполняет что-то известное как Распространение вперед на входных данных.

Давайте посмотрим, что это значит.

Передние пропаганды

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

Если вы следите за шагом приготовления данных, вы знаете, что у нас есть вокруг 12288 Особенности во всем, что представляют одно изображение.

Если вы не уверены, как мы пришли на это число, не волнуйтесь, мы придем к этому позже.

Подсказка: Его 64 * 64 * 3?

Прежде чем мы продолжим, давайте посмотрим на обозначения, которые мы будем следить за этой статьей

  • Маленький курсивый алфавит представляет собой скалярное значение
  • Маленький жирный нетиратный алфавит представляет вектор I.e. Либо матрица строки 1-by-m или колонна матрицы M-BY-1 Отказ
  • Капитальные курсивные алфавиты будут представлять матрицы данного измерения, говорят M-BY-N Отказ

Пусть х Обозначим одну функцию, которая представляет наше входное изображение.

Теперь, как первый шаг к этому процессу, называемой вперед распространением,

Не бойся тем, что это Линейное преобразование средства. Это, по сути означает, что у нас есть что-то форму, представленную диаграммой ниже.

Итак, учитывая функцию ввода х, Нейрон дает нам следующий вывод:

Wx + b

Обратите внимание на использование обозначений на диаграмме и в разделе кода выше. Итак, х представляет собой скалярное значение, W представляет матрицу, а B представляет вектор.

Матрица W называется Вес Матрица и вектор B известен как предвзятость вектор.

Помните, когда мы обращались к параметрам модели ранее? Ну, матрица веса и вектор смещения будут представлять параметры нашей модели в этом сценарии.

Примечание: что хотя мы имеем в виду W Как наш вес “матрица” и B Как наша смещение «вектор», в приведенном выше сценарии, так как у нас есть только одна функция ввода, нам нужно только 1-BY-1 Матрица для W и скалярное значение для B Отказ

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

WX +.233, что сейчас?

Это просто случайное значение от верхней части моей головы. Точка, которую я пытаюсь сделать здесь, что мы должны делать с этим трансформированным значением сейчас?

Помните, наша конечная цель – тренировать модель, которая сможет дифференцироваться между собакой и кошкой.

Поскольку это задача двоичного классификации (всего 2 класса для модели для выбора), нам нужно иметь свой порог, скажем, Θ Отказ Когда нейрон генерирует значение выше Θ Он выводит один из классов, в противном случае его выход будет второй класс.

На самом деле трудно получить диапазон ценностей, которые дадут линейное преобразование. Значение может быть чем-то в диапазоне -инф к + инфы Отказ Все это зависит от диапазона значений. Функция (ов) входных данных может принимать и насколько и инициализирован вес и смещение.

Итак, нам определенно нужно исправить диапазон выходных значений нейроном.

Как мы это делаем?

Применяя то, что известно как активация Функция на линейный выход нейрона.

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

Примечание: Функция активации делает намного больше, чем просто закрепление выходных значений нейрона, но опять же, для объема этой статьи, зная, что это больше, чем достаточно.

Функция активации, которую мы рассмотрим здесь, известны как сигмовидная функция.

А вот график сигмовидной функции.

Как мы можем видеть с графика выше, функция активации Sigmoid применяет то, что известно как Нелинейное преобразование На входное значение и диапазон сигмовидной функции представляет собой набор реальных значений между [0, 1].

Таким образом, нейрон в целом в целом существенно выполняет две операции в составе процесса распространения вперед.

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

Но ждать. Вы сказали, что каждое изображение имеет 12288 функций?

Мы объяснили расчеты выше, предполагая, что входное изображение будет представлено одним значением функции.

То есть, однако, не тот случай, с которым мы имеем дело. Помните, что мы проходили через все шаг подготовки данных, прежде чем мы начали с пропаганды вперед, и мы повторно пересматривали наши изображения 64-BY-64-BY-3 ?

Это означает, что наше обрабатываемое изображение существенно состоит из 12288 пиксели во всем.

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

Это означает, что у нас есть 12288 Функции ввода на изображение для нашей модели. Теперь давайте увидим изменения, которые вносятся в размеры параметров нашей модели, то есть вес и смещение.

Давайте представляем количество входных функций нашего изображения по NX Отказ Для изображений мы будем рассматривать здесь, количество функций ввода будет 12288.

Итак, мы кормием во все эти входные функции для данного изображения на нашему нейрону, он делает линейное преобразование на каждой из функций, сочетает в себе результат, чтобы дать скалярное значение, затем применяет трансформацию сигмоида по значению, чтобы наконец дать нам . Y ^ I.e. Класс этого изображения принадлежит.

Примечание. Модель просто выводит реальное значение от 0 до 1.

Интерпретация заключается в том, что если значение is> 0,5, это собака/кошка (какой-либо, как вы хотите рассмотреть) и для всех других ценностей, ее другая CLA SS.

Мы можем либо представлять функции ввода как Столбец Вектор или ряд вектор Отказ Итак, мы можем иметь вектор формы 12288-BY-1) или 1-BY-12288 Отказ Давайте рассмотрим прежнюю точку I.e. У нас будет вектор столбца.

Мы доберемся до кодировки в следующем разделе. Это не огромная задача для преобразования 64-BY-64-BY-3 Изображение пиксельные значения для 12288-BY-1 Отказ

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

Аналогичным образом, мы будем нуждаться в веса для каждый из входных функций. Нам не нужно отдельное значение смещения для каждой из функций. Здесь хватило одно значение I.e. Здесь хватило скалярное значение.

Линейное преобразование теперь становится:

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

Следующий шаг остается прежним: мы применим функцию активации Sigmoid на z И мы получаем реальное значение от 0 до 1 (помните, что это диапазон функции сигмоиды).

Выполнение!

Это веселая часть. ?

Мы пойдем об этом на несколько шагов. Так же, как наша финальная ноутбука Jupyter будет структурирована.

Получение данных

Помните, что мы сохранили наши данные после предварительной обработки в двух файлах, а именно rain.npz и Valid.npz ? Мы будем загружать наши данные из них и вернуть 4 различных массива Numpy.

  1. rain_x_original Представляет наш тренировочный набор изображений в их оригинальных размерах.
  2. Train_y Содержит соответствующие метки для каждого изображения. Просто чтобы напомнить вам, а 1 представляет кошку и 0 представляет собаку.
  3. valid_x_original такой же, как rain_x_original За исключением того, что он содержит набор данных проверки I.e. Набор данных, на котором мы оценим производительность нашей модели.
  4. valid_y Являются ли этикетки для проверки набора изображений.

Теперь у нас все настольная подготовка и набор валидации загружены в память. Как мы обсуждали ранее, мы хотим преобразовать все функции данного изображения в вектор столбца или вектор строки. Итак, для каждого изображения мы хотим либо 12288-BY-1 Вектор или 1-BY-12288 вектор. Давайте посмотрим на то, как мы можем сделать это с наших оригинальных изображений размеров 64-BY-64-BY-3 Отказ

Изображение выравнивается

Это довольно простая задача в Numpy. Учитывая образ размерности 64-BY-64-BY-3 Мы просто хотим изменить его форму на 12288-BY-1 или 1-BY-12288 Отказ

С тех пор у нас есть целая куча изображений, это было бы либо 12288-by-m или M-BY-12288 где м Представляет общее количество изображений, которые мы будем кормить нашу модель I.e. Количество примеров тренировок.

Давайте посмотрим на код для этого преобразования.

Таким образом, мы определили функцию, называемую как Image2Vec Что по существу принимает на весь наш набор данных в своем первоначальном измерении I.E. 20000-BY-64-BY-64-BY-3 Для учебного набора и 5000-BY-64-BY-64-BY-3 Для установки проверки и возвращает сплющенные матрицы.

Вы заметили эти строки кода?

# Normalize our datasettrain_x /= 255.valid_x /= 255.

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

Возвращаясь к нашей результирующей матрице, это 2D-один, и первый индекс теперь является количеством функций в каждом из наших изображений I.E. 12288 и второй индекс представляет количество образцов в этом наборе данных 20000 На учебном наборе и 5000 В наборе проверки.

Вы можете спросить, почему этот специфический способ устранить наши данные. Почему мы не пошли на транспонированные версии I.e. M-BY-12288 где м представляет количество образцов в наборе данных.

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

Визуально, окончательная сплющенная матрица выглядит так

Функция активации сигмовидной активации

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

Для вашей ссылки еще раз, вот как выглядит сигмовидная функция.

Как объяснено раньше и как можно увидеть на рисунке выше,

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

Рассмотрим следующие изображения кошек.

Как мы видели раньше, мы должны изменить размер наших изображений, чтобы привести их к фиксированному размеру. Итак, давайте посмотрим на обои эти изображения после размера их на 64-BY-64-BY-3 Отказ

Каждое изображение по существу является 3D-матрица, состоящая из значений RGB различных интенсивностей и по сути, они представляют цвета для данного изображения.

Значения пикселей (будь то для R, G или B) варьируются от 0-255 где 0 представляет полный черный и 255 для белого. Между существуют миллионы цветовых комбинаций.

Давайте посмотрим на некоторые значения пикселей для каждого из этих изображений.

[137, 109, 70, 144, 117, 74, 154, 126, 79, 160, 132, 85, 165, 137, 90, 167, 139, 92, 178, 150, 103, 186, 159, 112, 194, 170, 126, 204, 182, 143, 210, 187, 153, 212, 188, 150, 213, 185, 138, 214, 178, 121, 213, 170, 100, 212, 164, 85, 213, 158, 73, 212, 155, 65, 215, 159, 72, 215, 161, 75, 217, 162, 80, 216, 165, 82, 214, 166, 84, 212, 166, 84, 221, 187, 124, 226, 205, 160, 232, 212, 175, 236, 216, 179, 242, 220, 183, 242, 219, 177, 243, 215, 167, 243, 213, 162, 242, 213, 163, 240]

Это 100 последовательных значений пикселей для цветного изображения. Вопросы вот ценность каждого из этих пикселей. Значения довольно высоки, так как можно ожидать от цветного изображения в качестве коричневого (ISH) кота, показанного выше.

[37, 37, 37, 37, 37, 37, 29, 29, 29, 35, 35, 35, 39, 39, 39, 36, 36, 36, 38, 38, 38, 88, 88, 88, 43, 43, 43, 34, 34, 34, 33, 33, 33, 52, 52, 52, 48, 48, 48, 40, 40, 40, 33, 33, 33, 33, 33, 33, 39, 39, 39, 52, 52, 52, 36, 36, 36, 34, 34, 34, 46, 46, 46, 31, 31, 31, 34, 34, 34, 33, 33, 33, 35, 35, 35, 34, 34, 34, 26, 26, 26, 32, 32, 32, 25, 25, 25, 29, 29, 29, 23, 23, 23, 44, 44, 44, 43, 43, 43, 20]

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

Причина просмотра в том, что черно-белые значения пикселей являются теми, что вблизи 0 и, естественно, они меньше по сравнению с цветными значениями, которые находятся вблизи 255 точков.

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

Для того же веса матрицы W и смещение вектор B Мы получим чрезвычайно высокие значения для особенностей цветного изображения по сравнению с черно-белым изображением, верно?

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

Таким образом, естественно, сигмовидная активация для цветного кота почти всегда будет в конечном итоге 0.

Как мы решаем эту проблему, которую можно задать?

Мы Нормализовать.

# Normalize our datasettrain_x /= 255.valid_x /= 255.

Это принесет все функции ввода в диапазоне [0,1] И, следовательно, все эти ценности, будь то цветные изображения или черно-белые изображения, будут иметь общий диапазон. Мы называем этот процесс нормализации функций изображения.

Теперь, когда у нас есть все наши данные, обработанные и загруженные в память, единственное, что остается нашей сети I.e. Тот, кто работает на нашем единственном нейроне. Теперь мы будем кормить все эти изображения к нашей модели итеративно, и модель в конечном итоге узнает (с какой-то точностью) классифицировать изображения как собаки или кошек.

Просто чтобы обобщить то, что мы все мы сделали до сих пор:

  • Процесс набор данных изображений, доступных нам, и мы конвертировали .jpg Изображения для Numpy массивы, которые наша модель сможет обрабатывать.
  • Затем мы загрузили два файла rain.npz и Valid.npz в память и мы сплющили изображения, чтобы у нас есть 12288-BY-1 вместо 64-BY-64-BY-3 изображений. Мы по существу привели все функции для изображения в одном столбце.
  • Мы определили нашу функцию активации сигмоидной активации и, наконец,
  • Мы обсудили, почему нормализация данных является необходимым шагом.

Теперь мы готовы перейти к развитию нашей модели.

Кормление сети?

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

Одно изображение

Как обсуждалось ранее, каждое изображение теперь имеет размер 12288-BY-1 И когда мы ссылаемся на слово «изображение», то, что мы действительно имеем в виду, это особенности этого изображения, которые были спрванены и были нормализованы.

Для линейной преобразования нам нужно иметь матрицу веса и вектор смещения. Мы знаем, что модель в конечном итоге даст нам одно значение между 0 и 1 i.e. После применения функции активации SIGMoid и, следовательно, смещение просто скалярное.

По сути, нам нужна эта операция:

Это то, что известно как Adamard Product Или элемент мудрый продукт двух векторов, а затем мы делаем суммирование всех этих ценностей.

Вместо этого мы можем использовать Точечный продукт матрицы веса и объект вектор Отказ

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

Мы можем либо определить матрицу веса в качестве вектора строки и использовать уравнение

W . x + b

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

transpose(W) . x + b

Здесь мы пойдем со вторым вариантом. Мы считаем матрица веса, чтобы иметь форму 12288-BY-1 для одного изображения. Для целей линейной преобразования мы делаем транспозью матрицы веса, прежде чем делать точечный продукт с вектором объекта.

На данный момент просто знайте, что мы хотим, чтобы значения веса на их образ быть расположены в виде одного столбца, а не строки. Это сделает расчеты в целом легче двигаться вперед.

То же самое касается входных функций. Мы хотим, чтобы они были устроены их в колоннах.

Кормление во всем тренировочном наборе

Мы на самом деле не хотим обрабатывать одно изображение одновременно, как это было бы слишком медленно.

В идеале мы хотим сделать один пропуск вперед по нашей модели (то есть единственный нейрон здесь) и получить прогнозы для всего тренировочного набора. Все за один ход!

Мы можем достичь этого, используя уравнение, которое мы смотрели на ранее:

transpose(W) . X + b

Примечание: Х представляет матрицу, содержащую все наши изображения и х представляет один вектор изображения.

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

Поскольку мы сразу обрабатываем наш наш набор набора данных, мы перешли на капитальный курс Х Отонация, которая изображает весь набор данных и как упомянуто на рисунке выше, это измерение 12288-by-m где каждое изображение состоит из 12288 функций, и есть м Примеры во всем.

Давайте посмотрим на код для этого.

Функция Forward_Propagate Тот делает все тяжелые подъема для нас. Сначала мы получим количество примеров (здесь не используется, но я ставлю его просто чтобы показать, что второе измерение представляет количество примеров).

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

Затем мы применяем функцию активации Sigmoid на результирующей матрице (Vector в этом случае) и получением нелинейности приложенных значений активации от нейрона.

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

Давайте предсказать?

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

Но, прежде чем мы сделаем это, нам нужно иметь какую-то меру, чтобы увидеть, насколько хорошо наша модель на самом деле делает на тестовом наборе.

Давайте посмотрим на код, который рассчитывает тестовую установку точность прогнозов нашей модели. Это основная метрика, которую мы будем использовать на протяжении всей остальной части нашей статьи, чтобы оценить, как выполняется наша модель.

Это код для измерения того, насколько точная наша модель находится в задаче классификации собаки CAT VS (тестовый набор). Оказывается, что нестроена модель – мы случайным образом инициализировали вес и значения смещения – достигают почти на 50% точности. Это ожидается от случайного пробоотборника, потому что это задача классификации 2 класса. Если мы выберем значение из [0,1] случайным образом, в 50% вероятность, что мы получим правильное значение.

Вопрос сейчас возникает, как мы улучшаем нашу модель?

Мы можем улучшить нашу модель алгоритмом, называемым Градиентный спуск. Давайте перейдем вперед и посмотрим, что все это алгоритм, и как это может помочь нам улучшить нашу модель.

Давайте пойдем по склону?

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

Что это Функция стоимости?

Наша модель учится так же хорошо?

Я знаю. Нам нужно сделать шаг назад и сначала пройти эти условия, прежде чем добраться до нашего агоритма градиента. Итак, давайте увидим именно то, что первая функция стоимости.

Выступление нашей модели?

Чтобы оценить, насколько хорошо наша модель делает по заданию классификации, у нас есть метрика точности. Наша конечная цель – значение классификации модели для увеличения.

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

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

Ранее мы видели, что случайный набор весов и значения смещения может достигать 50% точности классификации на тестовом наборе. Это означает, что для улучшения модели много возможностей.

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

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

Рассмотрим математическую функцию, как приведенная ниже:

В исчислении Maxima (или minima) любой функции можно узнать

  • Принимая первый дифференциал заказа функции и приравнивать его к 0. Точка, найденная таким образом, может быть точкой максимальной или минимума.
  • Затем мы подставляем эти значения (точка, которую мы только что нашли) в Дифференциал второго порядка функции и если значение положительное I.e.> 0, то это точка (ы) представляют точку (ы) локальных минимумов Leal Local Maxima.

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

Окончательное значение, которое мы получаем, является реальным значением от 0 до 1, и мы используем это, чтобы сделать прогноз относительно того, является ли изображение для собаки или кота.

Рассмотрим следующие выходные значения по модели на одном и том же изображении время от времени:

0.520.560.610.670.780.800.850.890.98

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

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

Это явно подчеркивает Большая проблема с использованием точности как мера оптимизации для получения оптимальных весов и предвещений модели Отказ

Мы могли бы моделировать функцию, сосредоточенную вокруг точности и максимизации, это была бы наша цель.

Количество изображений правильно классифицировано не гладкая функция весов и смещений в сети. По большей части Делать небольшие изменения в веса и предубеждения не приведут никаких изменений вообще в количестве учебных изображений, классифицированных правильно Отказ

Это затрудняет выяснить, как изменить вес и смещения, чтобы получить улучшенную производительность. Это видно из примера, который мы только что рассмотрели.

Хотя модель становилась более уверенностью, точность никогда не будет отражать это и, следовательно, модель не будет принимать такие улучшения.

Что нам нужно вместо этого мера прокси Это несколько связано с точностью, а также является гладкой функцией весов и смещения.

Введите: функция потери?

Это проблема двоичной классификации. Это означает, что у нас может быть только два класса: 0 или 1.

В идеальном мире наша модель выпускает 0 для собаки и 1 для кота, и в этом случае она достигла бы 100% точности. Вывод 0 для собаки или 1 для кота будет отображаться на 100% процентной доверии модели в его предсказаниях. Это на самом деле не происходит в сценарии реального мира (по крайней мере, еще не!).

Наша неподчетая модель сначала звучала смущена. Это не будет слишком уверенно в его прогнозах. Так что он может выводить значения, такие как 0,51, 0,49, 0,514 и т. Д. Просто потому, что порог пересекается и прогнозирование бывает правильно , не значит, что наша модель хорошо обучена.

Из обсуждения выше, одно очевидно. Нам нужно закрыть на разрыв между выходом модели и фактическим выходом. Меньший пробел, тем лучше наша модель находится в его прогнозах и более уверенности, что она показывает во время прогнозирования.

Это означает, что для изображения собаки мы хотим, мы хотим, чтобы наша модель выводила значения как можно ближе к 0, а также аналогично для изображений CAT мы хотим, чтобы наша модель выводила значения как можно более близко к 1.

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

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

Как вы думаете? Функция потери просто расстояние между y_peded и y_actual ?

|y_actual - y_predicted|

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

Функция потери ниже известна как Функция абсолютной разности потерь

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

J является распространенным обозначением для функции потери и Θ Представляет параметры модели I.e. Вес и предубеждения.

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

Эта функция известна как Ошибка в квадрате Отказ Мы просто приняли разницу между фактическим выходом y и прогнозируемый выход Y ^ И мы добрались до этого значения (отсюда и именем) и разделили его на 2.

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

Чтобы оптимизировать ошибку в квадрате, вы можете просто установить ее производную, равную 0 и решить; Для оптимизации абсолютной ошибки часто требует более сложных методов.

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

  • Квадрат всегда дает положительное значение Так что сумма не будет нулевой. Мы говорим о сумме здесь, потому что мы добавим потерю или значения ошибок для каждого изображения в нашем наборе тренировочных данных, а затем мы в среднемся найти потерю для всей партии примеров тренировок.
  • Квадрат подчеркивает большие различия – функция, которая оказывается хорошей, так и плохой (думать о выбросах эффекта).

Рассмотрим графики абсолютной ошибки и ошибки в квадрате соответственно ниже.

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

Но, если мы посмотрим на параболический граф для квадратной функции, мы видим нижний наконечник, который является минимумом этой функции, и это происходит в ŷ = 0 или 1 в зависимости от того, о котором мы говорим. Но, есть четко определенные минимумы для этой функции и, следовательно, легче оптимизировать.

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

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

Хорошо, тогда. Надеюсь, вы вернулись и готовы продолжать!

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

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

Минимизация функции потерь ⬇️

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

Мы хотим найти значения для наших весов и предвзятость, которые минимизируют значение нашей функции потери. Поскольку это многовидное уравнение, это означает, что мы должны иметь дело с частичными производными функции потери, соответствующей каждой из наших переменных W1, W2 и B Отказ

Это может показаться достаточно простыми, чтобы сделать, потому что у нас просто 3 разных переменных.

Однако, если мы рассмотрим задачу под рукой I.e. Cat V/S Классификация изображений собаки с использованием нашей модели на основе невронной модели, у нас есть 12288 Вес.

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

Забавный факт: Типичная модель глубокой нейронной сети имеет миллионы весов и предвзятости?

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

Если есть один алгоритм, который используется практически на каждой модели обучения машины, это Градиентный спуск Отказ

Это алгоритм, который помогает нашей модели Учить Отказ Без возможностей обучения любая модель обучения машины по сути, по сути, как и модель случайной угадывания.

Это возможности обучения, предоставленной алгоритмом градиента спуска, который делает машинные и глубокие модели обучения так круто.

Целью этого алгоритма является минимизация ценности нашей функции потери (сюрприз удивления!). И мы хотим сделать это эффективным образом.

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

Мясо алгоритма спуска градиента – это процесс доставки до наименьшего значения ошибки. Википедия Имеет отличную аналогию для алгоритма спуска градиента:

Основная интуиция за градиентом спуска может быть проиллюстрирована гипотетическим сценарием.

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

Они могут использовать метод градиентного происхождения, который включает в себя посмотреть на крутущу холма на его текущем положении, затем идущий в направлении с самым крутым спуском (то есть спуск).

Если бы они пытались найти вершину горы (то есть максимума), то они будут действовать в направлении с самым крутым восхождением (то есть в гору в гору). Используя этот метод, они в конечном итоге найдут свой путь.

Однако и предположим также, что крутизна холма не сразу очевидна с простым наблюдением, а скорее требует изощренного инструмента для измерения, который человек происходит на данный момент.

Требуется довольно некоторое время для измерения круты холма с инструментом, поэтому они должны минимизировать их использование инструмента, если они хотят спускаться по горе перед закатом.

Трудность затем выбирает частоту, при которой они должны измерить крутущуюся наступление холма, чтобы не сойти от трека.

В этой аналогии,

  • Человек представляет наш Алгоритм обучения , а также
  • Путь, снятый по горе, представляет Последовательность обновлений параметров что наша модель в конечном итоге исследует.
  • Кратность холма представляет собой Наклон поверхности ошибки в таком случае.
  • Инструмент, используемый для измерения круты, это Дифференциация (Уклон поверхности ошибки можно рассчитать, принимая производную функцию ошибки в квадрате в этой точке). Это приближение, которое мы делаем, когда применяем градиентное происхождение. Мы действительно не знаем минимальную точку, но Мы знаем направление Это приведет нас к минимуму (местным или глобальным), и мы делаем шаг в этом направлении.
  • Направление, которое человек выбирает для перемещения в соответствии с градиентом поверхности ошибки в этой точке.
  • Количество времени, которое они путешествуют, прежде чем предпринять другое измерение, является Норма обучения алгоритма Отказ Это, по сути, насколько большой шаг наша модель (или человек, сходящийся вниз) решает заниматься каждый раз.

Для более глубокого понимания и математики позади алгоритма градиента, я бы порекомендовал пройти:

Градиентный спуск: все, что вам нужно знать Градиентный спуск является наиболее используемым алгоритмом обучения в машинном обучении. Этот пост показывает вам почти все, что вы … Hackernoon.com.

Радиентный спуск всегда находит глобальные минимумы?

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

Функция потери, которую мы определили, известны как Средняя функция потери в квадрате Отказ Функция принимает два параметра: ŷ Какой прогноз модели для данного ввода х а потом у нас есть y который является фактическим ярлыком, соответствующим этому входу.

Очевидно, наша функция – это выпуклая функция в отношении прогнозирования ŷ Отказ

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

Мы можем просто контролировать вес модели и значение смещения I.e. Параметры модели, и они в свою очередь, управляют прогнозированием.

Хотя функция средних квадратных потерь выпуклана относительно прогнозирования модели ŷ Но свойство выпуклости, которое мы действительно заинтересованы в том, что относится к параметрам модели.

Мы хотим, чтобы наша функция потери была гладкой выпуклой функцией весов нашей модели.

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

Все зависит от Шаг размеры, что модель берет, I.e. Уровень обучения, как долго модель обучается, и сумма учебных данных наша модель имеет.

Пусть градиенты текут ✈️

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

α Представляет скорость обучения для нашего алгоритма спуска градиента I.e. Размер шага для спускания по холму. Термин (ы) рядом с α представлять Градиенты функции потерь, соответствующей весам и смещению соответственно.

Вопрос вот, как мы на самом деле рассчитываем эти градиенты?

Давайте посмотрим на наш график вычислений для простой модели, на которой мы работаем до сих пор.

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

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

Не волнуйтесь!

К концу этого раздела вы получите четкое понимание того, какое обратное распространение делает для нас и математика за ним (по крайней мере, для нашей конкретной модели).

Скажем, мы хотели найти частичную производную из переменной y Что касается х на рисунке выше. Мы не можем обнаружить это напрямую, потому что в вычислительном графике участвуют 3 других переменных.

x --> (Some computation) --> AA --> (Some computation) --> BB --> (Some computation) --> CC --> (Some computation) --> y

Итак, мы делаем этот процесс имерным образом собираемся назад В графике вычислений.

Сначала мы узнаем частичное производное вывода y Что касается переменной C Отказ Тогда мы используем Правило цепи исчисления, и мы определяем частичное производное по отношению к переменной B И так далее, пока мы не получим частичное производное, которое мы ищем.

Это все, что есть для обратной передачи.

Очевидно, что на самом деле выяснение производных в графике вычислений – это то, что сложно и пугает большинство людей. Однако у нас есть относительно просто модель здесь в наших руках, и здесь довольно легко выполнить обратное распространение. Итак, без дальнейшего Adieu, давайте начнем с математикой Backprop на нашем графике вычислений.

Шаг 1: DJ/Dŷ

Конечное уравнение для нашей функции потери:

Частичное производное функции потери в отношении активации нашей модели ŷ является:

Это было довольно легко!

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

Шаг 2: DJ/DA

Это точка, когда мы применяем правило цепочки, которое мы упомянули ранее. Таким образом, для расчета частичного производного функции потерь относительно линейного преобразованного вывода I.e. Выход нашей модели до Применение сигмовидной активации.

Первая часть этого уравнения – это значение, которое мы рассчитали на шаге 1. Мы можем просто использовать это здесь.

Основная вещь для расчета здесь является частичное производное прогнозирования нашей модели в отношении линейно преобразованного выхода, также известного как логит

Давайте посмотрим на уравнение для прогнозирования нашей модели с точки зрения логита.

Мы просто написали формулу для функции активации Sigmoid.

Производное окончательного выпуска нашей модели W.r.t Логит просто означает частичное производное сигмоидной функции в отношении его ввода. Давайте посмотрим на вывод производной?

Это совсем немного математики. Но это просто базовый дифференциальный исчисление здесь.

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

Движение дальше, мы можем еще больше упростить это уравнение.

Подставляя это значение в нашем более раннем уравнении, мы получаем:

Фу! Это было много математики, верно?

Но мы еще не сделаны. Есть еще один шаг, чтобы пойти в этот алгоритм обратной обработки.

Нам нужно найти частичные производные относительно весов и предвзятости еще.

Давайте перейдем и посмотрим, как мы можем сделать это.

Шаг 3: DJ/DW и DJ/DB

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

Мы покажем вывод для весов и оставьте часть смещения для вас.

Давайте код! ?

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

  • Термин dy_hat представляет собой частичное производное нашей функции потери в отношении окончательного выпускаемого значения ŷ и как показано в предыдущем разделе, это значение является A - Y Отказ
  • Тогда у нас есть Д.А. который является частичным производным относительно линейно преобразованного выхода, А Отказ
  • Следующий термин это DW И мы видим, что мы сделали Matrix умножение здесь, чтобы получить это значение. Мы делимся по м получить средний градиент по всему учебному набору. Это стандартно. Но почему мы сделали Matrix умножение здесь?

На последнем рисунке предыдущего раздела мы видим, что DJ/DW/DA * X Отказ

Давайте приблизимся к размерам двух величин, связанных здесь. Наша матрица Х будет 12288-by-m где каждое изображение имеет 12288 Особенности и у нас есть м Образцы тренировок.

Размеры количества DJ/DA будет такой же, как А И это ничего, кроме единой реальной ценности на тренинге образец I.E. 1-by-m Отказ

Кроме того, размерность количества DJ/DW должен быть таким же, как W Потому что в конечном итоге мы должны вычесть градиенты из исходных весовых значений. Таким образом, два матрица должны иметь одинаковые размеры.

Матрица W имеет размер 12288-BY-1 Отказ Итак, нам нужно DJ/DW быть 12288-BY-1 также. Для этого произойдет:

Надеюсь, это проясняет, почему мы написали код как np.matmul (x, dz.t) перед приемом среднего.

Позвольте нам принести все это вместе в единую комплексную функцию, которая делает следующие вещи:

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

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

Это главная функция, которая существенно делает тот же процесс, но несколько раз.

Раскрытие модели несколько раз на набор данных, и модель учится что-то новое каждый раз.

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

Наконец, мы находимся на сцене, где мы можем тренировать нашу модель и посмотреть, насколько единственный нейрон может на самом деле учиться насколько наша задача классификации изображений CATS VS.

Это означает, что на Невидимое валидация/тестовый набор, Наша модель способна предсказать, является ли изображение кота или собаки с точностью до 61%. Это круто, если вы спросите меня, потому что мы смогли достичь повышения 10% на случайном догадере, просто используя Одиночный нейрон.

Просто для удовольствия я построил потери обучения и проверки для подготовки модели для всех 5000 эпох.

Потери обучения и валидации плавно уменьшаются со временем.

Одна окончательная вещь, прежде чем я оставлю вас играть с кодом. Давайте предоставляем пользовательское изображение нашей модели, изображение не является частью нашего набора данных и не посмотрим, может ли он правильно предсказать, если изображение является кошкой или собакой.

Вуаля! Это правильно. Действительно, это кот.

Для полного кода проверьте:

Edorado93/Power of A-Neuron Классификация изображений кошек против собаки с использованием логистической регрессии – Edorado93/Power-A-Neuron github.com.

Пожалуйста, порекомендуйте этот пост, если вы думаете, что это может быть полезно для кого-то! Кроме того, не стесняйтесь указывать на ошибки, если какое-либо в каком-либо из расчетов или самого кода. Это было бы очень ценится.