TensorFlow基本操作2
重点函数
数据类型转换为tensor:
tf.convert_to_tensor()
tf.constant()
tf.convert_to_tensor(a)
tf.constant(a)
都能够自动的把 Numpy 数组或者 Python List 数据类型转化为 Tensor 类型
创建全 0,全 1 张量:
tf.zeros()
tf.ones()
tf.zeros()
tf.ones()
创建建与某个张量 shape 一致,内容全 0 或全 1 的张量:
tf.zeros_like()
tf.ones_like()
a = tf.ones([2,3])
tf.zeros_like(a)
tf.ones_like(a)
创建自定义数值张量:
tf.fill(shape, value)
tf.fill(shape, value)
tf.fill([2,2], 99)
初始化正态分布:
tf.random.normal(shape, mean=0.0, stddev=1.0)
tf.random.normal(shape, mean=0.0, stddev=1.0)
//默认均值为 0,标准差为 1
tf.random.normal([2,2])
tf.random.normal([2,2], mean=1,stddev=2)
截断的正态分布:
tf.random.truncated_normalnormal(shape, mean=1,stddev=0)
tf.random.truncated_normalnormal([10,2],mean=1,stddev=2)
初始化均匀分布:
tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32)
tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32)
tf.random.uniform([2,2])
//默认采样自区间为 [0,1]
tf.random.uniform([2,2],maxval=10)
tf.random.uniform([2,2],maxval=100,dtype=tf.int32)
创建序列:
tf.range(limit, delta=step)
tf.range(limit, delta=1)
tf.range(10)
tf.range(10,delta=2)
tf.range(1,10,delta=2)
注意 shape 的大小:
a = tf.ones(1)
(1,)
a = tf.ones([1])
(1,)
a = tf.ones([])
()
随机打乱:
tf.random.shuffle(id)
id = tf.range(10)
// tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
idx = tf.random.shuffle(id)
// tf.Tensor([2 0 5 3 6 1 4 8 7 9], shape=(10,), dtype=int32)
// 原始 id 不会变,所以需要一个变量来接收打乱后的数据
将打乱后的 data 和 label 对应上:
tf.gather(a,idx)
a = tf.gather(a,idx)
b = tf.gather(b,idx)
4 创建张量
4.1 从 Numpy, List 对象创建
Numpy Array 数组和 Python List 是 Python 程序中间非常重要的数据载体容器,很多数 据都是通过 Python 语言将数据加载至 Array 或者 List 容器,再转换到 Tensor 类型,通过 TensorFlow 运算处理后导出到 Array 或者 List 容器,方便其他模块调用。
通过 tf.convert_to_tensor
可以创建新 Tensor,并将保存在 Python List 对象或者 Numpy Array 对象中的数据导入到新 Tensor 中:
In [22]:
tf.convert_to_tensor([1,2.])
Out[22]:
<tf.Tensor: id=86, shape=(2,), dtype=float32, numpy=array([1., 2.], dtype=float32)>
In [23]:
tf.convert_to_tensor(np.array([[1,2.],[3,4]]))
Out[23]:
<tf.Tensor: id=88, shape=(2, 2), dtype=float64, numpy= array([[1., 2.], [3., 4.]])>
需要注意的是,Numpy 中浮点数数组默认使用 64-Bit 精度保存数据,转换到 Tensor 类型时
精度为 tf.float64,可以在需要的时候转换为 tf.float32 类型。
实际上,tf.constant()
和 tf.convert_to_tensor()
都能够自动的把 Numpy 数组或者 Python
List 数据类型转化为 Tensor 类型,这两个 API 命名来自 TensorFlow 1.x 的命名习惯,在
TensorFlow 2 中函数的名字并不是很贴切,使用其一即可
4.2 创建全 0,全 1 张量
tf.zeros()
tf.ones()
向量(vector)
创建全 0 和全 1 的向量(vector):
tf.zeros([1]),tf.ones([1])
矩阵(matrix)
创建全 0 的矩阵(matrix):
tf.zeros([2,2])
创建全 1 的矩阵(matrix):
tf.ones([3,2])
通过 tf.zeros_like
, tf.ones_like
可以方便地新建与某个张量 shape 一致,内容全 0 或全 1
的张量。例如,创建与张量 a 形状一样的全 0 张量:
a = tf.ones([2,3])
tf.zeros_like(a)
tf.ones_like(a)
tf.*_like
是一个便捷函数,可以通过 tf.zeros(a.shape)等方式实现。
4.3 创建自定义数值张量
除了初始化为全 0,或全 1 的张量之外,有时也需要全部初始化为某个自定义数值的张量,比如将张量的数值全部初始化为-1 等。
通过 tf.fill(shape, value)
可以创建全为自定义数值 value 的张量。
创建元素为 -1 的标量:
tf.fill([], -1)
创建所有元素为-1 的向量:
tf.fill([1], -1)
创建所有元素为 99 的矩阵:
tf.fill([2,2], 99)
4.4 创建已知分布的张量
正态分布(Normal Distribution,或 Gaussian Distribution)和均匀分布(Uniform Distribution)是最常见的分布之一,创建采样自这 2 种分布的张量非常有用,比如在卷积神经网络中,卷积核张量 W 初始化为正态分布有利于网络的训练;在对抗生成网络中,隐藏变量 z 一般采样自均匀分布。
通过 tf.random.normal(shape, mean=0.0, stddev=1.0)
可以创建形状为 shape,均值为 mean,标准差为 stddev 的正态分布𝒩(𝑚𝑒𝑎𝑛, 𝑠𝑡𝑑𝑑𝑒𝑣2)。
正态分布(Normal Distribution)
创建均值为 0,标准差为 1 的正太分布:
tf.random.normal([2,2])
创建均值为 1,标准差为 2 的正太分布:
tf.random.normal([2,2], mean=1,stddev=2)
截断的正态分布
tf.random.truncated_normalnormal([10,2],mean=1,stddev=2)
均匀分布(Uniform Distribution)
通过 tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32)
可以创建采样自[𝑚𝑖𝑛𝑣𝑎𝑙, 𝑚𝑎𝑥𝑣𝑎𝑙]区间的均匀分布的张量。
创建采样自区间[0,1],shape 为[2,2]的矩阵:
tf.random.uniform([2,2])
创建采样自区间[0,10],shape 为[2,2]的矩阵:
tf.random.uniform([2,2],maxval=10)
如果需要均匀采样整形类型的数据,必须指定采样区间的最大值 maxval 参数,同时制定数据类型为 tf.int* 型:
tf.random.uniform([2,2],maxval=100,dtype=tf.int32)
4.5 创建序列
在循环计算或者对张量进行索引时,经常需要创建一段连续的整形序列,可以通过
tf.range()函数实现。tf.range(limit, delta=1)
可以创建[0,𝑙𝑖𝑚𝑖𝑡)之间,步长为 delta 的整形序列,不包含 limit 本身。
创建 0~9,步长为 1 的整形序列:
tf.range(10)
创建 0~9,步长为 2 的整形序列:
tf.range(10,delta=2)
通过 tf.range(start, limit, delta=1)可以创建[𝑠𝑡𝑎𝑟𝑡, 𝑙𝑖𝑚𝑖𝑡),步长为 delta 的序列,不包含 limit本身:
tf.range(1,10,delta=2)
随机打乱
id = tf.range(10)
// tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
idx = tf.random.shuffle(id)
// tf.Tensor([2 0 5 3 6 1 4 8 7 9], shape=(10,), dtype=int32)
典型维度的数据
scalar
[]
loss
accauracy
vector
Bias
matrix
input_x: [batches ,vec_dim]
weight: [input_dim, output_dim]
Dim = 3 Tensor
x: [batches, seq_len, word_dim]
Dim = 4 Tensor
Image: [batches, height, width, 3]
feature maps: [b, h, w, channal]
Dim = 5 Tensor
single task: [b, h, w, 3]
meta-learning: [task_b, b, h, w, 3]