深度学习深度学习(十一)TensorFlow基础

TensorFlow用于进行深度学习的训练,比较常用。我们大多数TF是用于python'的,但是TF的编程过程和普通的python不一样,这个要适应一下才行。

TF是基于之前的深度学习基础的,所以要理解里面的内容,基础还是要学扎实,出门左转,见前面十篇讲解。

掌握基础后,建议先了解一下基本的TF概念,然后按照每个经典的模型进行学习(比如:神经网络,CNN,RNN)。因为每个模型其实代码都差不多,调整一下基本也就可以用于不同的场景。

多调试几次这些网络模型,后面再扩展的学习,那些就是高级用法了。

本章节先介绍基本的TF概念。

TF的基本运行模式:建图->启动图->运行取值

这里的建图其实是数学模型,这个模型是用图表达的,比如这种图:

图瞅一眼就可以了,不用深入理解,只是要大家知道,TF是先建立数学模型(先不计算)然后再导入数据用模型计算的。

那么为了建立模型,TF用张量标识模型中要计算的代数,比如,x,y等。

TF中,有三类张量:

1. 常量constant

import tensorflow as tf

# 创建一个 常量 op, 返回值 'matrix1' 代表这个 1x2 矩阵.
matrix1 = tf.constant([[3., 3.]])

# 创建另外一个 常量 op, 返回值 'matrix2' 代表这个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])

# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)

2. 变量

state = tf.Variable(0, name="counter")

什么时候用变量?通常是在我们整个计算过程中,需要不断迭代的那些代收,我们就做成变量。比如前章节做梯度下降算法时的w,这个w用梯度下降时,就是不断的从初值开始不断的迭代变化的。所以这个地方用变量,给个例子:

# -创建一个变量, 初始化为标量 0.  初始化定义初值
state = tf.Variable(0, name="counter")

# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

3. placeholder

这个在中文怎么翻译我也不懂,不过上面几个概念在不同的TF都有说明只是真的不好懂,我总结这个placeholder其实就是迭代要导入的数据。

迭代中不断迭代的用变量,但是样本数据,是要一条一条的数带入公式,进行计算的,这类数据转换成公式,就要用placeholder了,换句话说,placeholder通常在建立好模型,公式后,要导入的(就是feed的,这个后面会讲)。

通过三个类型的张量,建立模型。所以上面给的例子,全部都是模型,注意:只是建立模型,不是进行实际的运算的。

那么,要进行运算应该怎么样呢?就是后面两步启动图和运行取值。

在TF中,启动图,就是创建一个运行session(会话)并初始化:

sess = tf.Session()
......
sess.run(.....)  #就是真正的执行运算,并返回结果
......
sess.close()

启动会话tf.Session()

然后用会话tf.run。tf.run就是计算的意思,tf.run(object,feed_dic=xxxxx)这个是使用方法,object是要计算的目标参数。feed_dic就是这个数学模型要带入的数据,当然是带入到placeholder里面的。

我们看看一个完整的例子:

# -创建一个变量, 初始化为标量 0.  初始化定义初值
state = tf.Variable(0, name="counter")

# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# 启动图后, 变量必须先经过`初始化` (init) op 初始化,
# 才真正通过Tensorflow的initialize_all_variables对这些变量赋初值
init_op = tf.initialize_all_variables()

# 启动默认图, 运行 op
with tf.Session() as sess:

  # 运行 'init' op
  sess.run(init_op)
  
  # 打印 'state' 的初始值
  # 取回操作的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时, 
  # 传入一些 tensor, 这些 tensor 会帮助你取回结果. 
  # 此处只取回了单个节点 state,
  # 也可以在运行一次 op 时一起取回多个 tensor: 
  # result = sess.run([mul, intermed])
  print sess.run(state)
  
  # 运行 op, 更新 'state', 并打印 'state'
  for _ in range(3):
    sess.run(update)
    print sess.run(state)

# 输出:

# 0
# 1
# 2
# 3

可以看到,最后的sess.run(state)就是在求state的值

以上部分,是存粹的TF介绍,如果没有AI基础的话,应该也能看懂。

下面再补充一个例子,就是之前最简单的双维度参数拟合单结果的最简单训练(这个需要前面的基础了,但比较简单,只是到梯度下降那里,还不构成神经网络):

# (tensorflow)$ python   用 Python API 写 TensorFlow 示例代码

import tensorflow as tf
import numpy as np

# 用 NumPy 随机生成 100 个数据
x_data = np.float32(np.random.rand(2, 100)) 
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# 构造一个线性模型
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

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

# 初始化变量
init = tf.initialize_all_variables()

# 启动图 (graph)
sess = tf.Session()
sess.run(init)

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

# 输出结果为:
0 [[-0.14751725  0.75113136]] [ 0.2857058]
20 [[ 0.06342752  0.32736415]] [ 0.24482927]
40 [[ 0.10146417  0.23744738]] [ 0.27712563]
60 [[ 0.10354312  0.21220125]] [ 0.290878]
80 [[ 0.10193551  0.20427427]] [ 0.2964265]
100 [[ 0.10085492  0.201565  ]] [ 0.298612]
120 [[ 0.10035028  0.20058727]] [ 0.29946309]
140 [[ 0.10013894  0.20022322]] [ 0.29979277]
160 [[ 0.1000543   0.20008542]] [ 0.29992008]
180 [[ 0.10002106  0.20003279]] [ 0.29996923]
200 [[ 0.10000814  0.20001261]] [ 0.29998815]

如果你实在不愿意看前面章节,这里简单补充说明一下吧。

上述这个代码,建立的一个如下的数学模型

y=w_{1}x_{1}+w_{2}x_{2}+b

其中x和w都是矩阵(二维数组),里面包含了x_{1}x_{2}w_{1}w_{2}

 loss = tf.reduce_mean(tf.square(y - y_data))

这个是计算偏差值,这里用的是方差,即,计算实际的y值和样本的y值之间的差距。

optimizer = tf.train.GradientDescentOptimizer(0.5)

这个是求偏差最小值的方法,即梯度下降。

详细概念不展开,看以前的文章吧。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值