- Оригинальный адрес:Introduction to 1D Convolutional Neural Networks in Keras for Time Sequences
- Оригинальный автор:Nils Ackermann
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:haiyang-tju
- Корректор:lsvih leviding
Обзор
Многие технические статьи посвящены использованию двумерных сверточных нейронных сетей (2D CNN), особенно при распознавании изображений. А одномерные сверточные нейронные сети (1D CNN) задействованы лишь в определенной степени, например, в приложениях для обработки естественного языка (NLP). Существует очень мало статей о том, как построить одномерную сверточную нейронную сеть для решения некоторых проблем машинного обучения, с которыми вы можете столкнуться. В данной статье делается попытка восполнить этот недостаток.
Когда применять 1D CNN?
CNN хороши для выявления простых шаблонов в данных, а затем используют эти простые шаблоны для создания более сложных шаблонов на более высоких уровнях. 1D CNN очень эффективны, когда вы хотите получить интересующую функцию из короткого (фиксированной длины) сегмента общего набора данных, и расположение функции в этом сегменте данных не сильно коррелировано.
1D CNN хорошо работают для анализа временных рядов данных датчиков (таких как данные гироскопа или акселерометра); они также хорошо работают для данных сигналов с фиксированными периодами длины (таких как аудиосигналы). Кроме того, его можно применять к задачам обработки естественного языка (поскольку близость слов не всегда может быть хорошим индикатором обучаемого шаблона, сети LSTM более перспективны для НЛП).
В чем разница между 1D CNN и 2D CNN?
Будь то 1D, 2D или 3D, сверточные нейронные сети (CNN) имеют одни и те же характеристики и одни и те же методы обработки. Ключевое отличие заключается в размерности входных данных и в том, как детектор признаков (или фильтр) перемещается между данными:
«1D и 2D Convolutional Neural Networks» Нильса Акермана по лицензии Creative CommonsCC BY-ND 4.0под авторизацией.
описание проблемы
В этой статье мы сосредоточимся на обработке данных акселерометра на основе временных срезов со смартфона пользователя, закрепленного на ремне. Основываясь на данных акселерометра по осям x, y и z, 1D CNN используется для прогнозирования типа активности пользователя (например, «ходьба», «бег трусцой» или «стояние»). Вы можете найти больше информации в моих двух других статьяхздесьиздесь. Для различных действий данные выглядят одинаково на каждом временном интервале.
Примеры временных рядов по данным акселерометра
Как построить 1D CNN в Python?
Уже существует множество стандартных моделей CNN. Я выбралСайт КерасаМодель, описанная выше и настроенная для решения проблемы, описанной ранее. На изображении ниже представлен общий обзор построенной модели. Каждый из этих слоев будет дополнительно объяснен.
«Пример одномерной сверточной нейронной сети» Нильса Акермана по лицензии Creative CommonsCC BY-ND 4.0под авторизацией.
Давайте сначала посмотрим на соответствующий код Python для построения этой модели:
model_m = Sequential()
model_m.add(Reshape((TIME_PERIODS, num_sensors), input_shape=(input_shape,)))
model_m.add(Conv1D(100, 10, activation='relu', input_shape=(TIME_PERIODS, num_sensors)))
model_m.add(Conv1D(100, 10, activation='relu'))
model_m.add(MaxPooling1D(3))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(GlobalAveragePooling1D())
model_m.add(Dropout(0.5))
model_m.add(Dense(num_classes, activation='softmax'))
print(model_m.summary())
Запуск этого кода приведет к следующей глубокой нейронной сети:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
reshape_45 (Reshape) (None, 80, 3) 0
_________________________________________________________________
conv1d_145 (Conv1D) (None, 71, 100) 3100
_________________________________________________________________
conv1d_146 (Conv1D) (None, 62, 100) 100100
_________________________________________________________________
max_pooling1d_39 (MaxPooling (None, 20, 100) 0
_________________________________________________________________
conv1d_147 (Conv1D) (None, 11, 160) 160160
_________________________________________________________________
conv1d_148 (Conv1D) (None, 2, 160) 256160
_________________________________________________________________
global_average_pooling1d_29 (None, 160) 0
_________________________________________________________________
dropout_29 (Dropout) (None, 160) 0
_________________________________________________________________
dense_29 (Dense) (None, 6) 966
=================================================================
Total params: 520,486
Trainable params: 520,486
Non-trainable params: 0
_________________________________________________________________
None
Давайте углубимся в каждый слой и посмотрим, что происходит:
- Входные данные:После предварительной обработки данных каждая запись данных содержит 80 временных срезов (данные записываются с частотой дискретизации 20 Гц, поэтому каждый временной интервал содержит 4 секунды данных акселерометра). В течение каждого временного интервала сохраняются три данных для оси x, оси y и оси z акселерометра. В результате получается матрица 80 x 3. Поскольку я обычно использую нейронную сеть на iOS, данные должны быть сведены в вектор длиной 240 и переданы в нейронную сеть. Затем первый слой сети должен деформировать его до исходной формы 80 x 3.
- Первый слой 1D CNN:Первый уровень определяет фильтры (также называемые детекторами признаков) высотой 10 (также называемые размером ядра). Только задав фильтр, нейронная сеть может изучить один признак в первом слое. Этого может быть недостаточно, поэтому мы определим 100 фильтров. Это дает нам 100 различных функций, обученных на первом уровне сети. Выход первого слоя нейронной сети представляет собой матрицу 71 x 100. Каждый столбец выходной матрицы содержит вес фильтра. Каждый фильтр будет содержать 71 значение веса с определенным размером ядра и с учетом длины входной матрицы.
- Второй слой 1D CNN:Выход первой CNN будет передан на второй слой CNN. Мы снова определим 100 различных фильтров на этом сетевом уровне для обучения. Следуя той же логике, что и для первого слоя, размер выходной матрицы составляет 62 x 100.
- Макс. объединяющий слой:Чтобы уменьшить сложность вывода и предотвратить переоснащение данных, слой объединения часто используется после слоя CNN. В нашем примере мы выбрали объединяющий слой размера 3. Это означает, что выходная матрица этого слоя составляет только одну треть размера входной матрицы.
- Третий и четвертый слои 1D CNN:Для изучения функций более высокого уровня здесь используются два дополнительных слоя 1D CNN. Выходная матрица после этих двух слоев представляет собой матрицу 2 x 160.
- Средний слой пула:Добавьте дополнительный объединяющий слой, чтобы избежать переобучения. Вместо того, чтобы брать максимальное значение, объединение на этот раз берет среднее значение двух весов в нейронной сети. Размер выходной матрицы 1 х 160. У каждого детектора признаков в этом слое нейронной сети остался только один вес.
- Выпадающий слой:Выпадающие слои случайным образом присваивают нулевой вес нейронам в сети. Поскольку мы выбрали отношение 0,5, 50% нейронов будут иметь нулевой вес. Делая это, сеть меньше реагирует на небольшие изменения в данных. Следовательно, это может еще больше повысить точность обработки невидимых данных. Выход этого слоя по-прежнему представляет собой матрицу 1 x 160.
- Полностью подключенный слой с активацией Softmax:Последний слой сведет вектор длины 160 к вектору длины 6, так как у нас есть 6 классов для предсказания (т.е. «бег», «сесть», «ходить», «стоять», «подниматься по лестнице», Спуститься вниз"). Уменьшение размерности здесь осуществляется другим матричным умножением. Softmax используется в качестве функции активации. Он заставляет сумму всех шести выходных значений нейронной сети равняться единице. Следовательно, выходное значение будет представлять вероятность появления каждой из этих шести категорий.
обучить и протестировать нейронную сеть
Ниже приведен фрагмент кода Python для обучения модели с размером пакета 400 и соотношением разделения 80 к 20 для наборов для обучения и проверки.
callbacks_list = [
keras.callbacks.ModelCheckpoint(
filepath='best_model.{epoch:02d}-{val_loss:.2f}.h5',
monitor='val_loss', save_best_only=True),
keras.callbacks.EarlyStopping(monitor='acc', patience=1)
]
model_m.compile(loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'])
BATCH_SIZE = 400
EPOCHS = 50
history = model_m.fit(x_train,
y_train,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
callbacks=callbacks_list,
validation_split=0.2,
verbose=1)
Модель достигла точности 97% на обучающих данных.
...
Epoch 9/50
16694/16694 [==============================] - 16s 973us/step - loss: 0.0975 - acc: 0.9683 - val_loss: 0.7468 - val_acc: 0.8031
Epoch 10/50
16694/16694 [==============================] - 17s 989us/step - loss: 0.0917 - acc: 0.9715 - val_loss: 0.7215 - val_acc: 0.8064
Epoch 11/50
16694/16694 [==============================] - 17s 1ms/step - loss: 0.0877 - acc: 0.9716 - val_loss: 0.7233 - val_acc: 0.8040
Epoch 12/50
16694/16694 [==============================] - 17s 1ms/step - loss: 0.0659 - acc: 0.9802 - val_loss: 0.7064 - val_acc: 0.8347
Epoch 13/50
16694/16694 [==============================] - 17s 1ms/step - loss: 0.0626 - acc: 0.9799 - val_loss: 0.7219 - val_acc: 0.8107
Проверено на данных тестового набора, его точность составляет 92%.
Accuracy on test data: 0.92
Loss on test data: 0.39
Учитывая, что мы используем стандартную одномерную модель CNN, это хороший результат. Наша модель также хорошо зарекомендовала себя по точности, отзыву и показателю f1.
precision recall f1-score support
0 0.76 0.78 0.77 650
1 0.98 0.96 0.97 1990
2 0.91 0.94 0.92 452
3 0.99 0.84 0.91 370
4 0.82 0.77 0.79 725
5 0.93 0.98 0.95 2397
avg / total 0.92 0.92 0.92 6584
Вот краткий обзор того, что означают эти оценки:
«Матрица прогнозов и результатов» Нильса Акермана на Creative CommonsCC BY-ND 4.0Лицензировано по лицензии.
- Точность:Отношение правильно предсказанных результатов к сумме всех предсказанных результатов. т. е. ((TP + TN) / (TP + TN + FP + FN))
- Точность:Когда модель предсказывает положительный образец, это правильно? Все правильно предсказанные положительные результаты, разделенные на все положительные предсказания. т. е. (TP / (TP + FP))
- Скорость отзыва (Recall):Сколько из всех положительных образцов, идентифицированных для модели, были правильно предсказанными положительными образцами? Правильно предсказанные положительные результаты, разделенные на все положительные предсказания. т. е. (ТП / (ТП + ФН))
- Значение F1 (оценка F1):является средневзвешенным значением точности и полноты. то есть (2 x отзыв x точность / (отзыв + точность))
Соответствующая матрица путаницы на тестовых данных показана ниже.
Суммировать
В этой статье показано, как использовать 1D CNN для обучения сети на примере данных акселерометра смартфона для прогнозирования поведения пользователя. Полный код Python можно найти по адресуgithubнайти на.
Ссылки и цитаты
- Keras ДокументацияОб одномерной части сверточной нейронной сети
- Keras ПримерОб одномерной части сверточной нейронной сети
- Хорошая статья об обработке естественного языка с использованием одномерных сверточных нейронных сетей.статья
Отказ от ответственности
Публикации на сайте являются их собственными и не отражают статьи, стратегии или мнения работодателей.
Связаться с командой Raven Telegram
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.