天天看点

1.线性回归(Tensorflow)

代码参考Tensorflow入门、原理与进阶实战 作者:李大学

  1. 创建数据集并展示
# tensotflow 展示 数据集
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

# 创建等距数据集并展示,numpy中的linspace 是在 -1,1这个距离中等距分割100个点
train_x = np.linspace(-1,1,100)
# *可以取出列表中的值比如 [1,2,3] 取出来的是 1 2 3 可以试一下,这个值可以当成参数传入函数 但不能赋值 比如 list1=[1,2,3] x,y,z = *list1
train_y = 2*train_x+np.random.randn(*train_x.shape)*0.3
# 这个函数的意思是拿 x y 进行画图 颜色是 r red 图形为 o 圆 这个详情可以查这个函数的参数
plt.plot(train_x,train_y,"ro",label="original data")
# 展示 这个可以看生成图的左上角 注释这行代码做一下对比
plt.legend()
plt.show()
           
  1. 基于创建的数据集,进行网络设计和优化
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

# 创建数据集
train_x = np.linspace(-1,1,100)
train_y = 2*train_x+np.random.randn(*train_x.shape)*0.3

# 构造数据填充
X = tf.placeholder(float)
Y = tf.placeholder(float)

# 前向传播
w = tf.Variable(tf.truncated_normal([1]),tf.float32)
b = tf.Variable(tf.zeros([1]))
y = tf.multiply(w,X)+b

# 反向传播
learning = 0.01
loss = tf.reduce_mean(tf.square(Y -y))
optimizer = tf.train.GradientDescentOptimizer(learning).minimize(loss)

# 开始训练 1.初始化 2.循环优化参数 3. 输出实验
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for i in range(20):
        for (x_,y_) in zip(train_x,train_y):
            sess.run(optimizer,feed_dict={X:x_,Y:y_})
        if i %2 == 0:
            cost = sess.run(loss,feed_dict={X:train_x,Y:train_y})
            print("epoch is {} loss is {}".format(i+1,cost))
    result = sess.run(y,feed_dict={X:0.2})
    print("x is 0.2 y is {}".format(result))

           
  1. 遇到的问题与解决

    3.1 TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a float64 into a Tensor.

    这个 也是我遇到的一个tensorflow错误 问题是不能解析feed_dict 中的key作为一个tensor 。

    这个是因为将tensorflow中的 feeddict中的键设置错误。比如 你可以 sess.run(optimizer,feed_dict={X:x_,Y:y_}) 中的 Y 改为 y_试试。

    3.2 TypeError: Fetch argument 2.2042777245347644 has invalid type <class ‘numpy.float64’>, must be a string or Tensor. (Can not convert a float64 into a Tensor or Operation.)

    这个问题 大概意思是捕捉到了了一个参数 是无效numpy类型,必须是string或者tensor才可以。当时不知道是哪里的问题也不知道怎么调试,多次尝试才知道定义变量是重名了导致传入到sess.run()中的数据不是自己想象中想要的那个,传入了一个值。 我这个错误是因为这一行代码 sess.run(y,feed_dict={X:0.2}) y改为y_。大家可以试试。

  2. 总结:

    这个代码本身比较简单,结构也很好理解其实就是利用tensorflow去构建一个线性函数取实现Y = WX+b的参数优化。调试过很多代码,但是等到自己亲自写代码的石猴就会发现很多错误。而且上面的两个错误我都调试了好久,才发现问题的根源,刚开始错误的原因都定位错了。这两个错误也是比较low的错误,之前我也没遇到过这次遇见两个也算是长见识了。吃一堑长一智。

    第一个错误当时以为是传入的数据不是张量。

    第二个错误当时也以为是传入数据的问题。

    后来多次调试才发现是变量命名错误引起的。切记切记,命名很重要,但是我还是命名很差劲怎么破。

继续阅读