Тот факт, что вы вывесили вопрос, как это означает, что вы не читали достаточно о нейронных сетей (или что у вас нет достаточного опыта в этой области). И это не критика, она совершенно обычна, так как это очень сложная область.
Решение вашего вопроса в большой степени зависит от вашей проблемы и набора данных.
Говоря о «слоях», обычно относится к определенной архитектуре искусственной нейронной сети (ANN), называемой многослойным персептроном (MLP), поэтому это архитектура, которую я попытаюсь объяснить.
Обычно увеличение количества скрытых слоев не дает вам лучших результатов, только более медленное обучение. Иногда использование двух скрытых слоев персептронов (так что три слоя, один вывод и два скрытых, так как входной слой не сделан из персептронов) могут помочь решить особенно сложные проблемы классификации, но я никогда не видел хороший 3-слойный ANN.
Обычно, когда в вашей сети плохое поведение, вы должны изменить 1) набор данных (поскольку в большинстве случаев это плохой дизайн набора данных, который приводит к плохому поведению) или 2) топология сети (то есть использовать другую ANN, кроме того, что MLP).
Понимание проблемы имеет важное значение и должно быть «передано» ANN через входы. Например, если вы создаете детектор отпечатков пальцев, вы знаете, что изображение можно поворачивать, поэтому, если вы применяете преобразование, которое делает изображение инвариантным к вращению (например, вы преобразуете координаты изображения в полярное представление), вы будете (обычно) получить лучшие результаты.
Помните, что самым важным шагом является выбор набора данных.Вы должны избегать слишком большого количества данных, но слишком много данных не является хорошим выбором. Это проблема, известная как overfitting. Сеть будет обучать распознаванию только данных, которые вы ей передали, и не сможет найти «похожие», которые вы передаете. Кроме того, набор данных должен быть сбалансированным: если вы хотите обучить сеть, чтобы распознать всех собак, а затем передать ее только изображениям биглей, она не сможет распознать доберманов.
Все эти общие советы. И обратите внимание на «обычно» наречие, которое я использовал.
Теперь для вашей конкретной проблемы существуют две основные проблемы.
Первый связан с переменной Error
. Вы говорите, что это имеет большую ценность, около 12. Ну, а что 12? Это просто номер. Обычно вы должны вычислить Mean squared error для «оценки» характеристик. То, что вы вычисляете, с другой стороны, является суммой всех квадратов ошибок. Вы должны разделить значение на количество тестовых случаев (Error /= PatternCount;
) и выбросить 0,5 при добавлении квадратов ошибок. Затем вы можете немного увеличить константу успеха, чтобы остановить ее раньше (возможно, 0.001 - это хорошо, но вы должны ее настроить).
И ... Ваш способ работы не является правильным. Обычно вам необходимо разделить ваш набор данных на две части: данные обучения (обычно около 80% точек) и тестовые данные (обычно около 20%) выбираются случайным образом. Вы тренируете анн с данными обучения, а затем, когда у вас есть это, вы должны пройти через него тестовые данные и определить характеристики (так что вам нужно передать данные, которые никогда не вошли в учебный процесс). Таким образом, вы будете проверять способность ANN обобщать, а не помнить о пройденных вами точках.
В конце концов, если вы действительно хотите работать в нейронной сети, вам придется много экспериментировать с данными, которые у вас есть. Лучше всего, если у вас есть ПК с высокой степенью мощности вместо небольшого arduino, и повторно используйте работу других людей (получите некоторые библиотеки). Лучший подход, который я нашел при работе в университете, - это инструменты, специально предназначенные для численного вычисления (я использовал matlab, так как у нас была лицензия, но вы можете использовать октаву - с открытым исходным кодом - с расширением нейронной сети). Таким образом, вы можете легко изменить топологию, состав набора данных и параметры обучения. Когда у вас что-то работает, вы можете извлечь параметры и внедрить их в то, что вы хотите (создание специальной реализации в C/C++/Java/python/whatever).
С наилучшими пожеланиями
PS Самое интересное то, что я начал это в качестве комментария, а затем быстро бежать из космоса ...
Я переписан тот же код в этом Arduino в C, поэтому код есть. как я могу показать набор данных, например, достаточно графика? который показывает, как он меняется. – Nuwanda
Загрузить его как csv? –
Я добавил его в Github, пожалуйста, проверьте правильность! – Nuwanda