На этом примере я делаю введение в Deep Learning Кераса.
Keras был создан, чтобы быть удобным для пользователя, модульным, легко расширяемым и работать с Python. API был «разработан для людей, а не для машин» и «следует передовым методам снижения когнитивной нагрузки».
Нейронные слои, функции стоимости, оптимизаторы, схемы инициализации, функции активации и схемы регуляризации — все это отдельные модули, которые можно комбинировать для создания новых моделей. Новые модули легко добавить, как и новые классы и функции. Модели определяются в коде Python, а не в отдельных файлах конфигурации моделей.
Что такое Керас?
Keras — это библиотека Python для глубокого обучения, включающая в себя эффективные числовые библиотеки Theano и TensorFlow.
В этом руководстве вы узнаете, как можно использовать Keras для разработки и оценки моделей нейронных сетей для задач классификации нескольких классов.
После прохождения этого пошагового руководства вы будете знать:
Как загрузить данные из CSV и сделать их доступными для Keras. Как подготовить данные мультиклассовой классификации для моделирования с помощью нейронных сетей. Как оценить модели нейронной сети Keras с помощью scikit-learn.
Импорт библиотек
Для этого простого примера мы будем использовать только пару библиотек:
- Pandas: для загрузки и обработки данных
- Scikit-learn: для разделения поезд-тест
- Matplotlib: для визуализации данных
- Keras: для обучения моделей
Вот импорт, если вы просто хотите скопировать/вставить:
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline
Импорт набора данных
Что касается набора данных Beer, его можно найти по этому URL-адресу.
Подготовьте папку, файлы и загрузите набор данных из Kaggle:
Это набор данных из 75 000 сортов домашнего пива более 176 различных стилей. Пивные записи сообщаются пользователями и классифицируются в соответствии с одним из 176 различных стилей. Эти рецепты содержат столько же или меньше деталей, сколько указал пользователь, но есть как минимум 5 полезных столбцов, в которых данные были введены для каждого: Исходная плотность, Конечная плотность, ABV, IBU и Цвет.
We'll use the linux terminal:
#### Remove directorys and files
! rm -r input/
! mkdir input/
! cd input/
#### Show directory
! ls
#### Download Dataset
! kaggle datasets download -d jtrofe/beer-recipes
#### Unzip Dataset
! unzip beer-recipes.zip
#### Move zip file
!mv beer-recipes.zip input/beer.zip
#### Move csv file
!mv recipeData.csv input/recipeDate.csv
!mv styleData.csv input/styleDate.csv
#### Show folder
! ls input/
Пост-ETL
Мы собираемся использовать чистый набор данных.
Вот как импортировать его в Pandas напрямую:
# load dataset
dataframe = pd.read_csv("MyData.csv")
dataframe.head()
dataset = dataframe.values
Набор данных может быть загружен напрямую. Поскольку выходная переменная содержит строки, проще всего загрузить данные с помощью pandas. Затем мы можем разделить атрибуты (столбцы) на входные переменные (X) и выходные переменные (Y).
X = dataset[:,1:5].astype(float) Y = dataset[:,0]
X
array([[ 6.71, 37. , 52.38, 6.69], [ 6.48, 20. , 31.6 , 4.82], [ 4.28, 28. , 40.87, 5.13], ..., [ 6.02, 33. , 68.3 , 7.74], [17.04, 37. , 77.81, 4.54], [37.46, 39. , 58.14, 6.76]])
Y
array( ['IPA', 'PALE', 'PALE', 'PALE', 'STOUT', 'PALE', 'PORTER', 'STOUT', 'PALE', 'PALE', 'IPA', 'STOUT', 'IPA', 'PALE', 'IPA', 'IPA', 'IPA', 'IPA', 'PALE', 'IPA', 'PALE', 'IPA', 'PALE', 'STOUT', 'PALE',
..., 'PALE', 'PALE', 'IPA', 'IPA', 'IPA', 'PORTER', 'PALE', 'IPA', 'PORTER', 'PALE', 'ALE', 'IPA', 'PALE', 'IPA', 'IPA', 'IPA', 'IPA','IPA', 'PORTER'], dtype=object)
Кодировать выходную переменную
Выходная переменная содержит пять различных строковых значений.
При моделировании задач классификации с несколькими классами с использованием нейронных сетей рекомендуется изменить форму выходного атрибута из вектора, который содержит значения для каждого значения класса, чтобы он был матрицей с логическим значением для каждого значения класса и независимо от того, имеет ли данный экземпляр это или нет. значение класса или нет.
Это называется одним горячим кодированием или созданием фиктивных переменных из категориальной переменной.
Например, в этой задаче три значения класса: IPA, ALE, PALE, STOUT, PORTER.
Если бы у нас были наблюдения:
IPA
ALE
PALE
STOUT
PORTER
Мы можем превратить это в двоичную матрицу с горячим кодированием для каждого экземпляра данных, которая будет выглядеть следующим образом:
Мы можем сделать это, сначала последовательно закодировав строки в целые числа, используя класс LabelEncoder scikit-learn. Затем преобразуйте вектор целых чисел в одно горячее кодирование, используя функцию Keras to_categorical().
# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)
Вот результат:
dummy_y
array([[0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.], [0., 0., 1., 0., 0.], ..., [0., 1., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 0., 1., 0.]], dtype=float32)
Определите модель нейронной сети
Если вы новичок в Keras или глубоком обучении, см. этот полезный учебник по Keras.
Библиотека Keras предоставляет классы-оболочки, позволяющие использовать модели нейронных сетей, разработанные с помощью Keras, в scikit-learn.
В Keras есть класс KerasClassifier, который можно использовать в качестве оценщика в scikit-learn, базовом типе модели в библиотеке. KerasClassifier принимает имя функции в качестве аргумента. Эта функция должна вернуть построенную модель нейронной сети, готовую к обучению.
Ниже приведена функция, которая создаст базовую нейронную сеть для задачи классификации радужной оболочки. Он создает простую полносвязную сеть с одним скрытым слоем, который содержит 8 нейронов.
Скрытый слой использует функцию активации выпрямителя, что является хорошей практикой. Поскольку мы использовали однократное кодирование для нашего набора данных о пиве, выходной слой должен создать 5 выходных значений, по одному для каждого класса. Выходное значение с наибольшим значением будет принято как класс, предсказанный моделью.
Сетевую топологию этой простой однослойной нейронной сети можно резюмировать следующим образом:
4 входа -> [8 скрытых узлов] -> 5 выходов
Обратите внимание, что мы используем функцию активации «softmax» в выходном слое. Это делается для того, чтобы выходные значения находились в диапазоне от 0 до 1 и могли использоваться в качестве прогнозируемых вероятностей.
Наконец, в сети используется эффективный алгоритм оптимизации градиентного спуска Адама с логарифмической функцией потерь, который в Keras называется «categorical_crossentropy».
# define baseline model
def baseline_model():
# create model
model = Sequential()
model.add(Dense(8, input_dim=4, activation='relu'))
model.add(Dense(5, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
Теперь мы можем создать наш KerasClassifier для использования в scikit-learn.
Мы также можем передавать аргументы в конструкцию класса KerasClassifier, которые будут переданы функции fit(), используемой внутри для обучения нейронной сети. Здесь мы передаем количество эпох как 200 и размер партии как 5, чтобы использовать их при обучении модели. Отладка также отключается при обучении путем установки verbose на 0.
estimator = KerasClassifier(build_fn=baseline_model, epochs=200, batch_size=5, verbose=0)
Оцените модель с k-кратной перекрестной проверкой
Теперь мы можем оценить модель нейронной сети на наших обучающих данных.
scikit-learn имеет отличные возможности для оценки моделей с использованием набора методов. Золотым стандартом для оценки моделей машинного обучения является k-кратная перекрестная проверка.
Сначала мы можем определить процедуру оценки модели. Здесь мы устанавливаем количество сгибов равным 10 (отличное значение по умолчанию) и перемешиваем данные перед их разбиением.
kfold = KFold(n_splits=10, shuffle=True)
Теперь мы можем оценить нашу модель (оценку) в нашем наборе данных (X и dummy_y), используя 10-кратную процедуру перекрестной проверки (kfold).
Оценка модели занимает всего около 10 секунд и возвращает объект, описывающий оценку 10 построенных моделей для каждого из разделений набора данных.
results = cross_val_score(estimator, X, dummy_y, cv=kfold) print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
Baseline: 76.10% (4.41%)
Результаты суммируются как среднее значение и стандартное отклонение точности модели в наборе данных.
Примечание. Ваши конкретные результаты могут отличаться из-за стохастического характера алгоритма обучения. Попробуйте запустить пример несколько раз и сравните среднюю производительность.
Это разумная оценка производительности модели на невидимых данных. Это также находится в области известных лучших результатов для этой задачи.
Вывод
И вот, это было легко.
Я надеюсь, что это поможет вам улучшить ваше обучение.
Никогда не сдавайтесь!
До встречи в Линкедине!