实战案例一 非线性模型
重点是神经网络中间层的应用
import tensor as tf
import numpy as np
import matplotlib.pyplot as plt
#用np.linspace生成两百个在-0.5到0.5之间的随机值
因为需要使用的是二维数据,所以用np.newaxis加一个维度,成为200行一列的矩阵
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
#定义两个占位矩阵,行数不定,一列
x = tf.placeholder(tf.float32,[None,1])
y = tf.placeholder(tf.float32,[None,1])
## 定义神经网络中间层,用10个神经元作中间层,所以是1 - 10 - 1的构架 ##
#定义权值,1行10列
Weights_L1 = tf.Variable(tf.random_normal([1,10]))
#偏置值初始化为0
biases_L1 = tf.Variable(tf.zeros([1,10]))
#生成信号的总合(x矩阵乘以权值,然后加上偏置值)
Wx_plus_b_L1 = tf.matmul(x,Weight_l1) + biases_L1
#双矩阵生成信号的总合
L1 = tf.nn.tanh(Wx_plus_b_L1)
#定义神经网络输出层
中间层有10个神经元,输出层有1个神经元,所以权值这里从[1,10]变为[10,1]
Weights_L2 = tf.Variable(tf.random_normal([10,1]))
#偏侧值仍然只有1个神经元,所以是[1,1]
biases_L2 = tf.Variable(tf.zeros([1,1]))
#输出层的输入等于输出层的输出,所以x变为L1
Wx_plus_b_L2 = tf.matmul(L1,Weight_L2) + biases_L2
prediction = tf.nn.tanh(Wx_plus_b_L2)
#二次代价函数(见笔记1)
loss = tf.reduce_mean(tf.square(y - prediction))
#使用梯度下降法训练
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#定义会话
with tf.Session() as sess:
#变量初始化,训练2000次
sess.run(tf.global_variables_initializer())
for _ in range(2000):
sess.run(train_setp,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
因为有噪音,所以蓝色的点是上下移动。红线是训练好的神经网络。它对于整个蓝色样本模型的loss是最小的。
TensorFlow学习笔记(1) http://www.jianshu.com/p/25d53f2289f4