在tensorflow中,有不少操做张量的函数,有生成张量、建立随机张量、张量类型与形状变换和张量的切片与运算python
tf.zeros(shape, dtype=tf.float32, name=None)
建立全部元素设置为零的张量。此操做返回一个dtype具备形状shape和全部元素设置为零的类型的张量。less
tf.zeros_like(tensor, dtype=None, name=None)
给tensor定单张量(),此操做返回tensor与全部元素设置为零相同的类型和形状的张量。dom
tf.ones(shape, dtype=tf.float32, name=None)
建立一个全部元素设置为1的张量。此操做返回一个类型的张量,dtype形状shape和全部元素设置为1。ide
tf.ones_like(tensor, dtype=None, name=None)
给tensor定单张量(),此操做返回tensor与全部元素设置为1 相同的类型和形状的张量。函数
tf.fill(dims, value, name=None)
建立一个填充了标量值的张量。此操做建立一个张量的形状dims并填充它value。spa
tf.constant(value, dtype=None, shape=None, name='Const')
建立一个常数张量。code
用常数张量做为例子orm
t1 = tf.constant([1, 2, 3, 4, 5, 6, 7]) t2 = tf.constant(-1.0, shape=[2, 3]) print(t1,t2)
咱们能够看到在没有运行的时候,输出值为:blog
(<tf.Tensor 'Const:0' shape=(7,) dtype=int32>, <tf.Tensor 'Const_1:0' shape=(2, 3) dtype=float32>)
一个张量包含了一下几个信息游戏
通常咱们常常使用的随机数函数 Math.random() 产生的是服从均匀分布的随机数,可以模拟等几率出现的状况,例如 扔一个骰子,1到6点的几率应该相等,但现实生活中更多的随机现象是符合正态分布的,例如20岁成年人的体重分布等。
假如咱们在制做一个游戏,要随机设定许许多多 NPC 的身高,若是还用Math.random(),生成从140 到 220 之间的数字,就会发现每一个身高段的人数是同样多的,这是比较无趣的,这样的世界也与咱们习惯不一样,现实应该是特别高和特别矮的都不多,处于中间的人数最多,这就要求随机函数符合正态分布。
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
从截断的正态分布中输出随机值,和 tf.random_normal() 同样,可是全部数字都不超过两个标准差
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
从正态分布中输出随机值,由随机正态分布的数字组成的矩阵
# 正态分布的 4X4X4 三维矩阵,平均值 0, 标准差 1 normal = tf.truncated_normal([4, 4, 4], mean=0.0, stddev=1.0) a = tf.Variable(tf.random_normal([2,2],seed=1)) b = tf.Variable(tf.truncated_normal([2,2],seed=2)) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) print(sess.run(a)) print(sess.run(b)) 输出: [[-0.81131822 1.48459876] [ 0.06532937 -2.44270396]] [[-0.85811085 -0.19662298] [ 0.13895047 -1.22127688]]
tf.random_uniform(shape, minval=0.0, maxval=1.0, dtype=tf.float32, seed=None, name=None)
从均匀分布输出随机值。生成的值遵循该范围内的均匀分布 [minval, maxval)。下限minval包含在范围内,而maxval排除上限。
a = tf.random_uniform([2,3],1,10) with tf.Session() as sess: print(sess.run(a))
tf.random_shuffle(value, seed=None, name=None)
沿其第一维度随机打乱
tf.set_random_seed(seed)
设置图级随机种子
要跨会话生成不一样的序列,既不设置图级别也不设置op级别的种子:
a = tf.random_uniform([1]) b = tf.random_normal([1]) print "Session 1" with tf.Session() as sess1: print sess1.run(a) print sess1.run(a) print sess1.run(b) print sess1.run(b) print "Session 2" with tf.Session() as sess2: print sess2.run(a) print sess2.run(a) print sess2.run(b) print sess2.run(b)
要为跨会话生成一个可操做的序列,请为op设置种子:
a = tf.random_uniform([1], seed=1) b = tf.random_normal([1]) print "Session 1" with tf.Session() as sess1: print sess1.run(a) print sess1.run(a) print sess1.run(b) print sess1.run(b) print "Session 2" with tf.Session() as sess2: print sess2.run(a) print sess2.run(a) print sess2.run(b) print sess2.run(b)
为了使全部op产生的随机序列在会话之间是可重复的,设置一个图级别的种子:
tf.set_random_seed(1234) a = tf.random_uniform([1]) b = tf.random_normal([1]) print "Session 1" with tf.Session() as sess1: print sess1.run(a) print sess1.run(a) print sess1.run(b) print sess1.run(b) print "Session 2" with tf.Session() as sess2: print sess2.run(a) print sess2.run(a) print sess2.run(b) print sess2.run(b)
咱们能够看到结果
TensorFlow提供了几种操做,您能够使用它们在图形中改变张量数据类型。
提供了以下一些改变张量中数值类型的函数
咱们用一个其中一个举例子
tf.string_to_number(string_tensor, out_type=None, name=None)
将输入Tensor中的每一个字符串转换为指定的数字类型。注意,int32溢出致使错误,而浮点溢出致使舍入值
n1 = tf.constant(["1234","6789"]) n2 = tf.string_to_number(n1,out_type=tf.types.float32) sess = tf.Session() result = sess.run(n2) print result sess.close()
可用于肯定张量的形状并更改张量的形状
tf.shape(input, name=None)
返回张量的形状。
t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
shape(t) -> [2, 2, 3]
静态形状与动态形状
静态维度 是指当你在建立一个张量或者由操做推导出一个张量时,这个张量的维度是肯定的。它是一个元祖或者列表。TensorFlow将尽最大努力去猜想不一样张量的形状(在不一样操做之间),可是它不会老是可以作到这一点。特别是若是您开始用未知维度定义的占位符执行操做。tf.Tensor.get_shape方法读取静态形状
t = tf.placeholder(tf.float32,[None,2]) print(t.get_shape())
结果
动态形状 当你在运行你的图时,动态形状才是真正用到的。这种形状是一种描述原始张量在执行过程当中的一种张量。若是你定义了一个没有标明具体维度的占位符,即用None表示维度,那么当你将值输入到占位符时,这些无维度就是一个具体的值,而且任何一个依赖这个占位符的变量,都将使用这个值。tf.shape来描述动态形状
t = tf.placeholder(tf.float32,[None,2]) print(tf.shape(t))
tf.squeeze(input, squeeze_dims=None, name=None)
这个函数的做用是将input中维度是1的那一维去掉。可是若是你不想把维度是1的所有去掉,那么你能够使用squeeze_dims参数,来指定须要去掉的位置。
import tensorflow as tf sess = tf.Session() data = tf.constant([[1, 2, 1], [3, 1, 1]]) print sess.run(tf.shape(data)) d_1 = tf.expand_dims(data, 0) d_1 = tf.expand_dims(d_1, 2) d_1 = tf.expand_dims(d_1, -1) d_1 = tf.expand_dims(d_1, -1) print sess.run(tf.shape(d_1)) d_2 = d_1 print sess.run(tf.shape(tf.squeeze(d_1))) print sess.run(tf.shape(tf.squeeze(d_2, [2, 4])))
tf.expand_dims(input, dim, name=None)
该函数做用与squeeze相反,添加一个指定维度
import tensorflow as tf import numpy as np sess = tf.Session() data = tf.constant([[1, 2, 1], [3, 1, 1]]) print sess.run(tf.shape(data)) d_1 = tf.expand_dims(data, 0) print sess.run(tf.shape(d_1)) d_1 = tf.expand_dims(d_1, 2) print sess.run(tf.shape(d_1)) d_1 = tf.expand_dims(d_1, -1) print sess.run(tf.shape(d_1))
TensorFlow提供了几个操做来切片或提取张量的部分,或者将多个张量加在一块儿