Tensorflow踩坑记

这里是踩坑纪录,大家如果想看教程的话请出门右转~

从前有个小孩,正在学习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进行转化

你可能感兴趣的:(numpy,tensorflow,学习笔记)