2016-12-19 3 views
-1

私はArduinoでこれをXOR exampleに使って、2入力1出力データセットを訓練しました。私が持っているデータセットには約30,000の値が含まれています。私はXORテーブルの代わりに4つの値を使用し、テストしたところ、良い結果が得られました。使用するニューラルネットワークのタイプは?

私はより多くのデータでそれを訓練したいと思っていました。 RAMの制約のために私はArduinoでそれを行うことができませんでした。私はC言語でコードを書き直し、代わりにノートパソコンに訓練しました。私は訓練データセットとして2万の値を与えました。訓練に2日ほどかかり、非常に悪い結果を得ました。私は隠されたニューロンを4に変更しましたが、依然として結果は非常に悪いです。私は12の周りに最終的なエラーがあることを意味します。与えられたXORの例で彼らがエラーを計算する方法は、すべてのエラーを合計することで、私は20,000の入力を与えると、

もっと良い方法がありますか?レイヤーや隠れたニューロンの数を増やすべきですか? 30,000の値を持つデータセットに最適な方法は何ですか?

EDIT:

私はGithubの上のコードを共有しました:Repo

このレポは、データセットと同様にコードが含まれています。

答えて

1

これは、あなたが(またはあなたがこの分野での十分な経験を持っていないこと)ニューラルネットワークについて十分に読んでいないことを意味のように、あなたが質問を投稿するという事実をチェックしてください。これは非常に複雑な分野なので、これは批評ではなく、完全に共通しています。

質問に対する解決方法は、問題とデータセットによって大きく異なります。

「レイヤー」といえば、通常、多層パーセプトロン(MLP)と呼ばれる特定の人工ニューラルネットワーク(ANN)アーキテクチャーを指すので、これを説明しようとします。

通常、隠しレイヤの数を増やしても、パフォーマンスが向上するわけではなく、トレーニングが遅くなります。入力層がパーセプトロンではないため、パーセプトロンの2つの隠れたレイヤー(3つのレイヤー、1つの出力レイヤー、2つの隠れレイヤー)を使用すると、特に複雑な分類問題を解決するのに役立ちます。

通常、ネットワークの動作が悪い場合は、1)データセットを変更する必要があります(ほとんどの場合、データセット設計が悪いために動作が不良になるため)、または2)ネットワークトポロジMLP以外のANNアーキテクチャ)。

問題の理解は不可欠であり、入力を介してANNに渡す必要があります。たとえば、指紋検出器を作成する場合は、画像を回転することができることがわかっているので、画像を回転に対して不変にする変換を適用すると(通常、画像座標を極座標に変換します)、通常は)より良いパフォーマンスを得る。

最も重要なステップは、データセットの選択です。データが少なすぎるのを避けなければならないだけでなく、あまりにも多くのデータが良い選択ではありません。これは、overfittingとして知られている問題です。ネットワークはあなたが渡したデータだけを認識するように訓練し、あなたが渡した「類似の」ものを見つけることはできません。さらに、データセットのバランスをとる必要があります:ネットワークを訓練してすべての犬を認識し、それをビーグル画像だけに渡す場合、それはドベルマンを認識できません。

これらはすべて一般的なアドバイスです。そして、私が使用した「通常の」副詞に注意してください。

ここでは、ご使用の特定の問題について、2つの主な問題があります。

最初の変数は、Errorという変数に関連しています。あなたはこれが高い価値を持っていると言っています.12歳くらいでしょうか?それは単なる数字です。通常は、パフォーマンスを「見積もる」ためにMean squared errorを計算する必要があります。あなたが計算しているのは、反対側で、すべての二乗誤差の合計です。値をテストケース数(Error /= PatternCount;)で除算し、平方誤差を加算するときは0.5を捨てるべきです。その後、成功の定数を少し上げて前に止めることができます(おそらく0.001は良いですが、それを調整する必要があります)。

...あなたの操作方法は正しいものではありません。通常は、ランダムに選択されたトレーニングデータ(通常は点の約80%)とテストデータ(通常は約20%)の2つの部分でデータセットを分割する必要があります。あなたは訓練データを使って訓練データを訓練します。訓練データを持っているときは、それを通してテストデータを渡してパフォーマンスを検出する必要があります(訓練プロセスに入らなかったデータを渡す必要があります)。このようにして、ANNが一般化する能力をテストし、合格したポイントを覚えていないようにします。

実際にニューラルネットワークを機能させたい場合は、持っているデータを多く試してみる必要があります。それは、あなたが小さなarduinoの代わりに高出力のPCを持っている場合、そして他の人の仕事を再利用する(いくつかの図書館を入手する)のが最善です。私が大学で働いていたときに見つけた最良のアプローチは、数値計算用に作られたツールを使用していることです(私はライセンスを持っていたのでmatlabを使用しましたが、オクターブ - オープンソースをニューラルネットワーク拡張で使用できます)。これにより、トポロジ、データセットの構成、および学習パラメータを簡単に変更できます。何か問題があるときは、パラメータを抽出して、必要なものに埋め込むことができます(C/C++/Java/python /その他でアドホックな実装を行う)。

敬具

PS楽しい事が

0

ニューラルネットワークに関しては「最良の方法」はありません。
もう少し読書をしてから、あなたのために何ができるか試してみることをお勧めします。
(個人的にはhttp://neuralnetworksanddeeplearning.com/をお勧めします)

コード/データセットがなければ、何か提案するのは本当に難しいです。

PS:SGD https://en.wikipedia.org/wiki/Stochastic_gradient_descent

+0

は、私はCでそのArduinoの中で同じコードを再書いてきた...私はその後すぐにスペースが不足し、コメントとしてこれを始めたということです、コードはそこにあります。十分なグラフのように、データセットをどのように表示できますか?どのように変化するかを示す。 – Nuwanda

+0

csvとしてアップロードしますか? –

+0

Githubに追加しました。編集を確認してください! – Nuwanda

関連する問題