Темы этой недели:

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

ПОСТРОЕНИЕ СОБСТВЕННОГО КЛАССИФИКАТОРА

Во-первых, мы создали собственный классификатор anaconda по полному исходному коду. мы закончили с 4 шагами в этом процессе, это установка anaconda, извлечение исходного кода, подготовка данных, а также тестирование и обучение набора данных. после этого мы узнаем о проектах построчно.

УСЛОВИЯ :

1.Будущее

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

КАК ЭТО ИСПОЛЬЗОВАТЬ?

Например, выражение 11/4 в настоящее время оценивается как 2. Если модуль, в котором оно выполняется, включил истинное деление, выполнив:
from future import Division, выражение 11/4 будет оцениваться как 2,75. Импортируя модуль future и оценивая его переменную, вы можете увидеть, когда новая функция была впервые добавлена ​​в язык и когда она станет функцией по умолчанию: ›››Importfuture future.division _feature((2,2,0,'alpha' ,2),(3,0,0,'альфа',0),8192).

КАК ЭТО РАБОТАЕТ?

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

2.numpy.random.seed()

Это делает случайные числа предсказуемыми. Например: ›››numpy.random.seed(0);numpy.random.rand(4) array([0.55,0.72,0.6,0.54]) ›››numpy.random.seed(0);numpy.random .rand(4) array ([0.55,0.72,0.6,0.54]) При каждом сбросе начального числа каждый раз будет появляться один и тот же набор чисел. Если случайное начальное число не сбрасывается, при каждом вызове появляются разные числа. Например: ›››numpy.random.rand(4) array([0.42,0.65,0.44,0.89]) ›››numpy.random.rand(4) array([0.96,0.38,0.79,0.53]) получить наибольшее количество случайных чисел для каждого прогона, вызовите numpy.random.seed(). Это заставит неровный установить начальное число на случайное число, полученное из /dev/urandom или его аналогового окна.

3.Керас и Мнист

Что такое КЕРАС?

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

Что такое МНИСТ?

База данных MNIST представляет собой набор данных рукописных цифр. Он содержит 60 000 обучающих и 10 000 тестовых выборок. Каждое изображение представлено 28x28 пикселями, каждый из которых содержит значение от 0 до 255 со своим значением оттенков серого. Это подмножество более крупного набора, доступного в NIST. Цифры были нормализованы по размеру и центрированы на изображении фиксированного размера. Это хорошая база данных для людей, которые хотят попробовать методы обучения и методы распознавания образов на реальных данных, затрачивая минимум усилий на предварительную обработку и форматирование. Доступны четыре файла, которые содержат отдельно обучение и тест, а также изображения и метки.

4. Тестирование и обучение

X_train — —›обучающий набор данных (набор, который мы будем использовать для обучения алгоритма) Y_train — —›метки для всех данных в X_train X_test — →тестовый набор данных (набор, который мы будем использовать для тестирования алгоритма) Y_test — — →метки для всех данных в Y_test.

Могу ли я изменить значения num_class?

Мы не можем это изменить. Поскольку у нас есть 10 классов классификации… Что это значит? Это рукописные цифры помните? Итак, все цифры должны быть от 0 до 9, верно? Все рукописные цифры должны принадлежать любому из этих классов... Вот почему num_classes = 10. Если предположить, что этот набор данных представляет собой рукописные алфавиты, то количество классов будет равно 26... Потому что все буквы в наборе данных должны принадлежать любому алфавиты верно?

Batch_size — это количество обучающих примеров, используемых в одной итерации. В этом случае мы обучаем первые 128 данных в первой итерации и в следующем раунде. Мы возьмем следующие 128, и так будет продолжаться до завершения… целые наборы данных на куски и передать их алгоритму. Почему мы это делаем? Если вы закажете тарелку бриани, вы не сможете съесть ее за один раз, верно? вы будете есть его медленно, понемногу, верно? Это именно то, что здесь происходит... Чтобы избежать узких мест (проблем с производительностью), мы разделяем на куски и передаем их в алгоритм.

