TensorFlow MLP不训练XOR

丹尼尔451

我已经使用Google的TensorFlow构建了一个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

我的学习方法如下:

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

我尝试了交叉熵的两种设置

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

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

n_output所述的原始输出output_dataoutput我的网络的预测/计算值在哪里。


for循环内部培训(n个时期)是这样的:

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

我节省了成果cvalues用于调试printig lossW_hidden...


无论我尝试了什么,当我测试网络时,尝试验证输出时,它总是会产生类似以下内容:

(...)
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。

丹尼尔451

同时,在同事的帮助下,我能够修复我的解决方案,并希望将其发布完整。我的解决方案适用于交叉熵而无需更改训练数据另外,它具有所需的输入形状(1、2)输出为标量

它利用了AdamOptimizer其减小误差小于更快GradientDescentOptimizer有关优化器的更多信息,请参阅此帖子(&问题^^)。

实际上,我的网络仅需400-800个学习步骤即可产生相当不错的结果。

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

step: 2000
loss: 0.00103311243281

input: [0.0, 0.0] | output: [[ 0.00019799]]
input: [0.0, 1.0] | output: [[ 0.99979786]]
input: [1.0, 0.0] | output: [[ 0.99996307]]
input: [1.0, 1.0] | output: [[ 0.00033751]]

import tensorflow as tf    

#####################
# preparation stuff #
#####################

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

# create a placeholder for the input
# None indicates a variable batch size for the input
# one input's dimension is [1, 2] and output's [1, 1]
n_input = tf.placeholder(tf.float32, shape=[None, 2], name="n_input")
n_output = tf.placeholder(tf.float32, shape=[None, 1], name="n_output")

# number of neurons in the hidden layer
hidden_nodes = 5


################
# hidden layer #
################

# hidden layer's bias neuron
b_hidden = tf.Variable(tf.random_normal([hidden_nodes]), name="hidden_bias")

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

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


################
# output layer #
################

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


############
# learning #
############
cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))
# cross_entropy = tf.square(n_output - output)  # simpler, but also works

loss = tf.reduce_mean(cross_entropy)  # mean the cross_entropy
optimizer = tf.train.AdamOptimizer(0.01)  # take a gradient descent for optimizing with a "stepsize" of 0.1
train = optimizer.minimize(loss)  # let the optimizer train


####################
# initialize graph #
####################
init = tf.initialize_all_variables()

sess = tf.Session()  # create the session and therefore the graph
sess.run(init)  # initialize all variables  

#####################
# train the network #
#####################
for epoch in xrange(0, 2001):
    # run the training operation
    cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
                       feed_dict={n_input: input_data, n_output: output_data})

    # print some debug stuff
    if epoch % 200 == 0:
        print("")
        print("step: {:>3}".format(epoch))
        print("loss: {}".format(cvalues[1]))
        # print("b_hidden: {}".format(cvalues[3]))
        # print("W_hidden: {}".format(cvalues[2]))
        # print("W_output: {}".format(cvalues[4]))


print("")
print("input: {} | output: {}".format(input_data[0], sess.run(output, feed_dict={n_input: [input_data[0]]})))
print("input: {} | output: {}".format(input_data[1], sess.run(output, feed_dict={n_input: [input_data[1]]})))
print("input: {} | output: {}".format(input_data[2], sess.run(output, feed_dict={n_input: [input_data[2]]})))
print("input: {} | output: {}".format(input_data[3], sess.run(output, feed_dict={n_input: [input_data[3]]})))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TensorFlow模型不执行任何训练

来自分类Dev

Tensorflow 不训练 CIFAR - 100 数据

来自分类Dev

在TensorFlow中获取一个简单的MLP以对XOR建模

来自分类Dev

在TensorFlow中获得一个简单的MLP以对XOR建模

来自分类Dev

XOR Tensorflow不收敛

来自分类Dev

TensorFlow网络无法训练?

来自分类Dev

Tensorflow RNN序列训练

来自分类Dev

使用队列Tensorflow训练模型

来自分类Dev

TensorFlow Dataset训练/测试拆分

来自分类Dev

TensorFlow 动态 RNN 未训练

来自分类Dev

Tensorflow:可训练变量掩蔽

来自分类Dev

TensorFlow:无法加载训练模型

来自分类Dev

tensorflow/keras 训练模型 keyerror

来自分类Dev

Tensorflow不共享变量

来自分类Dev

TensorFlow XOR NN eval 函数错误

来自分类Dev

TensorFlow:用我自己的图像进行训练

来自分类Dev

使用预训练的(Tensorflow)CNN提取特征

来自分类Dev

Tensorflow:在单独的功能中训练和测试

来自分类Dev

训练tensorflow中的一些变量

来自分类Dev

使用TensorFlow训练不平衡数据

来自分类Dev

如何使用Tensorflow在C ++中训练模型?

来自分类Dev

Tensorflow while_loop用于训练

来自分类Dev

TensorFlow对象检测API评估训练效果

来自分类Dev

无法在简单的数据集上训练Tensorflow

来自分类Dev

训练不同形状时的Tensorflow concat

来自分类Dev

Tensorflow在离线中使用预训练模型

来自分类Dev

如何使用Tensorflow在C ++中训练模型?

来自分类Dev

受过训练的TensorFlow NN的最大/最小

来自分类Dev

Tensorflow初始重新训练:创建瓶颈文件