2016-07-06 1 views
1

私がしようとしているのは、ニューラルネットワークが関数f(x)= x^2を '学習'することです。私はここにコードのthisソースを基にしています。ニューラルネットワークはC#で手書きされていれば(倍精度を使用して)助けます。ニューラルネットワークは、どのようにして離散関数ではなく連続的に学習することができますか?

アイデアは、真実のネットワークペア(たとえば(1,1)、(2,4)、(3,9))をフィードしてから、リアル。入力は、実数の値を持つ1入力ニューロンと、出力層の出力による出力(1ニューロン)によって与えられます。隠れた層には4つのニューロンがあります。

私の問題は、出力ニューロンの出力が0と1の間であることです(私はシグモイド関数を使用しています)。私はthisソースからニューラルネットワークを学習しました。そこでは離散値を出力していました(手書き画像は0,1 ...または9を表しています)。私がこれを回ったのは、関数tan((pi *(2x - 1))/ 2とその逆関数を使うことでした。それでデータを与えたときにxとそれに逆にマッピング関数をx^2に適用します。

これは、(0,1)の上端の数字に実際の問題があるようです。 0.999999996)は、巨大な実数にマッピングしています(私は倍精度が十分正確だとは思わない)。これは標準的なやり方なのか、それとも良い方法ですか?バイナリベクトル(例えば、4つの入力ニューロン、(0,0,0,1)は1の入力です)もう一つのアイデアは、倍精度よりも正確な小数点以下を使用することでした。

このタスクは、神経ネットワーク本当に適切ではない何か?

+0

倍精度は10進数よりも正確です。 tan関数を使用すると、発見したとおりに無限に近づくため、新しい問題が発生します。通常、tanに限度が設定されているので、数値が一定値を上回る/下回ると、結果は強制的に0または1になります。 – jdweng

答えて

1

はい、提供したタスクは、比較的簡単でわかりやすい例です。

あなたがしなければならないことは、最終層の活性化としてシグモイド活性化の代わりに線形活性化を使用することです。この場合、隠れたレイヤー単位の出力を線形(アフィン)で組み合わせるだけです。あなたはまたあなたの損失関数を例えばに変えなければなりません。 MSEは、(0,1)インターバルのみではなく、実数値関数を処理するように設計されています。

更新: ここで、y1, y2, y3, y4が隠れ層ノードのアクティベーションであるとします。そして、アフィン活性化の形式は次のとおりです。

w0 + w1 * y1 + w2 * y2 + w3 * y3 + w4 * y4 

だから、これはアイデンティティ機能によってtanhまたはsigmoidを交換することです。

更新2: はい - 線形アクティブ化の範囲は、すべての実数の集合です。

+0

このような線形関数の具体例はありますか?線形では、その範囲として実数がありますか? – Nick

+0

線形関数は、y = mxの形式の関数です。アフィンはy = mx + bである。答えに記載されているように、どちらもこのケースで動作します。ニューラルネットワークの場合、mxは実際にウェイトと入力の間のドット積であることに注意してください。 – Andnp

+0

答えを更新しました。 –

関連する問題