2016-11-06 8 views
0

を訓練した後、すべての項目の同じ出力に収束します人間とキュウリの違いを特定できるプログラムを作成して作成することは良い考えです。私はプログラムを取っていると考えているステップのリストを作成した画像、ネットから画像を引っ張って、キュウリ/TensorFlowは常に、これは私が働いているコードの一部である

人間/とキュウリの写真の中に人の絵を置く:

  1. ファイルパスとキーの配列が作成され、次にシャッフルされます。

  2. ファイルパスのバッチが作成されます。

  3. バッチからのファイルパスはイメージに変換され、250x250にサイズ変更され、イメージバッチ配列に追加されます(この時点でキーとイメージはまだ整列しています)。

  4. イメージバッチとキーバッチがアレイに供給されます。

  5. すべてのエポックの最後に、各画像の10個に対してネットワークをテストします。

    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.61422414 0.38577583]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [0, 1] 
    [[ 0.53653401 0.46346596]] [0] [1, 0] 
    

    最初のアレイ出力の出力ノード、二番目の配列はtf.argmaxある()である:私はuse_network()を実行すると、私はコンソールにこの出力を得る

、そして3番目は期待されていたものです。

実際の学習は、これは学習から出力されると、あまりにもかなり小さいように思える:

Epoch 1 completed out of 50  Error 3762.83390808 
Epoch 2 completed out of 50  Error 3758.51748657 
Epoch 3 completed out of 50  Error 3753.70425415 
Epoch 4 completed out of 50  Error 3748.32539368 
Epoch 5 completed out of 50  Error 3742.45524597 
Epoch 6 completed out of 50  Error 3736.21272278 
Epoch 7 completed out of 50  Error 3729.56756592 
... 
Epoch 45 completed out of 50 Error 3677.34605408 
Epoch 46 completed out of 50 Error 3677.34388733 
Epoch 47 completed out of 50 Error 3677.34150696 
Epoch 48 completed out of 50 Error 3677.3391571 
Epoch 49 completed out of 50 Error 3677.33673096 
Epoch 50 completed out of 50 Error 3677.33418274 

私は物事を試してみて、変更するには、次の操作を行うことを試みてきた:

  1. 画像を小さくする、例えば32x32、および/または白黒にする。より小さな画像が予測の変化につながるかどうかを確認する。

  2. reduce_sumとreduce_meanの間のコスト式と、sigmoid_cross_entropyとsoftmax_cross_entropyの間の内部式を変更します。

私はそれが働いてイマイチ理由としていくつかのアイデアを持っており、以下のように、彼らは以下のとおりです。

  1. だけ貧しいコード

  2. 入力データが大きすぎと十分ではないノード/レイヤーをプロセスへ。

  3. イメージと関連付けられたキーがどこかでスクランブルされています。

+0

学習率を下げてみてください。それが私の経験からこの問題の最も一般的な原因です。 – chasep255

答えて

2

これにはいくつかの問題が考えられます。 1つ目は、大きな画像ネットイメージを処理するために密接に接続されたレイヤーを使用していることです。イメージには畳み込みネットワークを使用する必要があります。私はこれがあなたの最大の問題だと思います。畳み込み/プール層のピラミッドを適用して空間次元を「フィーチャ」に縮小した後にのみ、密なレイヤーを追加する必要があります。

https://www.tensorflow.org/versions/r0.11/tutorials/deep_cnn/index.html

第二に、あなたは緻密層を使用するつもりだった場合でも、あなたは、このような注意モデルのように、いくつかの例外を除いて、隠された層の間の活性化(としてソフトマックス関数を適用するべきではありませんが、これは、より高度な概念です。 )ソフトマックスは、レイヤー内のすべてのアクティベーションの合計を、おそらく望まないものに強制します。私はreluまたは少なくともtanhに隠された層の間の活性化を変更するだろう。

最後に、ネットワークが一定の値に近づくと、学習率を下げるのに役立つことがわかりました。私はこれがあなたの問題だとは思わない。私の最初の2つのコメントは、あなたが注目すべきものです。

+0

これは私の問題でした。ありがとうございました。私はまだNNの仕組みを学んでおり、FC Layersを使ったMNISTチュートリアルからいくつかのものを変更しました。ありがとうございました :) – em202020

関連する問題