Tensor 是TensorFlow的数据结构,Flow是TensorFlow的计算模型,它直观地表达了张量之间通过计算相互转化的过程。TensorFlow 是一个通过计算图的形式表述计算的编程系统。
张量结构
张量:
一:对中间计算结果的引用,这样方便获取中间计算结果同时提高了代码的阅读性。
二:可以用来获得计算结果,这需要配合session.
从功能的角度,张量可以被简单的理解为多维数组,但从实际的角度来讲,张量中并没有保存数字,而保存的是如何得到这些数字的计算过程。
Tensor("add_10:0", shape=(2,), dtype=float32)
Name属性:
name是一个Tensor的唯一标识符,同时name也给出了该Tensor是如何计算出来的。计算图上的node和计算是相对应的。
计算的结果保存在Tensor中,Tensor的name属性可以通过”node:src_output”形式给出。
- node为节点的名称-
- src_output表示Tensor来自当前节点的第几个输出。
Shape属性:
shape属性描述了一个Tensor的维度信息
Type属性:
每一个Tensor都有一个唯一的类型,TensorFlow会对所有参与计算的Tensor进行类型检查,当发现类型不匹配时会报错。
计算图
TensorFlow程序一般可以分为两个阶段。
第一阶段:定义计算图中所有的计算。
第二阶段:执行计算。
定义计算图中所有的计算
import tensorflow as tf
a = tf.constant([1.0,2.0],name='a')
b = tf.constant([2.0,3.0],name='b')
result = tf.add(a,b,name='add')
print(result)
>> Tensor("add_10:0", shape=(2,), dtype=float32)
执行计算
a,b,result都是张量,tf.constant tf.add代表了张量之间的计算关系。
会话
用于执行定义好的运算
import tensorflow as tf
a = tf.constant([1.0,2.0],name='a')
b = tf.constant([2.0,3.0],name='b')
result = tf.add(a,b,name='add')
//执行运算
sess = tf.Session()
//在计算张量取值的时候,需要指定会话
print(sess.run(result)) // print(result.eval(session=sess))
sess.close()
或者,使用with可以异常退出时资源释放的问题。
With tf.session() as sess:
Print(srss.run(result))
或者,指定默认会话,指定默认会话后才可以计算张量的取值
sess = tf.Session()
with sess.as_default():
print(result.eval());
在交互式环境下,tf.InteractiveSession函数可以省去将产生的会话注册为默认会话的过程。
Sess = tf.InteractiveSession()
Print(result.eval())
Sess.close()
神经网络
在使用tensorflow构建神经网络时,tensorflow提供了特定的数据结构(变量,占位符等)用于存储特定的网络数据(权重,偏置等等)。
变量
变量(tf.Variable)的作用是保存和更新神经网络中的参数。
变量需要制定初始值,在神经网络中一般使用随机数给变量进行初始化,设定初始化方式。
Weights = tf.Variable(tf.random_normal([2,3], stddev=2))
Bias = tf.variable(tf.zeros([3]))
该语句会产生一个2*3的矩阵,矩阵中的元素为均值为0,标准差为2的随机数;
虽然在变量定义时给出了初始化的方法,但这个芳芳并没有被执行。
所以在神经网络运行之前,需要使用session来运行变量初始化
Sess.run(weights.initrilizer)
TensorFlow提供了一种更加便捷的方式来完成变量初始化过程,通过tf.initialize_all_variables函数实现初始化所有变量的过程。
Init_op = tf.initailize_all_variables()
Sess.run(ini_op)
占位符
TensorFlow提供了placeholder机制用于提供输入数据,placeholder相当于定义了一个位置,这个位置中的数据在程序运行时再指定。这样在程序中就不需要生成大量常量来提供输入数据。
使用占位符时,需要通过feed_dict来指定x的初始取值。
使用占位符实现前向传播
OP
OP表示某种抽象计算,它拥有0个或多个「输入/输出」,及其0个或多个「属性」。其中,输入/输出以Tensor的形式存在。