您的位置:首页 > 编程语言 > Python开发

TensorFlow(1)---官方文档简介中所给demo的解说

2017-11-07 15:23 441 查看

导语

emmm最近想要入tensorflow,为此还专门装了个ubuntu双系统(因为貌似tensorflow只在linux上支持python2.7),官方不是给了段关于简单实用tensorflow实现平面拟合的代码吗,好像对于我这种小白来说,其中的一些语法不能一眼看懂,所以就记录一下咯~

开始讲解

import tensorflow as tf
import numpy as np


这是本次将要使用到的库

x_data = np.float32(np.random.rand(2, 100)) # 随机输入
y_data = np.dot([0.100, 0.200], x_data) + 0.300


这里的x_data是一个包含两个列表的列表,然后其中的每个列表都是一个含有100个元素的列表

这里的y_data是先使用了一个np.dot()方法,这个方法的作用就是做积,且若我们传入的是二维的向量,它就会做矩阵乘法,例如在这个例子中,我们就是让

[0.1,0.2]⋅[100个随机数另外100个随机数]

进行矩阵相乘,然后再在他们所的到的结果的基础上加上0.3。所以,也就是y=0.1⋅x(1)+0.2⋅x(2)+0.3

用该方程得到的一系列的三维空间的点。

b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b


这里就使用到了tensorflow中的Variable的方法,具体Variable的作用我们暂且将它当作定义变量的方法吧。在Variable()中其实时可以输入Tensor,即张量,即任意维度的量。那么张量该如何来表示呢?

tf.zeros([1])和tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))即为两种为张量的变量。


然后这里的y也通过b和W这两个变量成为了Variable元素(与b,W不同,y这个Variable是基于b和W和x_data而生成的),tf.matmul表示矩阵的乘法。

所以,到目前我们已经有b,W,y这三个Variable了。

# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)


其中的loss第一眼看就大概能够明白它是用来求平均的,而tf.square(y-y_data)的含义是平方,那么将差距的平方求和再取平均这不就是方差的定义吗~

回顾现在已有的变量,已经有了虚拟数据y和真实数据y_data,而我们的目的是要找到一个平面去拟合所有的真实数据,将计算出来的y与y_data作差,那么显然他们的差距越小,拟合的效果也就越好。所以也就是loss这个变量越小,拟合的结果也就越好。

那么代码中对optimizer的定义,其作用就可以类似与sklearn中对分类其clf的定义了,其目的主要是想说明用哪种方法来进行学习。这里是使用的GradientDescentOptimizer,也就是梯度下降了。使用该方法需要输入一个参数0.5(这里我们不细说这个参数是什么了)

然后再将要做的事情汇总在train这个变量中,即使用梯度下降发对loss这个变量进行最小化,通过改变Variable:b和W。该做的准备工作基本已经做完,接着我们就开始将程序进行初始化训练

# 初始化变量
init = tf.initialize_all_variables()
# 启动图 (graph)
sess = tf.Session()
sess.run(init)


以上是将Variables变量进行初始化,然后启动图

# 拟合平面
for step in xrange(0, 201):
sess.run(train)
if step % 20 == 0:
print step, sess.run(W), sess.run(b)


然后这部分代码是对模型的训练,并在训练的过程中输出step和run,如果我们要输出loss的话,可以通过使用

with sess.as_default():
print loss.eval()


输出结果如下:



可以看到loss越来越小,即拟合的效果越来越接近~

另外这里补充一下如何输出张量的数值。emmm是可以将张量的数值输出出来的喔~(注意是输出Tensor的值,而不是输出Variable的值):



或者,如果目标张量时通过变量计算出来的话,可以在使用了with sess.as_default()之后进行输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python