一个例子,在此记录。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
引入这三个库,matplotlib 用来画图的,后面会说到一点点。
这个例子是生成一些随机点(大体依照在x平方这个函数),然后用深度学习方法拟合它。
#使用numpy生成随机数据
x_data = np.linspace(-0.5,0.5,200)[:,np.newaxis]
noise = np.random.normal(0,0.02,x_data.shape)
y_data = np.square(x_data)+noise
numpy.linspace用法:
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) ,这里就是生成 -0.5 到 0.5之间均匀的
200个数。
np.newzxis 是给生成的数据多加一个维度。举例来看:
>> x = np.arange(3)
>> x
array([0, 1, 2])
>> x.shape
(3,)
>> x[:, np.newaxis]
array([[0],
[1],
[2]])
>> x[:, None]
array([[0],
[1],
[2]])
>> x[:, np.newaxis].shape
(3, 1)
冒号处代表了已知数据,再在这个已知数据上加一个维度。
np.random.normal()
参数的意义为:
loc:float 概率分布的均值,对应着整个分布的中心center
scale:float 概率分布的标准差,对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高
size:int or tuple of ints
输出的shape,默认为None,只输出一个值
我们更经常会用到np.random.randn(size)所谓标准正太分布(μ=0, σ=1),对应于np.random.normal(loc=0, scale=1, size)
按照正态分布生成噪声,比较科学。在x_data上加上噪声值,也就得到了y_data,也就是分布在x方函数周围的散点。
#定义两个placeholder
x = tf.placeholder(tf.float32,[None,1])
y = tf.placeholder(tf.float32,[None,1])
定义两个占位符,[None,1]表示多行,一列,实例化时候数据是多少行这里就是多少行了。注意None大写。
#定义神经网络中间层
Weights_L1 = tf.Variable(tf.random_normal([1,10]))
biases_L1 = tf.Variable(tf.zeros([1,10]))
Wx_plus_b_L1 = tf.matmul(x,Weights_L1)+biases_L1
L1 = tf.nn.tanh(Wx_plus_b_L1)
这里生成一个tensorflow的随机的1行10列的变量,代表权值,然后1行10列的全零变量代表偏置。L1代表第一层。为什么1行10列?因为只有一个输入,我们想构建十个神经元的网络。
然后用x*权值+偏置得到第一层的输出。tf.nn.tanh 是激励函数,我理解是平滑化(非线性函数)表示这个输出,具体见这个莫烦的教程吧。
#定义神经网络输出层
Weights_L2 = tf.Variable(tf.random_normal([10,1]))
biases_L2 = tf.Variable(tf.zeros([1,1]))
Wx_plus_b_L2 = tf.matmul(L1,Weights_L2)+biases_L2
prediction = tf.nn.tanh(Wx_plus_b_L2)
输出层的定义依然是权值加偏置,这里变成10行1列的随机数,是因为10个神经元,1个输出(后面解释为什么偏置是一个数而不是10行1列)。然后继续x*权值+偏置的方式,再通过激励函数生成predicton预测值。
#二次代价函数
loss = tf.reduce_mean(tf.square(y-prediction))
#梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
用y-预测值的平方均值,再用梯度下降法使它最小。
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})
#获得预测值,只需给定x
predicton_value = sess.run(prediction,feed_dict={x:x_data})
#画图
plt.figure()
#散点图
plt.scatter(x_data,y_data)
plt.plot(x_data,predicton_value,'r-',lw=5)
plt.show()
x*1行10列的矩阵得到1行10列的矩阵,再乘以第二层10行1列的矩阵会得到1行1列的数,所以输出层偏置是一个数。