Skip to main content
 首页 » 编程设计

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

2025年02月15日23zlslch

您好,我遇到了一个问题,即 Tensorflow 不喜欢我为训练数据选择的数字。我从 Tensorflow“入门”教程中借用了代码,但我用另一个坐标替换了 x_train 和 y_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)) 

现在代码为列表 x_train 和 y_train 中的那些值输出 Nan。它工作的原始 x_train 和 y_train 数据是

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

编辑:我期望 W 和 b 的值分别收敛到 2.5 和 7.0。

请您参考如下方法:

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

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

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