2016-12-19 4 views
-1

Я использовал этот XOR example на Arduino для обучения 2-входного 1-выходного набора данных. Набор Dataset I содержит около 30 000 значений. Я использовал 4 значения вместо таблицы XOR, и я получил хорошие результаты при тестировании.Какой тип нейронной сети использовать?

Я хотел обучить его большим количеством данных. Я не мог сделать это на Arduino из-за ограничений RAM. Я переписал код на C и обучил его на своем ноутбуке. Я дал 20 000 ценностей в качестве набора учебных материалов, для обучения мне потребовалось около 2 дней, и я получил очень плохие результаты. Я сменил скрытые нейроны на 4, и результат все-таки очень плох. Я имею в виду, что я получил окончательную ошибку около 12. То, как они вычисляли ошибку в данном примере XOR, это суммирование всех ошибок, поэтому, когда я даю 20 000 входов, сумма достаточно велика.

Есть ли лучший способ, я могу это сделать? Должен ли я увеличить количество слоев или скрытых нейронов? Каков наилучший способ установить набор данных с 30 000 значений?

EDIT:

Я разделил код на Github: Repo

Этот репозиторий содержит набор данных, а также код.

ответ

1

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

Решение вашего вопроса в большой степени зависит от вашей проблемы и набора данных.

Говоря о «слоях», обычно относится к определенной архитектуре искусственной нейронной сети (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 Самое интересное то, что я начал это в качестве комментария, а затем быстро бежать из космоса ...

0

Не существует «наилучшего способа» как такового, когда речь заходит о нейронных сетях.
Я предлагаю вам прочитать больше, а затем вы можете попробовать, что сработает для вас.
(индивидуально предлагаю http://neuralnetworksanddeeplearning.com/)

Без кода/набора данных очень сложно что-либо предложить.

PS: проверить SGD https://en.wikipedia.org/wiki/Stochastic_gradient_descent

+0

Я переписан тот же код в этом Arduino в C, поэтому код есть. как я могу показать набор данных, например, достаточно графика? который показывает, как он меняется. – Nuwanda

+0

Загрузить его как csv? –

+0

Я добавил его в Github, пожалуйста, проверьте правильность! – Nuwanda

Смежные вопросы