2017-11-23 17 views
0

私の挑戦は、ニューラルネットワークを訓練して、異なるクラスのタスクに対する特定のアクションやイベントを認識させることです。 トレーニングニューラルネットワークが0または1または[0,1]の場合、ほとんどの入出力がわかります。しかし、私のシナリオでは、私の入力が任意に大きい整数の形になり、同じ形式が出力に期待されます。機械学習におけるマルチラベル/マルチタスク/マルチクラス回帰

例を挙げましょう: 入力

X = [ 23, 4, 0, 1233423, 1, 0, 0] -> 
Y = [ 2, 1, 1] 

今すぐXの各要素[i]は、同じエンティティの異なる特性を表します。 Y [i]の中の各エントリは、他の一方で、異なる3つのカテゴリに行うには、人間がより可能性が高いものを意味

23 -> maps to a place he/she was born 
4 -> maps to a school they graduated 

など

: のは、それが人間を記述したいとしましょう(LEN(Y)が、この場合は3であるとして):

Y[0] = 2 -> maps to eating icecream (from a variety of other choices) 
Y[1] = 1 -> maps to a time of day moment (morning, noon, afternoon, evening, etc...) 
Y[2] = 1 -> maps to a day of the week for example 

タスクは、私は出力層の上にシグモイドを適用し、損失関数としてbinary_crossentropyを行うのと同じマルチラベルの問題だったが、今の進路場合それはもちろん動作しません。 私の出力が明らかに[0,1]の間にないからです。 また、Yのすべてのクラス/サブクラスを正確に予測したいので、どのような損失関数を適用するべきかはわかりません。私が基本的に言っているのは、それぞれのY [i]はそれ自身のクラスであるということです。 出力が(3, labels_per_class) の形であり、損失関数が3つの異なるクラスのそれぞれについて損失を計算すると、より正確になります 結果を最適化しようとすると3つのクラスのそれぞれに正しいラベル。 私はそれが可能かどうか、少なくとも方法はわかりません。

私は本当に神経ネットワークの知識と学習の初めにありますので、私はこの問題に苦労しています。

しかし、実際にはもっと簡単に言えば、私はそれをどのように記述するかをよりよく考えています。多少なりとも自動エンコーダに似ていますが、入力と出力は整数です。違いは、私の場合、出力はオートエンコーダの入力と同じサイズであることです。

私の解決策は、損失関数として、出力層、(および他のすべての層のコースrelu-like activationsの同様)とbinary_crossentropyでreluを適用することであったが、ネットワークの精度は約15%、非常に低いです。

答えて

0

標準的な分類では、クラス数に等しいノード数で密度の高いレイヤーを作成し、softmaxを適用します。損失は​​tf.losses.softmax_cross_entropyになります。 1つではなく、複数のクラスを許可したい場合は、シグモイドを実行します。

ここでは、複数の分類タスクがあります。これを行う1つの方法は、最後に隠されたレイヤー(softmaxを行うレイヤーの前のレイヤー)を取ることです。各タスクについて、多数のノードを有する高密度層は、そのタスクのクラス数に等しく、softmaxを適用する。損失を計算するには、損失を一緒に加算するだけです。

タスクが多すぎる場合は、予測ごとに複数のレイヤーが必要になることがあります。

たとえば、アイスクリームを食べることが、時間を正しく取ることよりも重要な場合は、さまざまな損失にいくつかの重みを付けることもできます。

予測スペースが連続している場合のみ、reluを使用します。一日の時間は連続ですが、アイスクリームを食べるか、仕事をするか、テレビを見るかの選択はできません。 reluを使用する場合は、L1(tf.losses.absolut_difference)やL2(tf.losses.mean_squared_error)のような損失を使用します。