Позвольте мне привести пример для эпохи… Предположим, что вы, ребята, готовитесь к экзамену… Вы используете учебник для подготовки к этому экзамену… здесь учебник — это наш набор данных… и сколько раз вы полностью пересматриваете книгу, от страницы 1 до конца — это эпоха… Если вы перечитаете 100 раз, очевидно, ваши оценки повысятся, верно? Здесь тот же случай. Но позвольте задать другой вопрос. Если я дам Epochs = 1000, точность алгоритма прогнозирования увеличится… ошибка уменьшится. точность будет чертовски хороша, верно?

Вот что такое градиентный спуск…

Предположим, что если эпоха = 250 дает вам наилучшую точность, независимо от того, насколько велика эпоха… скажем, эпоха = 10000000… Это даст ту же точность, что и 250….

Но как найти оптимальное значение эпохи?

Это может быть 20000 или 122. Полностью зависит от архитектуры сети и размера набора данных. Если вы хотите найти оптимальное значение для эпохи, вы должны постоянно изменять значения и проверять их точность…. Есть точка, после которой точность не может быть лучше… эта точка является оптимальным значением для эпохи.

5.Последовательный

Что такое Sequential? и почему мы используем его в нашем проекте?

если вы собираетесь построить нейронную сеть самостоятельно, создание сети с нуля — это ошеломляющий процесс, и вы можете потерять сознание при ее разработке… Почему мы должны прикладывать столько усилий только для разработки слоев? Используя keras, тензорный поток в качестве серверной части, мы легко можем построить простую форму нейронной сети. У нас есть два типа: Последовательная модель и Функциональная модель… Последовательную модель легко построить. начните с машинного обучения, но, с другой стороны, оно ненадежно… оно не гибко…. Если вам нужно больше гибкости, если вам нужен глубокий доступ к каждому нейрону, вам следует выбрать функциональный API .

Итак, как выбрать между последовательным и функциональным? Просто: если вам нужно больше гибкости, выберите функциональный API… Если вы имеете дело с очень простыми данными, скажем, прогнозируете средний балл учащегося по его прошлые оценки, вы можете выбрать «Последовательный».

Пример выбора функционального API:прогнозирование шаблона использования Instagram, чтобы реклама была персонализирована для этого конкретного пользователя. Очевидно, что данные в этой ситуации сложны, источник данных может быть другим, вы приходится обрабатывать каждые данные. Другой пример для функционального API, Самоуправляемый автомобиль. Самоуправляемый автомобиль не похож на типичные системы машинного обучения… Он тренируется динамически и, очевидно, источники входных данных очень разные… Задержка может быть разной, скорость обработки каждых данных может быть разной. Так что в этом случае простой фреймворк явно выигрывает. не подходит для варианта использования Итак, мы выбираем более сложный и надежный алгоритм.

В этом проекте есть «3» слоя. Почему 3?

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

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

Вы можете сделать это двумя способами

1. Метод проб и ошибок

Вы должны вручную проверять значения, изменяя значения и сравнивая их с производительностью сети…

2. Классический способ/подходит для разработчиков:

Google / Stackoverflow Предположим, если вы создаете классификатор изображений, который может распознавать номерные знаки, вам следует поискать, есть ли кто-нибудь, кто делал подобный проект? Существует множество источников. там….1.Средний 2.Youtube 3.Github 5.Блоги 6.Stackoverflow Github и stackoverflow — два отличных источника для поиска похожих проектов, которые я знаю, этот метод может звучать сомнительно для вас….Если вы хотите найти количество слоев методом проб и ошибок, милости просим… Но поиск в Google – отличный обходной путь в этой ситуации. Вы можете не найти точное значение….Если «208» работает для чьего-то проекта, это не значит, что это сработает для вас…. Но вы можете оставить это 208 в качестве эталонного значения, а затем вы можете пробовать следы и ошибки вокруг этого эталонного значения. …

