我刚刚学会了tensorflow。我尝试运行一个简单的回归示例,但结果不好。
我的输入X是一个10x10000的矩阵,也就是说,每个数据是一个10x1的向量,总共10000个数据。
所需的输出Y只是X的第一行。
我的代码如下:
import tensorflow as tf
import numpy as np
from numpy.random import RandomState
rdm=RandomState(1)
data_size=10000
xdim=10
X=rdm.rand(data_size,xdim)
Y = [x1[0] for x1 in X]
x=tf.placeholder(tf.float32,shape=(None,xdim))
y=tf.placeholder(tf.float32,shape=(None))
#logits = modelFun(x)
Weights = tf.Variable(tf.random_normal([xdim, 1]))
biases = tf.Variable(0.1)
logits = tf.matmul(x, Weights) + biases
loss = tf.reduce_mean(tf.square(logits - y))
optimizer = tf.train.GradientDescentOptimizer(0.005).minimize(loss)
batch_size=50
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
steps=20001
for i in range(steps):
start = i * batch_size % data_size
end = min(start + batch_size,data_size)
sess.run(optimizer,feed_dict={x:X[start:end],y:Y[start:end]})
if i % 5000 == 0:
ypred,training_loss= sess.run([logits,loss],feed_dict={x:X,y:Y})
print("Epoch %d: loss=%g"%(i,training_loss))
输出结果如下:
Epoch 0: loss=6.31555
Epoch 5000: loss=0.0798763
Epoch 10000: loss=0.0797333
Epoch 15000: loss=0.0797259
Epoch 20000: loss=0.079724
它不能下降到0.0797。 我查看了部分输出。他们远非正确答案。
>>>print(ypred[:10].T[0])
[ 0.49342471 0.49475971 0.50192004 0.48912409 0.50592101 0.48473218 0.48652697 0.50261581 0.50218904 0.48906678]
>>>print(np.array(Y[:10]))
[ 0.417022 0.41919451 0.80074457 0.09834683 0.98886109 0.01936696 0.10233443 0.90340192 0.88330609 0.11474597]
这是什么原因?怎么解决? 谢谢你的帮助!
答案 0 :(得分:0)
你从模型中要求太多。你正在生成10000点的十维随机数据,因此没有结构可供学习,然后用单个神经元进行线性回归;你的模型甚至没有能力记住你的输入,所以猜测每y
约为0.5是最好的。
最大的问题是随机输入。大多数类型的机器学习模型对他们尝试学习的结构做出了强有力的假设,而随机数据也没有这种结构。一个足够大的神经网络可以记住你的输入数据,并给你一个低的训练错误,但它完全不能概括(测试错误会很高),并且通用化通常是目标。