Tensorflow无法正确识别列表中的数字

时间:2017-07-13 13:21:12

标签: python list tensorflow

您好我遇到了Tensorflow不喜欢我为训练数据选择的数字的问题。我已经从Tensorflow“入门”教程中借用了代码,但我已经将x_trainy_train坐标数据列表与另一个坐标相关联。

import numpy as np
import tensorflow as tf

# Model parameters
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# training data
x_train = [1.0,  1.5  ,3.0,   6.0, 8.0, 9.0,   11.0,  12.0,38.0  ,41.0, 82.0]
y_train = [9.5,10.75,14.5,22.0,27.0,29.5,34.5,37,102.0,109.5,212.0]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
#print(sess.run(init))
for i in range(1000):
  sess.run(train, {x:x_train, y:y_train})

# evaluate training accuracy
curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x:x_train, y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

现在,代码会为列表Nanx_train中的值输出y_train。它适用的原始x_trainy_train数据是

x_train = [1,2,3,4]
y_train = [0,-1,-2,-3]

编辑:我期待Wb的值分别收敛到2.5和7.0。

1 个答案:

答案 0 :(得分:1)

问题在于优化器的学习率。由于您已将输入更改为具有非常不同比例的某些数组,因此模型的适当学习速率是不同的。您可以在输入中使用一些规范化技术来避免此类问题,但在这种情况下,您可以调整学习速率,直到找到正确的值。经过几次测试后,我发现在你的情况下,像1e-5这样的东西应该可以工作:

optimizer = tf.train.GradientDescentOptimizer(1e-5)

更一般地说,这种情况下的问题是你的输入分布很不均匀。大多数例子都在40以下,但是你有大约100个,一个超过200个;这些最后三个对训练更新的影响将大于其他所有,因此,例如,如果其中一个有一些噪音,它将对整个模型产生很大的影响。