带线性函数的Tensorflow学习XOR,即使它不应该';T

带线性函数的Tensorflow学习XOR,即使它不应该';T,tensorflow,neural-network,Tensorflow,Neural Network,我正在tensorflow中实现一个简单的网络,出于教学目的,我试图证明线性变换: yhat = w(Wx + c) + b 无法学习XOR。但现在的问题是,在我当前的实现中,它确实存在!这表明代码中存在错误。请澄清 ############################################################ ''' dummy data ''' x_data = [[0.,0.],[0.,1.],[1.,0.],[1.,1.]] y_data = [[0]

我正在tensorflow中实现一个简单的网络,出于教学目的,我试图证明线性变换:

yhat = w(Wx + c) + b
无法学习XOR。但现在的问题是,在我当前的实现中,它确实存在!这表明代码中存在错误。请澄清

############################################################
'''
    dummy data
'''
x_data = [[0.,0.],[0.,1.],[1.,0.],[1.,1.]]
y_data = [[0],[1],[1],[0]]

############################################################
'''
    Input and output
'''
X = tf.placeholder(tf.float32, shape = [4,2], name = 'x')
Y = tf.placeholder(tf.float32, shape = [4,1], name = 'y')

'''
    Network parameters
'''
W = tf.Variable(tf.random_uniform([2,2],-1,1), name = 'W')
c = tf.Variable(tf.zeros([2])                , name = 'c')
w = tf.Variable(tf.random_uniform([2,1],-1,1), name = 'w')
b = tf.Variable(tf.zeros([1])                , name = 'b')

############################################################
'''
    Network 1:

    function: Yhat = (w (x'W + c) + b)
    loss    : \sum_i Y * log Yhat
''' 
H1    = tf.matmul(X,  W) + c
Yhat1 = tf.matmul(H1, w) + b


cross_entropy1 = -tf.reduce_sum(
                Y*tf.log(
                        tf.clip_by_value(Yhat1,1e-10,1.0)
                        )
                )

step1 = tf.train.AdamOptimizer(0.01).minimize(cross_entropy1)

'''
    Train
'''

writer = tf.train.SummaryWriter("./logs/xor_logs.graph_def")
graph1 = tf.initialize_all_variables()
sess1  = tf.Session()
sess1.run(graph1)

for i in range(100):
    sess1.run(step1, feed_dict={X: x_data, Y: y_data})


'''
    Evaluation
''' 
corrects = tf.equal(tf.argmax(Y,1), tf.argmax(Yhat1,1))
accuracy = tf.reduce_mean(tf.cast(corrects, tf.float32))
r        = sess1.run(accuracy, feed_dict={X: x_data, Y: y_data})
print ('accuracy: ' + str(r * 100) + '%')

现在的精度为
100%
,即使它应该为
75%
tf。argmax(Y,1)将返回[0,0,0,0]。这不是你想要的。

你能提出一个解决方案吗?为什么argmax(Y,1)给我[0,0,0,0]?argmax给你沿轴的最大值的索引。因此,我们在目标为1 hot时使用它,例如(例如,10位数字中的1位)。您的Y值不是1 hot,它们只是长度为1的目标,因此argmax只返回0。所以,要么让它们成为一个热点(即[1,0],[0,1],[0,1],[1,0]]),要么修正你的正确性函数,只针对Y而不是argmax(Y,1)进行测试,但当我这样做时,
corrects2=tf.equal(tf.cast(Y,tf.int64),tf.argmax(Yhat2,1))
,现在即使是非线性函数也能输出50%的精度。太棒了!所以现在想想(或者打印出来)tf.argmax(YHat2,1)返回了什么。这就是你真正想要的吗?