我构建了一个单神经元前馈网络。预测结果显示为0.5,但实际上应该显示为0.0。我对TensorFlow还不太熟,请帮助我。这是我的代码:
"""O---(w1)-\ \O---(w2)-->Sum ---> Sigmoid ---> O 3个输入和1个输出 /O---(w3)-/ | 输入 | 输出示例1 | 0 0 1 | 0 示例2 | 1 1 1 | 1示例3 | 1 0 1 | 1示例4 | 0 1 1 | 0"""import tensorflow as tffeatures = tf.placeholder(tf.float32, [None, 3])labels = tf.placeholder(tf.float32, [None])#随机权重W = tf.Variable([[-0.16595599], [0.44064899], [-0.99977125]], tf.float32)init = tf.initialize_all_variables()sess = tf.Session()sess.run(init)predict = tf.nn.sigmoid(tf.matmul(features, W))error = labels - predict# 训练optimizer = tf.train.GradientDescentOptimizer(0.01)train = optimizer.minimize(error)for i in range(10000): sess.run(train, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: [0, 1, 1, 0]})training_cost = sess.run(error, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: [0, 1, 1, 0]})print('训练成本 = ', training_cost, 'W = ', sess.run(W))print(sess.run(predict, feed_dict={features:[[0, 1, 1]]}))
我还手动使用numpy构建了这个模型,运行得很好。
编辑:我尝试了所有类型的成本函数,包括 tf.reduce_mean(predict-labels)**2)
回答:
你有两个错误
(a) 你的原始错误函数优化了错误的目标
(b) 你的目标向量被转置了。以下这行代码可以显示出来 print(sess.run(predict-label, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: [0, 1, 1, 0]})}))
结果是一个4×4的矩阵。
你可以使用以下代码达到预期的结果
import tensorflow as tffeatures = tf.placeholder(tf.float32, [None, 3])labels = tf.placeholder(tf.float32, [None,1])#随机权重W = tf.Variable([[10.0], [000.0], [0.200]], tf.float32)init = tf.initialize_all_variables()with tf.Session() as sess: sess.run(init) predict = tf.nn.sigmoid(tf.matmul(features, W)) print(sess.run(predict, feed_dict={features:[[0, 1, 1]]})) lbls= [[0], [1], [1], [0]] print(sess.run(predict, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels:lbls})) # error = labels - predict error = tf.reduce_mean((labels - predict)**2) # 训练 optimizer = tf.train.GradientDescentOptimizer(10) train = optimizer.minimize(error) for i in range(100): sess.run(train, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: lbls}) training_cost = sess.run(error, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: lbls}) classe = sess.run((labels-predict), feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: lbls}) print('训练成本 = ', training_cost, 'W = ', classe) print(sess.run(predict, feed_dict={features: [[0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]]}))