5

私はGoogleのTensorFlowライブラリでMLPを構築しました。ネットワークは機能していますが、何とかそれは正しく学習することを拒否します。入力が実際に何であっても、常に1.0にほぼ収束します。TensorFlow MLPトレーニングなしXOR

完全コードhereです。

アイデア?次のように


入出力(バッチサイズ4)である:

input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]] # XOR input 
output_data = [[0.], [1.], [1.], [0.]] # XOR output 

n_input = tf.placeholder(tf.float32, shape=[None, 2], name="n_input") 
n_output = tf.placeholder(tf.float32, shape=[None, 1], name="n_output") 

隠れ層構成

# hidden layer's bias neuron 
b_hidden = tf.Variable(0.1, name="hidden_bias") 

# hidden layer's weight matrix initialized with a uniform distribution 
W_hidden = tf.Variable(tf.random_uniform([2, hidden_nodes], -1.0, 1.0), name="hidden_weights") 

# calc hidden layer's activation 
hidden = tf.sigmoid(tf.matmul(n_input, W_hidden) + b_hidden) 

出力層構成:マイ学習方法は次のようになり

W_output = tf.Variable(tf.random_uniform([hidden_nodes, 1], -1.0, 1.0), name="output_weights") # output layer's weight matrix 
output = tf.sigmoid(tf.matmul(hidden, W_output)) # calc output layer's activation 

cross_entropy = -tf.reduce_sum(n_output * tf.log(output)) 

loss = tf.reduce_mean(cross_entropy) # mean the cross_entropy 
optimizer = tf.train.GradientDescentOptimizer(0.01) # take a gradient descent for optimizing 
train = optimizer.minimize(loss) # let the optimizer train 

私はクロスエントロピーの両方のセットアップを試してみました自分のネットワークによりoutput_data及びoutput予測/計算された値に記載されているようにn_outputは、元の出力である10

cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(n_output, output) 


(nはエポック用)forループ内部トレーニングはこのように書き:

cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output], 
        feed_dict={n_input: input_data, n_output: output_data}) 

私は、W_hiddenlossのデバッグprintigためcvaluesに結果を保存しています...


私が試したことが何であれ、ネットワークをテストして出力を検証しようとすると、常に何かが生成されますE本:

(...) 
step: 2000 
loss: 0.0137040186673 
b_hidden: 1.3272010088 
W_hidden: [[ 0.23195425 0.53248233 -0.21644847 -0.54775208 0.52298909] 
[ 0.73933059 0.51440752 -0.08397482 -0.62724304 -0.53347367]] 
W_output: [[ 1.65939867] 
[ 0.78912479] 
[ 1.4831928 ] 
[ 1.28612828] 
[ 1.12486529]] 

(--- finished with 2000 epochs ---) 

(Test input for validation:) 

input: [0.0, 0.0] | output: [[ 0.99339396]] 
input: [0.0, 1.0] | output: [[ 0.99289012]] 
input: [1.0, 0.0] | output: [[ 0.99346077]] 
input: [1.0, 1.0] | output: [[ 0.99261558]] 

だから、が正しく学習が、常にほぼ1.0に入力が供給され、関係なく収束ではありません。

+1

あなた 'b_hidden'変数がスカラーである - ということは、意図的なのですか?私はあなたが 'b_hidden = tf.Variable(tf.constant(0.1、shape = [hidden_​​nodes])、name =" hidden_​​bias ")'として作成するべきだと思います。もう一つは、出力レイヤに 'b_output'バイアス項を追加することです。 – mrry

+0

コメントありがとうございました。確かに、私は 'b_hidden'もスカラーではなくベクトルでなければならないことに気づきませんでした...しかし、ネットワークはまだ、隠れたバイアスの有無に関わらず、すべての入力に対してほぼ1.0に収束します。または出力層のためのバイアスなしである。私は実際に学習方法やネットワークアーキテクチャにいくつかの誤りがないと思っています:/ – daniel451

答えて

関連する問題