Вы начинаете работать с машинным обучением или не можете найти, с чего начать? То же самое! Вот почему я создал этот пост. Я здесь не для того, чтобы вскипятить океан, поэтому вот несколько вещей, на которые можно ответить сразу:
Для чего нужны эти 15 строк кода? Мультиклассовая классификация.
У нас есть 3 известных класса цветов, которые мы пытаемся отсортировать.
Что такое глубокое обучение? Это разновидность машинного обучения, основанная на структурах мозга. (Пример: Нейронные сети)
Почему вы выбрали Keras? (Кроме того, что такое Keras…)
Keras - это высокоуровневый API Nueral Networks, написанный на Python на TensorFlow. Керас выполняет глубокое обучение так же, как Google Home автоматизирует ваш дом. Вы можете выключить свет, закрыть дверь, установить будильник и т. Д. Или сказать: «Окей, Google, иди спать!» (TensorFlow делает все вручную, Keras - это Google Home)
Полезное примечание. Каждому разделу кода соответствует номер 1–4. Я буду использовать нотацию (1), чтобы связать разделы с кодом.
Coderview (Обзор кода)
Прежде чем смотреть на код, давайте разберемся, что пытается сделать каждая часть:
- Импортируйте набор данных. Это лайнер 1 для извлечения данных диафрагмы.
- Подготовьте входные данные, удалив последний столбец в наборе данных.
- Подготовьте вывод. (Это выглядит немного странно, поэтому я подробно расскажу об этом ниже)
- Создайте, скомпилируйте и запустите модель.
Results: Epoch 1/150 150/150 [==============================] — 0s 2ms/step — loss: 4.1396 — acc: 0.3333 Epoch 2/150 150/150 [==============================] — 0s 89us/step — loss: 3.6754 — acc: 0.3333 Epoch 3/150 150/150 [==============================] — 0s 94us/step — loss: 3.2460 — acc: 0.3333 … Epoch 148/150 150/150 [==============================] - 0s 95us/step - loss: 0.1776 - acc: 0.9733 Epoch 149/150 150/150 [==============================] - 0s 86us/step - loss: 0.1772 - acc: 0.9667 Epoch 150/150 150/150 [==============================] - 0s 94us/step - loss: 0.1759 - acc: 0.9733 150/150 [==============================] - 0s 2ms/step [0.17427776996046304, 0.9800000011920929]
После запуска: мы получили точность 98% при сравнении результатов модели с нашими выходными данными. Имеется функция потерь 17,4% (насколько хорошо алгоритм моделирует набор данных, где чем меньше, тем лучше).
Вот и все! Теперь давайте углубимся в детали.
Подготовка набора данных, входов и выходов
Первоначально набор данных выглядит так (1):
iris.iloc[[0,50,100]] 0 1 2 3 4 ----- ----- ----- ----- ----- ----------------- 0 5.1 3.5 1.4 0.2 Iris-setosa 50 7.0 3.2 4.7 1.4 Iris-versicolor 100 6.3 3.3 6.0 2.5 Iris-virginica
Удаляем метки, чтобы сделать входы (2):
input_x = iris.drop(4,axis=1) 0 1 2 3 ----- ----- ----- ----- ----- 0 5.1 3.5 1.4 0.2 50 7.0 3.2 4.7 1.4 100 6.3 3.3 6.0 2.5
Выходы (3)
Нам нужно сделать 3 разных класса (Iris-setosa, Iris-versicolor, Iris-virginica) категориями без предвзятости, которые сможет понять Керас.
Что это значит? Многие люди первым делом захотят превратить их в числа: Iris-setosa = 1, Iris-versicolor = 2, Iris-virginica = 3
Но эти выходные данные являются целыми числами и по своей сути имеют «вес».
Вот почему в Keras есть функция to_categorical
. Мы используем это, чтобы превратить эти 3 класса в массив двоичных файлов. В основном каждый класс представляет собой столбец вроде:
Iris-setosa Iris-versicolor Iris-virginica ------------- ----------------- ---------------- 1 0 0 0 1 0 0 0 1
Таким образом, ни один класс не имеет большего веса, чем два других.
Как я подошел к этому в Python, было следующее:
- Дайте мне
key_value
, который выглядит так:{‘Iris-setosa’: 0, ‘Iris-versicolor’: 1, ‘Iris-virginica’: 2}
- Дайте мне все уникальные классы
iris[4].unique()
- Превратите эту последовательность в
list()
- цикл по списку и назначьте элементы как ключи, а их индексы как значения{v: k for k, v in enumerate(alist)}
- Замените имена выходных данных («Ирис-…») на индексы из
key_value
и сохраните их вoutput_class_int.
- Наконец, замените эти
0s, 1s, 2s
двоичными массивами, указанными выше.[ 0 = [1,0,0], 1 = [0,1,0], 2 = [0,0,1] ]
и сохраните их вoutput_y.
key_value = {v: k for k, v in enumerate(list(iris[4].unique()))} output_class_int = iris.replace({4:key_value})[4] output_y = keras.utils.to_categorical(output_class_int,len(key_value))
Я знаю, что это было много. Давайте присоединимся к input_x и out_y, чтобы вы могли увидеть, как это выглядит:
0 1 2 3 4 5 6 ----- ----- ----- ----- ----- --- --- --- 0 5.1 3.5 1.4 0.2 1 0 0 50 7.0 3.2 4.7 1.4 0 1 0 100 6.3 3.3 6.0 2.5 0 0 1
Если вы сравните приведенное выше с «Первоначально набор данных выглядит так: (1):»
Вы увидите, что строка 0 - это Iris-setosa, строка 50 - Iris-versicolor, а строка 100 - Iris-virginica.
Модель
Создать (4a)
model = keras.models.Sequential() model.add(Dense(8, input_dim=4, activation=’relu’)) model.add(Dense(3, activation=’softmax’))
Для нашей модели мы используем модель Keras Sequential. Вы можете думать о последовательной модели как о слоеном пироге (в последнее время я много смотрел Great British Baking Show), где каждый «слой» является частью нейронной сети.
Первый слой: model.add(Dense(8,input_dim=4,activation='relu'))
Добавьте этот первый слой. Давайте используем
8
узлов для этого слоя. У нас есть4
входных атрибутов (см.input_x
). Давайте использовать выпрямленную линейную единицу (relu
) для нашей функции активации.
Второй слой: model.add(Dense(3,activation='softmax’))
Добавьте последний слой. Для каждого вывода будут атрибуты
3
. (Это из-за функцииto_categorical
, которую мы использовали выше в разделе вывода). Давайте использоватьsoftmax
в качестве нашей функции активации.
Скомпилировать (4b)
model.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
После того, как мы создадим модель в Keras, нам нужно скомпилировать эту модель.
Вернемся к нашей аналогии с пирогом: мы испекли и сложили торт, а теперь наносим глазурь и дополнительные принадлежности.
loss=’categorical_crossentropy’
Мы устанавливаем функцию потерь на category_crossentropy (AKA. Loss от 0 до 1 для каждого класса)
optimizer='adam'
Мы настраиваем оптимизатор на Адама (оценка адаптивного момента), чтобы обновлять веса сети на основе данных обучения.
metrics=['accuracy']
Мы повышаем точность наших выходных показателей. (Вот почему мы видим 0.980000000
в нашем выводе)
Подгонка и оценка (4c)
model.fit(input_x, output_y, epochs=150, batch_size=15, verbose=1) score = model.evaluate(input_x, output_y, batch_size=15) score
Подгонка и оценка - это то место, где все взаимосвязано.
Вернемся к аналогии с Великой британской выставкой выпечки:
- Каждому дается рецепт (input_x)
- У каждого есть своя техника и исполнение (модель )
- Что создает выпечку (результат модели).
- Это оценивается (оценивает) комиссией
- У кого есть предвзятые ожидания (output_y)
Примечание. Эта часть модели впервые появляется при моделировании. Обратите внимание, что input_x
и output_y
даже не упоминаются в разделах создания или компиляции. Об этом важно помнить концептуально с Keras.
Каковы все эти другие компоненты в разделах настройки и оценки?
Первый verbose
- это просто флаг, показывающий результат каждой эпохи в результатах. Переменная epochs
определяет количество жизненных циклов полного набора данных, по которому будет запускаться модель. batch_size
сообщает модели, какой размер подмножества нужно вырезать для каждого прогона. Как эти два отношения связаны? Вот небольшой пример:
Допустим, у вас 105 человек (dataset_size = 105). Вы запускаете тест и хотите тестировать 10 за раз (batch_size = 10). Вам нужно будет запустить этот тест 11 раз, при этом на последней итерации будет всего 5 человек. Вы решили, что хотите, чтобы все прошли тест 3 раза (эпоха = 3). Чтобы все 105 человек прошли тест 3 раза группами по 10, нам нужно будет запустить тест 33 раз (11 запусков на эпоху с 3 эпохами ).
Возвращаясь к нашему упражнению, у нас есть dataset_size, равный 150 (это количество строк в csv). Мы проводим это через 150 эпох с batch_size 15.
Следующие шаги
Это простая попытка мультиклассовой классификации с использованием Keras. Как и в случае с глубоким обучением, есть несколько способов расширить это
- Оценка этого по сравнению с другими тестовыми наборами данных
- Добавление атрибутов или классов для расширения ввода и вывода
- Добавление слоев в сеть (в этом есть свои плюсы и минусы)
Спасибо за прочтение! Если у вас есть вопросы / комментарии, пожалуйста, оставьте их ниже. Если у вас есть более острые вопросы, не стесняйтесь обращаться ко мне в LinkedIn.
С уважением,
AndrewDoesData
DAG Solutions
Приложение
- Объяснение ввода Keras при переполнении стека: для меня лучшим ответом был лучший обзор того, как думать об интерпретации Кераса нейронных сетей.
- Руководство по последовательной модели Кераса: у Кераса есть замечательная документация для использования. Помните, что эта документация предполагает, что вы понимаете концепции глубокого обучения. (чего не делает большинство из нас) Во многих моих исследованиях я искал в Google все термины в этой документации.
- Функции активации: Relu vs softmax vs все остальное? Если вы новичок в глубоком обучении, это отличная шпаргалка по активациям.
- Оптимизация Адама для глубокого обучения: вот отличное пошаговое руководство по Адаму и тому, почему он использует классический стохастический градиентный спуск.
- Функции потери в ML Cheatsheet: Как и в случае с активацией и оптимизацией, вот хорошее прочтение о функциях потери и почему они необходимы для ML.
- Multi-Classificartion-Tutorial-Keras-Deep-Learning: Это было основой моего кода. Я отошел от этого подхода двумя способами: 1)
output_y
построен более питоническим способом по сравнению с использованием кодировщика numpy. 2) Я использовал собственный оценщик Keras вместо numpy. - Построение модели глубокого обучения с помощью Keras: это еще один пост, который я использовал для создания подходящих функций.