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

导语

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][100100]

进行矩阵相乘,然后再在他们所的到的结果的基础上加上0.3。所以,也就是
y=0.1x(1)+0.2x(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()之后进行输出:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值