Нейронная сеть для распознавания рисунка акселерометра
Я создаю приложение для Android-устройств, которое требует от него распознавать по данным акселерометра разницу между шумом ходьбы и двойным нажатием. Я пытаюсь решить эту проблему с помощью нейронных сетей.
в начале он прошел довольно хорошо, научив его распознавать краны от шума, такого как стоя/ сидя и ходить в более медленном темпе. Но когда дело дошло до нормальной ходьбы, он, казалось, так и не научился, хотя я кормил его с большим доля шумовых данных.
у меня вопрос: есть ли серьезные недостатки в моем подходе? Проблема основана на недостатке данных?
сеть
Я выбрал 25 входной 1 выходной многослойный персептрон,который я тренирую с обратным перемещением. Входной сигнал изменения в ускорении каждые 20ms и ряды выхода от -1 (для не-крана) до 1 (для крана). Я довольно много пробовал каждый состав из скрытых входов есть, но больше всего повезло с 3 - 10.
Я использую easyNeurons Neuroph для обучения и экспорта на Java.
данные
мои полные данные по тренировки около 50 двойных кранов частей и около шума 3к. Но я также попытался обучить его пропорциональному количеству шума для двойных нажатий.
данные выглядят так (колеблется от +10 до -10):
сидят два выстрела:
быстрая ходьба:
Так повторите мои вопросы: есть ли серьезные недостатки в моем подходе здесь? Нужно ли мне больше данных, чтобы распознать разницу между ходьбой и двойным нажатием? Еще какие-нибудь советы?
обновление
хорошо, поэтому после долгой настройки мы сварили основную проблему до способности распознавать двойные краны во время быстрой ходьбы. Сидя и регулярно (в доме) ходить мы можем решить довольно хорошо.
быстрая ходьба
Так это некоторые тестовые данные меня сначала ходить, а затем останавливаться, стоять на месте, а затем ходить и делать 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 секунды и рассмотрите область под кривой (или, Поскольку ваш сигнал дискретен, сумма абсолютных значений каждого показания датчика-красная область в прикрепленном изображении). Вероятно, вы обнаружите, что эта сумма высока, когда пользователь ходит, и намного ниже, когда они сидят и/или постукивают. Вы можете установить порог, выше которого вы считаете, что данное окно должно быть принято пользователь идет. Кроме того, поскольку у вас есть помеченные данные, вы можете обучить любой двоичный классификатор различать ходьбу и не ходить.
вы, вероятно, можете улучшить свою систему, рассматривая другие функции сигнала, такие как зазубренная линия. Если телефон стоит на столе, линия будет почти плоской. Если пользователь печатает, линия будет плоской, и вы будете видеть всплеск время от времени. Если они идут, вы увидите что - то вроде синусоидальная волна.
что, вероятно, будет работать, чтобы фильтровать данные с помощью Фурье трансформация. Ходьба имеет синусообразную амплитуду, ваши двойные отводы будут выделяться в результате преобразования как другая частота. Я думаю, что нейронная сеть может определить, содержат ли данные ваши двойные вкладки, потому что у нее есть дополнительная частота (частота двойных вкладок). Некоторые вопросы остаются:
- сколько времени образец данных должен быть?
- может ли ваш телефон сделать все работа, которую он должен сделать, имеет достаточную вычислительную мощность?
вы даже можете рассмотреть возможность использования GPU для этого.
другой вариант-использовать вывод Фурье и некоторые старые добрые Нечеткая Логика.
Это звучит весело...