2016-12-21 11 views
2

私はテンソルフローを持つニューロンネットワークを書き始めました。私の例題の各プロジェクトでは1つの問題があります。Tensorflow - 損失が高く始まり、低下しない

私の喪失は常に50以上のものから始まり、減少しないか、そうであれば、それはゆっくりして、私のすべてのエポック後には許容損失率にも達しません。

物事はそれが既にを試してみました(そしてあまり結果には影響しなかった)過学習でテストを

  • が、次の例 に私が15000トレーニングと15000のテスト・データセットを持っていることがわかりますし、 900個のニューロン
  • よう 何かが違うオプティマイザとオプティマイザ値
  • が trainingdataが
  • 0をaswellとしてテストデータを使用してtraingdataを増加しようとしたテスト
  • は私がhttps://youtu.be/vq2nnJ4g6N0

    の知識のネットワークを作成した。しかし、私たちは私testprojectsの1に見てみましょう

バッチサイズを増減試してみました:

私は名前のリストを持っています性別を仮定して、生のデータが次のように見えるようにしたいとします。

names=["Maria","Paul","Emilia",...] 

genders=["f","m","f",...] 

は、ネットワークにそれを供給するため、私は3つの隠れ層でネットワークを構築

names=[[77.,97. ,114.,105.,97. ,0. ,0.,...] 
     [80.,97. ,117.,108.,0. ,0. ,0.,...] 
     [69.,109.,105.,108.,105.,97.,0.,...]] 

genders=[[1.,0.] 
     [0.,1.] 
     [1.,0.]] 

ビット配列にcharCodesのアレイ(30のMAXLENGTHを期待)および性別に[30,20]を名前を変換、[20,10]、[10,10]、[10,2]のようになります。すべての隠れ層には、活性化機能としてのReLUがあります。出力層はソフトマックスを有する。

# Input Layer 
x = tf.placeholder(tf.float32, shape=[None, 30]) 
y_ = tf.placeholder(tf.float32, shape=[None, 2]) 

# Hidden Layers 
# H1 
W1 = tf.Variable(tf.truncated_normal([30, 20], stddev=0.1)) 
b1 = tf.Variable(tf.zeros([20])) 
y1 = tf.nn.relu(tf.matmul(x, W1) + b1) 

# H2 
W2 = tf.Variable(tf.truncated_normal([20, 10], stddev=0.1)) 
b2 = tf.Variable(tf.zeros([10])) 
y2 = tf.nn.relu(tf.matmul(y1, W2) + b2) 

# H3 
W3 = tf.Variable(tf.truncated_normal([10, 10], stddev=0.1)) 
b3 = tf.Variable(tf.zeros([10])) 
y3 = tf.nn.relu(tf.matmul(y2, W3) + b3) 

# Output Layer 
W = tf.Variable(tf.truncated_normal([10, 2], stddev=0.1)) 
b = tf.Variable(tf.zeros([2])) 
y = tf.nn.softmax(tf.matmul(y3, W) + b) 

は今の損失、精度のための計算とトレーニング動作は:

# Loss 
cross_entropy = -tf.reduce_sum(y_*tf.log(y)) 

# Accuracy 
is_correct = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32)) 

# Training 
train_operation = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 

私は100

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 
for i in range(150): 
    bs = 100 
    index = i*bs 
    inputBatch = inputData[index:index+bs] 
    outputBatch = outputData[index:index+bs] 

    sess.run(train_operation, feed_dict={x: inputBatch, y_: outputBatch}) 
    accuracyTrain, lossTrain = sess.run([accuracy, cross_entropy], feed_dict={x: inputBatch, y_: outputBatch}) 

    if i%(bs/10) == 0: 
     print("step %d loss %.2f accuracy %.2f" % (i, lossTrain, accuracyTrain)) 

のバッチでネットワークを訓練し、私は次のような結果が得られます。

step 0 loss 68.96 accuracy 0.55 
step 10 loss 69.32 accuracy 0.50 
step 20 loss 69.31 accuracy 0.50 
step 30 loss 69.31 accuracy 0.50 
step 40 loss 69.29 accuracy 0.51 
step 50 loss 69.90 accuracy 0.53 
step 60 loss 68.92 accuracy 0.55 
step 70 loss 68.99 accuracy 0.55 
step 80 loss 69.49 accuracy 0.49 
step 90 loss 69.25 accuracy 0.52 
step 100 loss 69.39 accuracy 0.49 
step 110 loss 69.32 accuracy 0.47 
step 120 loss 67.17 accuracy 0.61 
step 130 loss 69.34 accuracy 0.50 
step 140 loss 69.33 accuracy 0.47 


何が間違っていますか?

なぜ私のプロジェクトで〜69で始まり、それ以下ではないのですか?


はあなたに非常に多くのみんなありがとう!

+0

これをライブラリデータセットで実行しようとしましたか?例えばhttps://archive.ics.uci.edu/ml/datasets.html名前分類を学ぶことができないかもしれないと思います – Dotan

+0

あなたは正しいかもしれません。私は別の図書館でそれを試しましたが、その損失は1.3の下には収まらなかった... –

答えて

0

バイナリ分類の出発点として、サンプルあたりのエントロピーの0.69 natsに問題はありません。

ベース2に変換すると、0.69/log(2)はほぼ1ビット/サンプルであり、バイナリ分類が不明な場合は正確に予想されることがわかります。

私は通常、合計の代わりに平均損失を使用するので、バッチサイズにはあまり影響されません。

また、エントロピーを直接計算しないでください。これは、そのメソッドが簡単に破損するためです。おそらくtf.nn.sigmoid_cross_entropy_with_logitsが必要です。

私はまた、純粋な勾配降下の代わりにAdam Optimizerを使い始めるのが好きです。

は、ここでは、この問題に何らかの問題が発生した可能性があり、二つの理由です:文字コードが発注されている

1)が、注文は何を意味するものではありません。ネットワークがワンホットベクトルとして入力された場合、入力がより簡単になります。したがって、あなたの入力は26x30 = 780の要素ベクトルになります。それがなければ、ネットワークは手紙間の境界を学ぶ能力の束を無駄にしなければならない。

2)あなたは完全に接続されたレイヤーしか持っていません。これにより、名前の絶対的な位置に関係なく、事実を知ることは不可能になります。 2015年にトップ10の女の子の名前のうち6つが「a」で終わったが、トップ10の男の子の名前のうち0が終わった。現在書かれているように、あなたのネットワークは再学習する必要があります。「通常、名前の長さごとに「a」で終わると、それは女の子の名前です。いくつかの畳み込みレイヤーを使用すると、すべての名前の長さに渡って事実を一度学ぶことができます。

+0

"one-hot"ベクトル 'cross_entropy = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits、y))'と 'train_operation = tf.train.AdamOptimizer(0.0003).minimize(cross_entropy) ' 私はまだ畳み込みネットワークの準備ができていないので、 の損失は今は落ちますが、精度は同じままです。 –

+0

私は分かりません。完全に接続されたレイヤーは、入力がシーケンスであるという事実を表していません。どんな種類のバイグラム・モデルもそれを反映するでしょう。バイグラム数を入力として渡すことを検討しましたか? 「開始」と「終了」の記号を入力すると、入力は(26 + 2)** 2になります。正規化することを確認してください。 – mdaoust

関連する問題