2017-06-11 13 views
3

私はテンソルフローで基本的なニューラルネットワークを実装しようとしていますが、入力は(x、y、z)の1 /ゼロのランダムデータですが、 x = 1のときはいつでも、そうでなければ0を出力する。テンソルフローの基本ニューラルネット

私のテストデータが出力[1,0,0]は、私はここで本当にわからいただきました間違ってないんだけどなければならないしかしこれは

[-0.37119362] 
[-0.23264697] 
[-0.14701667] 

を出力

import tensorflow as tf 
import numpy as np 

x_data = np.array([[0,0,1], 
     [0,1,1], 
     [1,0,0], 
     [0,1,0], 
     [1,1,1], 
     [0,1,1], 
     [1,1,1]]) 

x_test = np.array([[1,1,1], [0,1,0], [0,0,0]]) 
y_data = np.array([0,0,1,0,1,0,1]) 


iters = 1000 
learning_rate = 0.1 
weights = { 
'w1': tf.Variable(tf.random_normal([3, 5])), 
'w2': tf.Variable(tf.random_normal([5, 1])), 
} 
bias = { 
'b1': tf.Variable(tf.random_normal([5])), 
'b2': tf.Variable(tf.random_normal([1])), 
} 

def predict(x, weights, bias): 
    l1 = tf.add(tf.matmul(x, weights['w1']), bias['b1']) 
    l1 = tf.nn.sigmoid(l1) 
    out = tf.add(tf.matmul(l1, weights['w2']), bias['b2']) 
    return out 


x = tf.placeholder(tf.float32, shape=(None,3)) 
y = tf.placeholder(tf.float32, shape=(None)) 

pred = predict(x, weights, bias) 

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=pred, labels=y)) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost) 

init = tf.global_variables_initializer() 

# graph 
with tf.Session() as sess: 
sess.run(init) 

for i in range(0, iters): 
    _, c = sess.run([optimizer, cost], feed_dict={x: x_data, y: y_data}) 
    if i % 100 == 0: 
     print("cost: " + str(c)) 

print(sess.run(weights['w1'])) 
print(sess.run(pred, feed_dict={x: x_test})) 

自分のネットワークコードであります。私は、ハイパーパラメータで遊んでみて、stackoverflowを見てきました。私はまた、コスト関数としてsoftmax_cross_entropyを使用しようとしましたが、ロジットがラベルと同じ形ではないというエラーが表示されます。

これは私が期待しているものが出力されない理由を知っていますか?

+0

I相関関係を学習しない理由を教えてもらえませんが、クロスエントロピーを計算する前にシグモイドを実行しているので、おそらく最後の行に予測のシグモイドを出力して、出力を比較可能にします: 'print(sess.run(tf.nn.sigmoid(pred)、feed_dict = {x:x_test}))'。これにより、少なくとも肯定的な結果が得られます。 – ml4294

答えて

1

まず、出力の前にアクティブ化関数(つまりtf.nn.sigmoid)を渡す必要があります。

tf.nn.sigmoid_cross_entropy_with_logitsが(シグモイド活性化の前に)ロギングを取ることを確認してください。

また、あなたはここに代わり(7, 1)

(7)たご入力y_dataと形状の問題は、あなたのコードの作業バージョンでいた:

import tensorflow as tf 
import numpy as np 

x_data = np.array([[0,0,1], 
     [0,1,1], 
     [1,0,0], 
     [0,1,0], 
     [1,1,1], 
     [0,1,1], 
     [1,1,1]]) 

x_test = np.array([[1,1,1], [0,1,0], [0,0,0]]) 
y_data = np.array([[0],[0],[1],[0],[1],[0],[1]]) 


iters = 1000 
learning_rate = 0.1 
weights = { 
'w1': tf.Variable(tf.random_normal([3, 5])), 
'w2': tf.Variable(tf.random_normal([5, 1])), 
} 
bias = { 
'b1': tf.Variable(tf.random_normal([5])), 
'b2': tf.Variable(tf.random_normal([1])), 
} 

def predict(x, weights, bias): 
    l1 = tf.add(tf.matmul(x, weights['w1']), bias['b1']) 
    l1 = tf.nn.sigmoid(l1)  
    out = tf.add(tf.matmul(l1, weights['w2']), bias['b2']) 
    return out 


x = tf.placeholder(tf.float32, shape=(None,3)) 
y = tf.placeholder(tf.float32, shape=(None,1)) 

pred = predict(x, weights, bias) 
pred_postactivation = tf.nn.sigmoid(pred) 

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=pred, labels=y)) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost) 

init = tf.global_variables_initializer() 

# graph 
with tf.Session() as sess: 
    sess.run(init) 

    for i in range(0, iters): 
     _, c = sess.run([optimizer, cost], feed_dict={x: x_data, y: y_data}) 
     if i % 100 == 0: 
      print("cost: " + str(c)) 

    print(sess.run(weights['w1'])) 
    print(sess.run(pred_postactivation, feed_dict={x: x_test})) 

出力する:

cost: 1.23954 
cost: 0.583582 
cost: 0.455403 
cost: 0.327644 
cost: 0.230051 
cost: 0.165296 
cost: 0.123712 
cost: 0.0962315 
cost: 0.0772587 
cost: 0.0636141 
[[ 0.94488049 0.78105074 0.81608331 1.75763154 -4.47565413] 
[-2.61545444 0.26020721 0.151407 1.33066297 1.00578034] 
[-1.2027328 0.05413296 -0.13530347 -0.39841765 0.16014417]] 
[[ 0.92521071] 
[ 0.05481482] 
[ 0.07227208]]