最近在学习tensorflow,用优快云记录一下学习的过程
本次代码实现简单的线性回归,数据拟合,代码比较简单没有用到bp算法,只是熟悉一下tensorflow网络的搭建
#线性回归的案例
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#使用numpy生成200个随机点
x_data = np.linspace(-0.5,0.5,200)[:,np.newaxis]#数据维度是200行一列,newaxis增加维度
noise = np.random.normal(0, 0.02, x_data.shape)
y_data = np.square(x_data) + noise
#定义两个placeholder
x = tf.placeholder(tf.float32,[None,1]) #行不确定,一列
y = tf.placeholder(tf.float32,[None,1])
#定义神经网络中间层
#相当于有10个神经元
Weight_L1 = tf.Variable(tf.random_normal([1,10]))#一行十列,normal和numpy中语法有差别
biases_L1 = tf.Variable(tf.zeros([1,10]))
#tf.matmul()将矩阵a乘以矩阵b,生成a * b
#这里一直不是很懂,乘法以后是200*10的矩阵,加上偏置以后还是200*10的,相当于整个矩阵加的
#偏置生成了200*10的偏置,每一行都是相同的
#这里不能用线性代数矩阵运算的思维,不然两个矩阵是不能相加的
Wx_plus_b_L1 = tf.matmul(x,Weight_L1)+biases_L1 #200*10大小的矩阵
#中间层的输出,用tanh作为激活函数
L1 = tf.nn.tanh(Wx_plus_b_L1)
#定义神经网络输出层
Weight_L2 = tf.Variable(tf.random_normal([10,1]))
biases_L2 = tf.Variable(tf.zeros([1,1]))
Wx_plus_b_L2 = tf.matmul(L1,Weight_L2) + biases_L2
prediction = tf.nn.tanh(Wx_plus_b_L2)
#二次代价函数
loss = tf.reduce_mean(tf.square(y-prediction))
#使用梯度下降法训练,这里有好多优化器可以选择,下次专门学一下
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for _ in range(2000):
sess.run(train_step,feed_dict={x:x_data,y:y_data})
#获得预测值
prediction_value = sess.run(prediction,feed_dict={x:x_data})
#画图
plt.figure()
plt.scatter(x_data,y_data)
plt.plot(x_data,prediction_value,'r-',lw=5)
plt.show()
写代码的一些困惑或者感悟:
1.numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
在指定的间隔内返回均匀间隔的数字。
返回num均匀分布的样本,在[start, stop]。
这个区间的端点可以任意的被排除在外。
具体使用:https://blog.youkuaiyun.com/you_are_my_dream/article/details/53493752
2.数据x是[n,1]大小的,我们这里的样本是一个一个点,如果样本换成图片的话,可以将样本集里的每一张图片变成一行,这样一行代表一张图片,即一个样本,而行数,代表样本的数量,列数表示图片的大小
3.matmul和multiply是有区别的,matmul就是传统的线性代数的矩阵乘法,这里是【200,1】*【1,10】得到【200,10】,10是神经元的个数,但Wx_plus_b_L1 = tf.matmul(x,Weight_L1)+biases_L1,这句话不是很能理解,如果按照正常矩阵加法,是不能运算的,可能tensorflow中+和add函数有区别??待议……………………
反正最后生成的矩阵大小是200*10的
4.本次没有用到bp算法,只是进行多次迭代,总共迭代了2000次,也就是数据x,总共用了2000次,这只是数据小的时候才能用,数据一大,肯定不能用这个网络………………比如训练图片的时候
5.train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
这一步,有许多优化器,我就随便选择了一个,下次试试别的。
结果图: