Нейронная сеть для распознавания рисунка акселерометра

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

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

у меня вопрос: есть ли серьезные недостатки в моем подходе? Проблема основана на недостатке данных?

сеть

Я выбрал 25 входной 1 выходной многослойный персептрон,который я тренирую с обратным перемещением. Входной сигнал изменения в ускорении каждые 20ms и ряды выхода от -1 (для не-крана) до 1 (для крана). Я довольно много пробовал каждый состав из скрытых входов есть, но больше всего повезло с 3 - 10.

Я использую easyNeurons Neuroph для обучения и экспорта на Java.

данные

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

данные выглядят так (колеблется от +10 до -10):

сидят два выстрела: Sitting double taps, fairly easy to determine.


быстрая ходьба: Fast walking and double tapping, not that easy

Так повторите мои вопросы: есть ли серьезные недостатки в моем подходе здесь? Нужно ли мне больше данных, чтобы распознать разницу между ходьбой и двойным нажатием? Еще какие-нибудь советы?

обновление

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

быстрая ходьба Brisk walk

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

Если кто-то заинтересован в необработанных данных, я связал его для последних (оживленная прогулка) данных здесь

3 ответов


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

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

этот очень полезный документ (http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf) рекомендует отбелить набор данных, чтобы он имел среднее значение нулевой и единичной ковариации.

кроме того, поскольку ваша проблема является проблемой классификации, вы должны убедиться, что вы тренируете свою сеть, используя критерии кросс-энтропии (http://arxiv.org/pdf/1103.0398v1.pdf ), а не RMSE. (Я понятия не имею, поддерживает ли Neuroph кросс-энтропию или нет.)

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

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

Если вы хотите попробовать более сложные архитектуры NN, вы можете посмотреть на нейронную сеть с временной задержкой (просто google это для статьи), которая учитывает несколько окон в своей структуре. Должно быть относительно просто использовать один из Библиотеки факелов (http://www.torch.ch/) для реализации этого, но может быть трудно экспортировать сеть в среду Android.

наконец, еще один метод повышения производительности классификации в данных временных рядов заключается в рассмотрении отношений между смежными метками. Условные нейронные поля (http://code.google.com/p/cnf / - примечание: Я никогда не использовал этот код) сделайте это, интегрируя нейронные сети в условные случайные поля и, в зависимости от моделей поведения в фактических данных, может сделать лучшую работу.


вы настаиваете на использовании нейронной сети? Если нет, вот идея:

возьмите окно 0,5 секунды и рассмотрите область под кривой (или, Поскольку ваш сигнал дискретен, сумма абсолютных значений каждого показания датчика-красная область в прикрепленном изображении). Вероятно, вы обнаружите, что эта сумма высока, когда пользователь ходит, и намного ниже, когда они сидят и/или постукивают. Вы можете установить порог, выше которого вы считаете, что данное окно должно быть принято пользователь идет. Кроме того, поскольку у вас есть помеченные данные, вы можете обучить любой двоичный классификатор различать ходьбу и не ходить.

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

enter image description here


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

  1. сколько времени образец данных должен быть?
  2. может ли ваш телефон сделать все работа, которую он должен сделать, имеет достаточную вычислительную мощность?

вы даже можете рассмотреть возможность использования GPU для этого.

другой вариант-использовать вывод Фурье и некоторые старые добрые Нечеткая Логика.

Это звучит весело...