2017-06-09 3 views
1

モデルをテンソルフローで実装しようとしています。ただ6つの出力ニューロンの代わりに、私は1000を持っています。私はこれを行って、事前に重み付けをしています。 enter image description hereCNNモデルは、1/2以上の畳み込みレイヤを追加するときに学習しません。

完全なモデルを実装しましたが、1つのレイヤー(14,14,128)しか実装しませんでした。テストのためだけに。ポルグラムが成熟したので、2つ以上のレイヤー(または1つ)を実装しました。これにより、モデルは何も学習しなくなります。損失は​​一定であり(小さな雑音の周り)、訓練画像上で試験された精度はランダムな推測で一定である。層を追加するためには、電車のデータセットから1000の画像サブセットで70〜80%の精度まで非常に高速に(5〜10分)得ることができました。このように、これは追加の層では当てはまりません。

w2 = weight_variable([3,3,64,128]) 
b2 = bias_variable([128]) 
h2 = tf.nn.relu(conv2d_s2(h1_pool,w2)+b2) 
h2_pool = max_pool_2x2(h2) 

#Starts additional layer 
w3 = weight_variable([3,3,128,128]) 
b3 = bias_variable([128]) 
h3 = tf.nn.relu(conv2d_s1(h2_pool,w3)+b3) 
#Ends additional layer 

w5 = weight_variable([3,3,128,256]) 
b5 = bias_variable([256]) 
h5 = tf.nn.relu(conv2d_s1(h3,w5)+b5) 
h5_pool = max_pool_2x2(h5) 

この追加層は、モデルが無価値になります:ここで

s1s2はCONVのストライドである追加の層のためのコードです。私は成功せずに別のハイパーパラメータ(学習率、バッチサイズ、エポック)を試みました。どこに問題がありますか?

もう1つ質問があります。このサイズのネットワークを知っている人は誰でも、私はインプレメンテーションとテストを行うことができます。私の目標は、さまざまなオブジェクト(オブジェクトの画像)の把握位置を検出することですか?

私が役に立ちましたら、非常に良いゼオンでGTX 980を1台使用します。

レポジトリはhttps://github.com/tnikolla/grasp-detectionにあります。

UPDATE

問題は損失で発散しました。学習率を下げることによって解決される

オレンジ色は、プログラムが全く学習を示さなかったときの精度と損失(テンソルボードと端末)です。私は期末に示された損失にだまされました。精度と損失のログをチェックするために@harsが指摘しているように、私はテンソルボードの損失が最初のステップでばらつくことを発見しました。学習率を0,01から0,001に変更することで発散が解消され、シアンで見ることができるように、モデルは学習していました(1分間で小さな部分集合の過小評価)。 enter image description hereenter image description hereenter image description here

+0

、あなたの完全なモデルのコードとトレーニングを投稿します/オプティマイザのコードとパラメータ? – hars

+0

ここには[github](https://github.com/tnikolla/grasp-detection)リンクがあります。 – prometeu

+0

レイヤを追加しても、最適化の問題がより困難になるため、パフォーマンスが向上するとは限りません。バッチ正規化を試してみましたか? –

答えて

2

あなたはトレーニングの一部でlogitsとソフトマックスに続くすべての勾配をクリッピングする可能性があるモデルの終わりにReLU層を、持っています。したがって、モデルは不十分なローカルミニマムでスタックすることがあります。

あなたの推論の最後の行でtf.nn.reluを削除して、うまく列車に通っているかどうかを確認してください。ここで

は、コードのあなたの一部です:モデルの

最後の数行:コードの

# fc1 layer 
W_fc3 = weight_variable([512, 1000]) 
b_fc3 = bias_variable([1000]) 
output = tf.nn.relu(tf.matmul(h_fc2, W_fc3) + b_fc3) 
#print("output: {}".format(output.get_shape())) 

return output 

トレーニング一部:

logits = inference_redmon.inference(images) 
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
     logits=logits, labels=labels_one))   
tf.summary.scalar('loss', loss) 
correct_pred = tf.equal(tf.argmax(logits,1), tf.argmax(labels_one,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) 
+0

ありがとう@hars。それは滑ったにちがいない。しかし、なぜそれがもっと簡単なネットワークで動作していたのかまだ分かりません。あなたはちょっと(あなたの受け入れられた答えを編集して)多少詳しく説明したり、私にリンクをくれますか? – prometeu

+0

私の推測では、あなたのデータセットは十分に小さく、ローカルミニマはまともなパフォーマンスを得ています。もしあなたがそれを持っていなければ、あなたはより良いパフォーマンスを得るでしょう。 1層ネットワークでreluを削除することでテストできます。 – hars

+0

あなたはバグを発見しましたが、これは問題を解決しませんでした。プログラムを実行しているときにエラーが発生しました。私は 'inference_redmon.inference'を変更しましたが、' inference.inference'を再度実行しました。ご迷惑おかけして申し訳ありません。あなたが欠けているものを見ることができるなら、私は素晴らしいだろう。乾杯。 – prometeu

関連する問題