学了Tensorflow也有一段时间,整理下知识。
TensorFlow中有两个最重要的概念:Tensor和Flow。Tensor汉译为张量,英文解释为( a generalization of the concept of a vector)
可以近似的看作为向量。Flow 是 "流"的意思,这体现了他的计算模型和方式
import tensorflow as tf
hello = tf.constant('TensorFlow Test') # 创建 constant 对象
sess = tf.Session() # 实例化session
print(sess.run(hello), type(hello))
OUTPUT:
b'TensorFlow Test'
计算视图的运用
# TensorFlow程序一般分为两个步骤:
第一是定义计算图中所有的计算;
第二是执行计算图中的计算
在 TensorFlow 程序中,系统会自动维护一个默认的计算图,通过 tf.get_default_graph() 函数可以获取当前默认的计算图
tf.get_default_graph() 得到的是计算图所在的内存地址。
# TensorFlow 支持通过 tf.Graph 函数来生成新的计算图。不同计算图上的张量和运算都不会共享
g1 = tf.Graph() # 创建 g1 张量
with g1.as_default(): # 在计算阁 gl 中定义变量“v”,并设置初始值为 0 。
v = tf.get_variable("v", shape= [1], initializer=tf.zeros_initializer()) # 新版函数内无参数
g2 = tf.Graph() # 创建 g2 张量
with g2.as_default():
v = tf.get_variable("v", shape= [2,3], initializer=tf.ones_initializer())
# 在计算图 gl 中读取变盘“v”的取值 。
with tf.Session(graph=g1) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("v")))
with tf.Session(graph=g2) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("v")))
OUTPUT:
[0.]
[[1. 1. 1.]
[1. 1. 1.]]
在不同的计算图中,变量v是不一样的。TensorFlow 中的计算图不仅仅可以用来隔离张量和计算,它还提供了管理张量和计算的机制。
变量的使用:
weights = tf.Variable(tf.random_normal([2, 3], stddev=2, mean=2)) # 创建变量
# x = tf.constant([[1.0,2.]])
# r = tf.matmul(x, weights)
with tf.Session() as sess:
sess.run(weights.initializer) # 无该步骤无法进行会话,在第一次使用变量前要初始化变量
print(sess.run(weights))
张量
张量可以被简单理解为多维数组。其中零阶张量表示标量( scalar ),也就是一个数: 第一阶张量为向量 ,也就是一个一维数组;第 n 阶张量可以理解为一个 n 维数组 。但张量在 TensorFlow 中的实现并不是直接采用数组的形式,它只是对 TensorFlow 中运算结果的引用。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。
import tensorflow as tf
# tf.constant 是一个计算,这个计算的结果为一个张量 , 保存在变量 a 中。
a = tf.constant([5.0, 2.0], name="a") # 定义常量
b = tf.constant([4.0, 5.50], name="b")
result = tf.add(a, b, name="test")
print(result)
OUTPUT:
Tensor("test:0", shape=(2,), dtype=float32)
输出张量的解释:
1、张量的第一个属性名字不仅是一个张量的唯一标识符,“ test:0”就说明了 result 这个张量是计算节点“ add” 输出的第一个结果(编号从0开始)。
2、张量的第二个属性是维度,
3、张量的第三个属性是类型,如果不指定类型整数默认为 int32,浮点数默认为 float32。建议通过指定 dtype 来明确指出变量或者常量的类型,避免出现类型不匹配问题。
TensorFlow 支持 14 种不同的类型, 主要包括了实数( tf.丑oat32 、 tf.float64 )、整数( tf.int8 、 tf.intl 6 、 tf.int32 、 tf.int64 、 tf.uint8 )、布尔型 C tf.bool) 和复数( tf.complex64 、tf.complex128 ) 。
张量使用主要分为两大类:
第一类用途是对中间计算结果的引用:
import tensorflow as tf
a = tf.constant([5.0, 2.0], name="a") # 定义常量
b = tf.constant([4.0, 5.50], name="b")
result = a + b # result 即为张量
通过张量来存储中间结果可以方便获取中间结果,当神经网络层数较多时,使用张量可以很轻松获得中间结果。
第二类用途是:使用张量的第二类情况是当计算图构造完成之后,张量可以通过 sess.run(Tensor) 用来获得计算结果,也就是得到真实的数字。
Tensorflow运行模型--Session
会话在计算完成之后必须关闭帮助系统回收资源,避免内存泄漏。
Tensorflow不会自动生成默认的会话,而是需要手动指定。当指定默认会话后,可以通过 tf.Tensor.eval 函数来计算一个张量的取值。
sess = tf.Session()
with sess.as_default(): # 指定 sess 为默认会话
print(result.eval()) # 输出 result数值
在交互式环境下,tf.lnteractiveSession 使用这个函数会自动将生成的会话注册为默认会话。
sess1 = tf.InteractiveSession()
print(result.eval())
sess1.close()
无论使用哪种方法都可以通过 tf.ConfigProto() 来配置需要生成的会话
config = tf.ConfigProto(allow soft placement=True, log_device_placement=True)
sessl = tf.InteractiveSession(config=config)
sess2 = tf.Session(config=config)
在这些参数中,最常使用的有两个。第一个是 allow_so位_placement,这是一个布尔型的参数,当它为 True 时, 在以下任意一个条件成立时, GPU 上的运算可 以放到 CPU 上进行 :
l. 运算无法在 GPU 上执行 。
2. 没有 GPU 资源(比如运算被指定在第 二个 GPU 上运行 ,但是机器只有一个 GPU ) 。
3. 运算输入包含对 CPU 计算结果的引用 。
这个参数的默认值为 False,但是为了使得代码的可移植性更强,在有 GPU 的环境下这个参数一般会被设置为 True。不同的 GPU 驱动版本可能对计算的支持有略微的区别,通过将 allow_soft_placement 参数设为 True , 当某些运算无法被当前 GPU 支持时,可 以自动调整到 CPU 上,而不是报错。类似地,通过将这个参数设置为 True,可以让程序在拥有不同数量的 GPU 机器上顺利运行。
第二个使用得比较多的配置参数是 log_device_placement o 这也是一个布尔型的参数,当它为 True 时日志中将会记录每个节点被安排在哪个设备上以方便调试。而在生产环境中将这个参数设置为 False 可以减少日志量。
构建简单的神经网络
weights = tf.Variable(tf.random_normal([2, 3], stddev=2))
# 构建随机正态数组变量,均值默认为0,标准差默认为1
tf.zeros([m, n], detype="int32") # 全 0 数组
tf.ones([m, n], detype="int32") # 全 1 数组
df.fill([m, n], 3) # 填充全为某个值的数组
tf.constant() # 生成给定的常量
TensorFlow 也支持通过其他变量 的初始值来初始化新的变量。
w2 = tf.Variable(weights.initialized_value())
w3 = tf.Variable(weights.initialized_value() * 2.0)
# 无需指明形状,测试。