6.почему мы используем «512» в плотном слое?

Мы не можем просто случайным образом присвоить значение алгоритму машинного обучения и ожидать, что алгоритм выдаст наибольшую точность… В этом случае количество нейронов в скрытом слое можно рассчитать как (4) n²+3)/(n²-8), где n — количество входных данных. Иногда люди используют формулу… Чтобы определить количество нейронов. Но это не сработает, всегда количество скрытых слоев может быть равно 2 в небольшом наборе данных. Несмотря на то, что в литературе упоминаются некоторые определенные методы, касающиеся гиперпараметров, часто используется эмпирический метод. Здесь помогает тот же метод проб и ошибок… Попробуйте несколько значений и определите, какое из них работает лучше всего y = w_1x_1 + w_2x_2 + ⋯ + w_ix_i + b Некоторые говорят, что эта формула работает Где x_i — входные данные, w_i — его вес, b — это смещение, а y — выход. но это не будет работать всегда .... Так что лучше использовать метод проб и ошибок или гуглить Мое личное предложение, просто зайдите в stackoverflow и попробуйте найти похожий проект и использовать его в качестве справочного значения.

7.Что такое оптимизаторы?

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

Почему SGD? Почему мы выбираем SGD? Как выбрать?

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

8.Почему мы меняем наш набор данных?

В многослойной модели персептрона мы должны свести изображения к вектору пикселей. В этом случае изображения размером 28×28 будут входными значениями 784 пикселя. Мы не можем просто вставить их как изображение… Мы должны преобразовать его, прежде чем передать его алгоритму. К черту модель многослойного персептрона? Это просто еще одно причудливое название для «нейронной сети».

9. Почему мы меняем тип данных набора данных на float32?

Чаще всего при обучении нейронной сети используется 32-битная точность, поэтому в какой-то момент обучающие данные должны быть преобразованы в 32-битные числа с плавающей запятой. Поскольку набор данных легко помещается в ОЗУ, мы могли бы сразу преобразовать его в число с плавающей запятой.

Звучит слишком технически для вас?

Другими словами, если этот набор данных огромен, стоимость обучения будет высокой. Я имею в виду, что вам придется потратить около 64 гигабайт GPU (графический процессор) или что-то в этом роде для обучения… Итак, потребление памяти будет очень высоким, если вы не сделали этот шаг.

почему мы нормализуем набор данных? «x_train /= 255» — ​​—› зачем мы включаем эту строку?

Мы не знаем, как лучше всего масштабировать значения пикселей для моделирования, но мы знаем, что потребуется некоторое масштабирование. Хорошей отправной точкой является нормализация значений пикселей изображений в градациях серого, например. масштабируйте их в диапазоне [0,1]. Это включает в себя сначала преобразование типа данных из целых чисел без знака в числа с плавающей запятой, а затем деление значений пикселей на максимальное значение. (Деление на 255) Как и ожидалось, значения пикселей находятся в диапазоне от 0 до 255 (всего в любом изображении 256 цветов). Нормализация входных данных помогает ускорить обучение. Кроме того, это снижает вероятность застревания в локальных оптимумах. Если вы помните о градиентном спуске, то поймете, о чем я. Вы представляли, как работает градиентный спуск? В 2д? Но это не точно

Смотрите это изображение:

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

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

что такое нормализация?

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

10.Что такое функция активации и почему мы используем «сигмовидную» функцию?

вы хотите использовать to_categorical (даже для числовых меток) из-за того, как взаимосвязь между вашими метками понимается алгоритмом. Например, предположим, что вы создали классификатор цветов. Вы помечаете красный как 1, синий как 2 и оранжевый как 3. Теперь вы вводите их в алгоритм машинного обучения, чтобы решить, что соответствует вашему вводу. Математика скажет, что оранжевый выше красного. Это, очевидно, не входит в ваши намерения, но сеть будет знать, что оранжевый лучше красного.