TensorFlow进阶(二)—张量的操作

张量运算

其中,对张量进行操作的函数有很多,包括生成张量、创建随机张量、张量类型和形状变换以及张量的切片和操作

生成张量固定值张量

tf.zeros(shape, dtype=tf.float32, name=None)

创建一个所有元素都设置为零的张量。此操作返回一个 dtype 类型的张量,其形状为 shape 并且所有元素都设置为零。

tf.zeros_like(tensor, dtype=None, name=None)

给定一个(),这个操作返回一个相同类型和形状的张量,所有元素都设置为零。

tf.ones(shape, dtype=tf.float32, name=None)

创建一个所有元素设置为 1 的张量。此操作返回一个类型为 dtype shape shape 且所有元素设置为 1 的张量。

tf.ones_like(tensor, dtype=None, name=None)

给定一个(),这个操作返回一个相同类型和形状的张量,所有元素都设置为1。

tf.fill(dims, value, name=None)

创建一个用标量值填充的张量。此操作创建一个形状暗淡的张量并用值填充它。

tf.constant(value, dtype=None, shape=None, name='Const')

创建一个常数张量。

以常数张量为例

t1 = tf.constant([1, 2, 3, 4, 5, 6, 7])
t2 = tf.constant(-1.0, shape=[2, 3])
print(t1,t2)

我们可以看到,不运行时,输出值为:

(<tf.Tensor 'Const:0' shape=(7,) dtype=int32>, <tf.Tensor 'Const_1:0' shape=(2, 3) dtype=float32>)

一个张量包含几条信息

创建一个随机张量

一般来说,我们经常使用的随机数函数Math.()生成服从均匀分布的随机数,可以模拟概率相等的情况,比如掷骰子,1到6个点的概率应该相等,但是现实生活中更多的随机现象是符合正态分布的,比如20岁成年人的体重分布。

如果我们在做一个游戏,我们需要随机设置很多NPC的高度。如果我们也使用 Math.() 来生成 140 到 220 的数字,我们会发现每个身高段的人数都是一样的。这是比较无趣的,这样的世界也和我们习惯的不一样。现实应该是非常高和非常矮的人很少,中间的人数最多,这就要求随机函数符合正态分布。

tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

从截断的正态分布中输出随机值,与 tf.() 相同,但所有数字都在两个标准差内

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)

从均匀分布中输出随机值。结果值遵循 [, ) 范围内的均匀分布。下限包括在范围内,而上限不包括在内。

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)

设置图级随机种子

要跨会话生成不同的序列,请既不设置图形级别也不设置操作级别种子:

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)

要跨会话生成可操作的序列,请播种操作:

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)

要使所有操作生成的随机序列在会话之间可重复,请设置图形级种子:

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)

我们可以看到结果

张量变换

提供了几种操作,可用于更改图中的张量数据类型。

更改类型

提供以下函数来更改张量中的数值类型

让我们以其中之一为例

图片[1]-TensorFlow进阶(二)—张量的操作-唐朝资源网

tf.string_to_number(string_tensor, out_type=None, name=None)

将输入中的每个字符串转换为指定的数值类型。请注意,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]

静态和动态形状

静态维度是指当你创建一个张量或者从一个操作中导出一个张量时,张量的维度是确定的。它是一个元组或列表。会尽力猜测不同张量的形状(在操作之间),但它并不总是能够做到这一点。特别是如果您开始使用由未知维度定义的占位符进行操作。tf.. 方法读取静态形状

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)

这个函数的作用是去掉维度为1的输入的维度。但是如果不想去掉所有维度为1的,那么可以使用参数指定需要去掉的位置。

import tensorflow as tf

图片[2]-TensorFlow进阶(二)—张量的操作-唐朝资源网

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)

这个函数做相反的事情,添加一个指定的维度

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))

切片和扩展

提供了几种操作来切片或提取部分张量,或将多个张量相加

张量的其他一些操作

© 版权声明
THE END
喜欢就支持一下吧
点赞10赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容