Tensorflow基础语法和概念
2018-03-02 11:02
507 查看
Tensorflow基础语法和概念
一些说明:学习tensorflow用到的Python语法,请参考这篇博客计算图模型
Tensorflow的构建的机器学习模型都是有向图模型,在
Tensorflow中,一个图的每个节点都代表一个计算操作,图的边代表数据的流向。使用计算图可以根据操作间的实际依赖关系进行有选择的计算操作,节约计算资源。
Graphs, Sessions, and Fetches
使用Tensorflow框架主要包含两个过程:创建一个图模型和执行该图模型。
创建并执行图模型
示例代码:import tensorflow as tf # 这里的三个常量是3个图结点 a = tf.constant(5) b = tf.constant(3) c = tf.constant(3) # 这里的三个计算也是3个图结点 d = tf.multiply(a, b) e = tf.add(c, b) f = tf.subtract(d, e) # 执行图模型 sess = tf.Session() outs = sess.run(f) sess.close() # 输出结果 print("outs = {}".format(outs))
计算图模型需要建立在
Tensorflow的一个Session中,运行时调用
run(),使用完后要用
close()进行关闭。
run()函数的参数只需要标明我们需要的对象即可,比如上面我们需要
f
上述的图模型为:
加减操作等也可以使用符号简化:
构造并管理图模型
当我们导入Tensorflow的时候,
Tensorflow就会自动为我们创建一个计算图。我们可以自己创建额外的图模型,并进行有关的操作。
tf.Graph()是创建新图的命令,图是
Tensorflow的一个对象。
import tensorflow as tf print(tf.get_default_graph()) g = tf.Graph() # 建立一个新图 print(g)
Fetches
在上述的图模型中,我们有一个特殊的结点f作为
run()的参数,这个参数称为Fetches。我们可以自定义一个参数列表,来输出需要的结点信息。
with tf.Session() as sess: fetches = [a, b, c, d, e, f] # 标明需要计算的结点,作为一个feches outs = sess.run(fetches) print("outs={}".format(outs))
张量流
图模型的结点是操作,边是张量对象
在图模型中,只有当计算图执行时,图结点的操作才会执行。在设计图模型的阶段,结点的计算过程不会执行,而且结点之间也没哟数据流传递。数据类型
使用tf.cast()可以进行数据类型的转换。
张量数组和形状
张量可以理解成高维数组。除非进行显式说明,否则Tensorflow自动进行形状类型推断。当进行高维数组输入输入时,一般使用Python中的
list或者Numpy中的数组作为输入。
import numpy as np import tensorflow as tf c = tf.constant([[1, 2, 3], [4, 5, 6]]) print("python list input: {}".format(c.get_shape())) c = tf.constant(np.array([[[1, 2, 3], [4, 5, 6]], [[1, 1, 1], [2, 2, 2]]] )) print("3d NumPy array input: {}".format(c.get_shape()))
输出:
python list input: (2, 3) 3d NumPy array input: (2, 2, 3)
注意一点,高维数组的形状的顺序不要弄反了。
矩阵乘法
import tensorflow as tf A = tf.constant([[1, 2, 3], [4, 5, 6]]) print(A.get_shape()) x = tf.constant([1, 0, 1]) # 这里的x是一维向量 print(x.get_shape()) x = tf.expand_dims(x, 1) # 转换成二维的单列矩阵 print(x.get_shape()) b = tf.matmul(A, x) sess = tf.InteractiveSession() print("matmul result:\n{}".format(b.eval())) sess.close()
输出:
(2, 3) (3,) (3,1) matmul result: [[ 4] [10]]
上述代码说明:在
Tensorflow中,只有维数相同的数据元素才能进行加减乘除等的运算。InteractiveSession()可以让我们不必使用变量来表示Session,就可以直接计算想要的数值。
命名
每一个张量对象都有一个唯一的标识名。比如:import tensorflow as tf with tf.Graph().as_default(): c1 = tf.constant(4, dtype=tf.float64, name='c') c2 = tf.constant(4, dtype=tf.int32, name='c') print(c1.name) print(c2.name) # 自动更新命名
输出:
c:0 c_1:0
命名空间:在图模型非常复杂,且单一的命名会起冲突的时候使用。类比C++的命名空间
import tensorflow as tf with tf.Graph().as_default(): c1 = tf.constant(4, dtype=tf.float64, name='c') with tf.name_scope("prefix_name"): # 建立命名空间 c2 = tf.constant(4, dtype=tf.int32, name='c') c3 = tf.constant(4, dtype=tf.float64, name='c') print(c1.name) print(c2.name) print(c3.name)
输出:
c:0
prefix_name/c:0
prefix_name/c_1:0
变量, 占位符
张量有两种重要的类型:变量和占位符。变量:
与变量相区别的是之前代码中的常量,常量的数值不会发生改变。变量的值可以进行更新,并且可以存储到磁盘中,之后还可以从磁盘中读取。使用变量需要两个步骤:
1. 使用
tf.Variable()函数创建一个变量,并且定义它的初始化数值
2. 显式地初始化,在一个
Session中运行
tf.global_variables_initializer(),为变量分配内存空间和初始化数值 。
这里的变量和C/C++中的概念类似。
import tensorflow as tf init_var = tf.random_normal((1, 5), 0, 1) var = tf.Variable(init_var, name='var') print("pre run:\n{}".format(var)) # 只是声明了,没有占用实际的空间 init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) # 分配内存空间,初始化数值 post_var = sess.run(var) print("\npost run:\n{}".format(post_var))
占位符 Placeholder:
占位符主要用于训练模型时获取数据。我们可以认为占位符也是变量的一种,不过它的数据需要在训练的实际过程中进行填充。占位符有一个shape参数,该参数如果不填写或者填写
None的话,这个占位符可以填充任意尺寸的数据。
None参数在输入矩阵时很常用。
比如
ph = tf.placeholder(tf.float32, shape=(None, 10))
定义的占位符必须进行数据填充,否则会抛出异常。填充输入数据需要使用
Session.run()方法,内部是一个字典的结构:关键字是占位符的名字,填充数据以python中的
list形式或者Numpy中的
array形式。比如:
sess.run(ph, feed_dict={x: X_data, w: w_data})
下面给出一个完整的例子:
import tensorflow as tf import numpy as np x_data = np.random.randn(5, 10) w_data = np.random.randn(10, 1) with tf.Graph().as_default(): x = tf.placeholder(tf.float32, shape=(5, 10)) w = tf.placeholder(tf.float32, shape=(10, 1)) b = tf.fill((5, 1), -1.) xw = tf.matmul(x, w) xwb = xw + b s = tf.reduce_max(xwb) with tf.Session() as sess: outs = sess.run(s, feed_dict={x: x_data, w: w_data}) print("outs = {}".format(outs))
outs填充数据的时候,是以python中
dict的格式进行的,要把包含的所有占位符都进行填充。
相关文章推荐
- 继承的概念、一些基础的语法与类型兼容性原则(基础)
- SQL查询之基础(语法和概念)完整版
- JAVA基础再回首(一)——基本概念、JAVA开发工具、JAVA基本语法
- Java基础总结-基本语法概念-3
- Visual Basic.Net基础概念和语法
- cuda编程基础概念语法
- Java继承的基本概念及其限制(基础语法二)
- Python 正则表达式---概念基础,匹配过程,表达式元字符和语法以及实例
- Java基础总结-基本语法概念-1
- Python第一周 基础语法和概念
- VB.Net学习笔记(基础概念和语法)
- Python-语法基础概念
- 黑马程序员——Java基础语法 之面向对象(概念,特征,this,static关键字,代码块)
- 黑马程序员 JavaSE-02 Java基础语法1:基本概念
- python基础概念及语法
- Google C++单元测试框架GoogleTest---Google Mock简介--概念及基础语法
- TensorFlow学习记录--2.运行方式及基础概念
- Java基础总结-基本语法概念-2
- Java基础语法(四)-----面向对象(1)基础概念、封装
- Tensorflow -- 基础概念