Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TensorFlow MLP未训练XOR_Python_Machine Learning_Neural Network_Tensorflow_Supervised Learning - Fatal编程技术网

Python TensorFlow MLP未训练XOR

Python TensorFlow MLP未训练XOR,python,machine-learning,neural-network,tensorflow,supervised-learning,Python,Machine Learning,Neural Network,Tensorflow,Supervised Learning,我用谷歌的图书馆建立了一个MLP。网络正在运行,但不知何故它拒绝正确学习。无论实际输入是什么,它总是收敛到接近1.0的输出 可以看到完整的代码 有什么想法吗 输入和输出(批量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.float

我用谷歌的图书馆建立了一个MLP。网络正在运行,但不知何故它拒绝正确学习。无论实际输入是什么,它总是收敛到接近1.0的输出

可以看到完整的代码

有什么想法吗


输入和输出(批量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))

输出层配置

# 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
cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
                   feed_dict={n_input: input_data, n_output: output_data})
(...)
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]]
我尝试了交叉熵的两种设置:

# 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))

其中,
n\u output
output\u data
中描述的原始输出,
output
是我的网络的预测值/计算值


for循环中的训练(对于n个时代)如下所示:

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
cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
                   feed_dict={n_input: input_data, n_output: output_data})
(...)
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]]
我正在将结果保存为cvalues,以便调试打印
丢失
隐藏


无论我尝试了什么,当我测试我的网络,尝试验证输出时,它总是产生如下结果:

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
cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
                   feed_dict={n_input: input_data, n_output: output_data})
(...)
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,无论输入的是什么。

我不能评论,因为我没有足够的声誉,但我对这个答案有一些疑问。$L_2$损失函数是有意义的,因为它基本上是MSE函数,但是为什么交叉熵不起作用呢?当然也适用于其他NN LIB。其次,为什么从$[0,1]->[-1,1]$转换输入空间会有任何影响,特别是因为添加了偏差向量

编辑这是一个使用交叉熵和从多个来源热编译的解决方案 编辑^2将代码更改为使用交叉熵,无需任何额外编码或任何奇怪的目标值移动

import math
import tensorflow as tf
import numpy as np

HIDDEN_NODES = 10

x = tf.placeholder(tf.float32, [None, 2])
W_hidden = tf.Variable(tf.truncated_normal([2, HIDDEN_NODES]))
b_hidden = tf.Variable(tf.zeros([HIDDEN_NODES]))
hidden = tf.nn.relu(tf.matmul(x, W_hidden) + b_hidden)

W_logits = tf.Variable(tf.truncated_normal([HIDDEN_NODES, 1]))
b_logits = tf.Variable(tf.zeros([1]))
logits = tf.add(tf.matmul(hidden, W_logits),b_logits)


y = tf.nn.sigmoid(logits)


y_input = tf.placeholder(tf.float32, [None, 1])



loss = -(y_input * tf.log(y) + (1 - y_input) * tf.log(1 - y))

train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

init_op = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init_op)

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


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


for i in xrange(2000):
  _, loss_val,logitsval = sess.run([train_op, loss,logits], feed_dict={x: xTrain, y_input: yTrain})

  if i % 10 == 0:
    print "Step:", i, "Current loss:", loss_val,"logits",logitsval

print "---------"
print sess.run(y,feed_dict={x: xTrain})

与此同时,在一位同事的帮助下,我修复了我的解决方案,并希望发布完整的解决方案。我的解决方案在不改变训练数据的情况下使用交叉熵。此外,它具有所需的输入形状(1,2),并且输出为标量

它使用了
AdamOptimizer
,它比
gradientdescentomptimizer
更快地减少了误差。有关优化器的更多信息(&问题^^^)

事实上,我的网络仅在400-800个学习步骤中就产生了相当好的效果

经过2000个学习步骤后,输出几乎“完美”:



您的
b_hidden
变量是一个标量-这是故意的吗?我认为应该将其创建为
b_hidden=tf.Variable(tf.constant(0.1,shape=[hidden_nodes]),name=“hidden_bias”)
,这可能会有所帮助。另一个尝试是在输出层中添加一个
b_输出
bias项。谢谢您的评论。事实上,我只是没有注意到
b_hidden
也应该是一个向量,而不是一个标量……然而,对于每个输入,网络仍然收敛到接近1.0,无论有无隐藏偏差,作为标量或向量,无论输出层有无偏差。我真的认为我在学习方法或网络架构中遗漏了一些错误:/使用交叉熵来解决XOR作为分类问题当然是可能的(我回答了前面的一个问题:)。这个问题是作为回归问题提出的,MSE更适合于回归问题。我不太清楚为什么需要重新缩放输入数据,但可能它陷入了局部最小值?好吧,也许,但XOR错误曲面是否包含局部最小值?或者只有一个本地min,即全球minAlso:为什么没有一个热的MINAL就不能工作!如果你可能是一维的目标,改变相应的权重矩阵,它就不起作用了——吹到南斯——我不确定整个张量流是否更适合NNI。我刚刚编辑了我的答案,指出重新缩放不是绝对必要的(只是需要更长的时间才能收敛到给定的学习速度)。不确定需要一个hot是什么意思:我的答案没有使用它。也许你可以把你的问题作为一个单独的问题来提出?当然,为什么yTrain=np。当所需的输出是1-d[0,1,1],数组([[1,0],[0,1],[1,0])需要是二维的?