我们会首先创建一个近似线性分布;之后,我们会使用一个线性方程,通过最小化误差函数(最小方差法),来拟合这个分布.
利用训练后的模型,对于一个新的样本,我们能够预测它的输出.
1.数据集描述
对于这个样例,我们会通过一个线性方程和一些噪声,生成一个人工数据集
#均匀的返回101个-1至1之间的数组
trX = np.linspace(-1,1,101)
#β1=2 β0=0.2 并加入0.4的噪音
trY = 2*trX + np.random.randn(*trX.shape)*0.4+0.2
使用以下代码,我们同时绘制出散点图和理想的线性方程。
plt.figure() plt.scatter(trX,trY) plt.plot(trX,0.2+2*trX) plt.show()
2.模型结构
(1)首先创建一个变量来保存x和y轴的数值,然后我们符号化定义输入x和权值w相乘的操作.
(2)生成一些变量并赋予初始值,来启动模型.
X = tf.placeholder("float", name="X") Y = tf.placeholder("float", name = "Y")
(3)我们为模型先声明一个name_scope,我们能够把这个域(scope)内的变量和操作看作一个同质实体,在这个域内,我们先定义一个方程,用来计算变量x乘上权重(斜率),加上偏差.然后我们定义一个用来存放权重(斜率)和偏差的变量.这些变量在计算过程中不断变化,最后将定义的model的返回值赋给y_model变量.
从下面的tensorBoard中,我们可以看到损失函数(CosFunction)的操作.放大model区域,我们可以看到乘法操作和加法操作,还可以看到参数变量b0和b1,还有对模型的梯度操作
3.损失函数描述和Optimizer
在损失函数(cost function)中,我们创建一个域(scope)来包含所有的操作,使用之前创建的y_model来计算y轴值.
with tf.name_scope("CostFunction"): cost = (tf.pow(Y-y_model, 2))
定义Optimizer的时候,我们首先初始化一个GradientDescentOptimizer,并将步长设置为0.05,这是一个经验值,有助于收敛。
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)
创建一个会话,并将初始化的变量保存起来,方便我们在TensorBoard上查看。本例中,我们会将每次迭代的最后一个误差结果作为一个标量保存起来。我们也需要将TensorFlow生成的图结构保存,用于以后查看。
sess = tf.Session() init = tf.initialize_all_variables() tf.train.write_graph(sess.graph,'/home/ubuntu/linear','graph.pbtxt') cost_op = tf.scalar_summary("loss", cost) merged = tf.merge_all_summaries() sess.run(init) writer = tf.train.SummaryWriter('/home/ubuntu/linear',sess.graph)
在模型训练阶段,我们设置迭代100次,每次我们通过将样本输入模型,进行梯度下降操作。每次迭代之后,绘制出模型曲线,并将最后的误差值存入summary。
In[]: for i in range(100): for (x, y) in zip(trX, trY): sess.run(train_op, feed_dict={X:x, Y:y}) summary_str = sess.run(cost_op, feed_dict={X:x, Y:y}) writer.add_summary(summary_str, i) b0temp=b.eval(session=sess) b1temp=w.eval(session=sess) plt.plot (trX, b0temp + b1temp * trX )
放大CostFunction域,我们能够看到乘方和减操作,如图3-6所示,它们也被写入了summary中。
4.停止条件
本例的停止条件为执行迭代100次
5.结果描述
现在我们来检查参数的结果,打印run的w和b的变量的输出。
printsess.run(w) # Should be around 2 printsess.run(b) #Should be around 0.2 2.09422 0.256044
我们可以图像化地查看我们的数据结果,并绘制出最终直线
plt.scatter(trX,trY) plt.plot (trX, testb + trX * testw)
现在我们在TensorBoard中查看数据结果
TensorBoard的启用,需要指定日志目录,执行以下命令:
$ tensorboard ——logdir=.
TensorBoard会加载日志目录中的事件和图形文件,并监听6006口。你可以在浏览器中输入“localhost:6006”,然后就能在浏览器中看到类似于图3-8的TensorBoard的仪表盘。