这里是踩坑纪录,大家如果想看教程的话请出门右转~
从前有个小孩,正在学习TF,一开始,写了个逻辑回归的优化程序:
import tensorflow as tf
import numpy as np
x=tf.placeholder("float")
y=tf.placeholder("float")
w=tf.Variable([1.0,2.0],name='w')
y_pred=tf.mul(x,w[0])+w[1]
error=tf.square(y-y_pred)
train_op=tf.train.GradientDescentOptimizer(0.02).minimize(error)
model=tf.initialize_all_variables()
with tf.Session() as session:
session.run(model)
for i in range(1000):
x_value=np.random.rand()
y_value=x_value*2+6
session.run([train_op],feed_dict={x:x_value,y:y_value})
w_value=session.run(w)# get w
print "ax+b,a=%.3f,b=%.3f"%(w_value[0],w_value[1])
这个函数能够很好地运行,输出结果:
ax+b,a=2.057,b=5.965
后来,这个小孩想把误差画成图,看看自己的成就,于是就加了一个列表errors来保存每次的输出,并在执行的时候每次都输出error值改过的的地方如下:
errors=[]
with tf.Session() as session:
session.run(model)
for i in range(1000):
x_value=np.random.rand()
y_value=x_value*2+6
_,error=session.run([train_op,error],feed_dict={x:x_value,y:y_value})#
errors.append(error) #
结果,执行的时候报错:TypeError!最后找到根源是error输入:是np.float类型,must be a string or Tensor for operation,不然无法执行该操作。
小孩马上就把输入改了,变成下面这样,以为就没有问题了:
x_value=tf.random_normal((1,),mean=5,stddev=2.0)
结果发现还是报错了:TypeError:The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.意思就是feed的输入不能是一个Tensor!这个小孩的内心其实是崩溃的!!!!!!刚从np格式改过来,难到又要改回去?改回去肯定报刚才的错,于是,小孩改成了这样:
with tf.Session() as session:
session.run(model)
for i in range(1000):
# x_value=np.random.rand() #TypeError,must be a string or Tensor for operation
x_value=tf.random_normal((1,),mean=5,stddev=2.0)
y_value=x_value*2+6
x_r,y_r=session.run([x_value,y_value])
_,error_value=session.run([train_op,error],feed_dict={x:x_r,y:y_r})
# error_value=session.run(error) can't work
errors.append(error_value)
print type(x_r)
w_value=session.run(w)# get w
print "ax+b,a=%.3f,b=%.3f"%(w_value[0],w_value[1])
import matplotlib.pyplot as plt
plt.plot([np.mean(errors[i-50:i]) for i in range(len(errors))])
plt.show()
plt.savefig("errors.png")
终于正常输出值来
ax+b,a=2.004,b=5.979
Tips:最近发现,在tf中有个函数可以将numpy中的ndarray转化为tensor,那就是tf.convert_to_tensor(),为了避免后面不必要的麻烦,建议使用这个方法对ndarray进行转化