2017-06-30 13 views
1

以前はテーラーの上にケラスを使用していましたが、今は私には新しいテンソルフロースタイルでコードを書いてみたいです。非常にシンプルなモデルを作成しようとしましたが(これはケラスで実装されており、機能しました)、トレーニングプロセスはうまくいかないようです。どんなに多くのエポックになっても、モデルは常に同じ予測を行います。モデルはトレーニングプロセスではまったく更新されません。私は何か誤解して馬鹿げたミスを犯さなければならないと思うが、どこにいるのか分からないと思う。テンソルフローレイヤーの使用、訓練されていないモデル

入力データとラベルが正しいことは確かです入力データtraining_input [0]とtraining_input [1]は、それぞれ2D numpy配列です。ラベルは4次元でワンホットです。

def model_1(features, labels): 
    hl_input = features['hl_input'] 
    bd_input = features['bd_input'] 
    encoder = tf.concat([hl_input, bd_input], axis=1) 

    encoder = tf.layers.dense(encoder, 128, activation=tf.nn.relu) 
    decoder = tf.layers.dense(encoder, 64) 
    logits = tf.layers.dense(decoder, 4, activation=tf.nn.softmax) 
    predictions = tf.argmax(logits, 1, name="predictions") 

    loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits) 
    train_op = tf.contrib.layers.optimize_loss(loss, tf.contrib.framework.get_global_step(), optimizer='Adam', 
              learning_rate=0.1) 
    predictions = {"classes": predictions, "probabilities": logits} 

    return predictions, loss, train_op 
... ... 
classifier = tf.contrib.learn.Estimator(model_fn=model_1) 
classifier.fit(x={'hl_input':training_input[0], 'bd_input':training_input[1]}, y=training_labels, batch_size=batch_size, steps=steps) 
+0

最後に問題が見つかりました。私は、テンソルの代わりに1つのホットベクトルとしてnumpy配列を使用しました。ですから、 'labels = tf.cast(labels、tf.int32)'という行を追加する必要があります。うまくいけば私の間違いを表示すると、他の人を助けることができる – ymeng

答えて

1

最後のレイヤーでsoftmaxのアクティベーションを適用しています。 tf.losses.softmax_cross_entropy機能は内部でsoftmaxを適用しますので、activation=Noneを設定してlogitsのアクティベーションを削除してください。

+0

本当に間違いであり、私はそれを修正しました。しかし、モデルがまったく機能しない理由はありません。修正後も問題は残っています。私も予測を印刷し、どんな入力についても、出力(ロット)はまったく同じです。何らかの理由で、入力データが適切に反復されないか、モデルが根本的に偏ってしまいます。私はそれを徹底的に調べます。 – ymeng

+0

そこに表示されているコードのバグしか見つけられません。 Logitsが入力として渡されました。問題の型を推測できません。 –

関連する問題