目录
4.tf.reshape(tensor,shape,name) 转换维度
5. tf.pad(tensor,paddings,mode,name,constant_values) 张量值填充
1.tf.split 切割张量
API原型(TensorFlow 1.8.0):
tf.split(
value,
num_or_size_splits,
axis=0,
num=None,
name='split'
)
这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。 value
传入的就是需要切割的张量。
这个函数有两种切割的方式:比如说一个20 * 30 * 40的张量
有两种切割方式:
1. 如果num_or_size_splits
传入的是一个整数,这个整数代表这个张量最后会被切成几个小张量。此时,传入axis
的数值就代表切割哪个维度(从0开始计数)。调用tf.split(my_tensor, 2,0)
返回两个10 * 30 * 40的小张量。
2. 如果num_or_size_splits
传入的是一个向量,那么向量有几个分量就分成几份,切割的维度还是由axis
决定。比如调用tf.split(my_tensor, [10, 5, 25], 2)
,则返回三个张量分别大小为 20 * 30 * 10、20 * 30 * 5、20 * 30 * 25。很显然,传入的这个向量各个分量加和必须等于axis
所指示原张量维度的大小 (10 + 5 + 25 = 40)。
2.tf.transpose 张量指定维度交换
tf.transpose(input, [dimension_1, dimenaion_2,..,dimension_n]):这个函数主要适用于交换输入张量的不同维度用的,如果输入张量是二维,就相当是转置。dimension_n是整数,如果张量是三维,就是用0,1,2来表示。这个列表里的每个数对应相应的维度。如果是[2,1,0],就把输入张量的第三维度和第一维度交换。
import tensorflow as tf
import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6]])
x = tf.transpose(A, [1, 0])
with tf.Session() as sess:
print(A)
print(sess.run(x))
print(A.shape, x.shape)
输出:
[[1 2 3]
[4 5 6]]
[[1 4]
[2 5]
[3 6]]
(2, 3) (3, 2)
3. tf.concat 指定维度连接
tf.concat(concat_dim, values, name='concat') 在指定维度,连接多个向量
import tensorflow as tf
# tensor t3 with shape [2, 3]
# tensor t4 with shape [2, 3]
tf.shape(tf.concat(0, [t3, t4])) ==> [4, 3]
tf.shape(tf.concat(1, [t3, t4])) ==> [2, 6]
4.tf.reshape(tensor,shape,name) 转换维度
inputss = tf.reshape(inputs, [-1, 2*H]) # inputs [B,T,2H] -> [B*T,2H]
ip = tf.matmul(inputss, w) # ip [B*T,2H]*[2H,4]=[B*T,4]
ip = tf.reshape(ip, [-1, t, num_tags]) # ip [B*T,4]->[B,T,4]
5. tf.pad(tensor,paddings,mode,name,constant_values) 张量值填充
tensor是要填充的张量
padings 也是一个张量,代表每一维填充多少行/列,但要求它的rank一定要和tensor的rank一样
mode 可以取三个值,分别是"CONSTANT" ,"REFLECT","SYMMETRIC"
mode="CONSTANT" 是填充0
mode="REFLECT"是映射填充,上下(1维)填充顺序和paddings是相反的,左右(零维)顺序补齐
mode="SYMMETRIC"是对称填充,上下(1维)填充顺序是和paddings相同的,左右(零维)对称补齐
constant_values 指定mode=constant 时,填充的值
t=[[2,3,4], [5,6,7]]
sess.run(tf.pad(t, [[1,2],[2,3]], mode="CONSTANT"))
输出结果为:
array([[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 2, 3, 4, 0, 0, 0],
[0, 0, 5, 6, 7, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]], dtype=int32)
可以看到,上,下,左,右分别填充啦1,2,2,3行,刚好和paddings=[[1,2],[2,3]]相等,零填充