转自https://blog.csdn.net/qq_30934313/article/details/86659416
对于这个函数tf.transpose()
这个函数 ,相信都不会陌生,刚刚上手的时候,比较 验证理解的相信是他的参数 perm[]
,里面究竟怎么取?
不绕沟子了,看看参数几何?
def transpose(a, perm=None, name="transpose"):
漂亮 ,就一个perm,,,,那怎么计算 呢?
举个粟子:
input_data.dims = (1, 4, 3) #这是输入的维度
perm = [1, 2, 0] # 这是perm取值
因为 output_data.dims[0] = input_data.dims[ perm[0] ]
因为 output_data.dims[1] = input_data.dims[ perm[1] ]
因为 output_data.dims[2] = input_data.dims[ perm[2] ]
所以得到 output_data.dims = (4, 3, 1)
和 output_data.dims = (4, 3, 1)
再举一下粟子,如下:
输入维度仍然是(1,4,3)
perm[2,1 0] # D to output :(3, 4, 1)
perm[1,0,2] # D to output is :(4, 1, 3)
虽然知道 了输出的维度 ,那这有什么 用?
再举一个粟子进行说明 :
import tensorflow as tf
# 输入是维度是(2, 3, 4)的一个三维张量
x = [[[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]],
[[21, 22, 23, 24],
[25, 26, 27, 28],
[29, 30, 31, 32]]]
a = tf.transpose(x, [0, 1, 2])
b = tf.transpose(x, [0, 2, 1])
c = tf.transpose(x, [1, 0, 2])
d = tf.transpose(x, [1, 2, 0])
e = tf.transpose(x, [2, 1, 0])
f = tf.transpose(x, [2, 0, 1])
with tf.Session() as sess:
print('a 0 1 2 ---------------')
print(sess.run(a))
print('b 0 2 1 ---------------')
print(sess.run(b))
print('c 1 0 2---------------')
print(sess.run(c))
print('d 1 2 0 ---------------')
print(sess.run(d))
print('e 2 1 0---------------')
print(sess.run(e))
print('f 2 0 1 ---------------')
print(sess.run(f))
结果 如下:
我们就来看一下有没有 什么规律
a 0 1 2 --------------- #输入维度 (2,3,4)输出维度(2,3,4)原样输出
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[21 22 23 24]
[25 26 27 28]
[29 30 31 32]]]
b 0 2 1 --- #输入维度(2,3,4)输出维度(2, 4, 3)原样输出,直接把原行转置为列,
[[[ 1 5 9] #可见我们可以认为转置的条件是我们只调换行列参数,其他不变
[ 2 6 10]
[ 3 7 11]
[ 4 8 12]]
[[21 25 29]
[22 26 30]
[23 27 31]
[24 28 32]]]
c 1 0 2----#输入维度 (2,3,4)输出维度(3,2,4),当行不变时,这相当于把行作为整体,
[[[ 1 2 3 4] # 并按原来 顺序依次放入各第三维中
[21 22 23 24]]
[[ 5 6 7 8]
[25 26 27 28]]
[[ 9 10 11 12]
[29 30 31 32]]]
d 1 2 0 ----输入维度 (2,3,4)输出维度(3, 4, 2),原行未变,直接 搬至列
[[[ 1 21]
[ 2 22]
[ 3 23]
[ 4 24]]
[[ 5 25]
[ 6 26]
[ 7 27]
[ 8 28]]
[[ 9 29]
[10 30]
[11 31]
[12 32]]]
e 2 1 0---------------后面的,说不一一说了
[[[ 1 21]
[ 5 25]
[ 9 29]]
[[ 2 22]
[ 6 26]
[10 30]]
[[ 3 23]
[ 7 27]
[11 31]]
[[ 4 24]
[ 8 28]
[12 32]]]
f 2 0 1 ---------------
[[[ 1 5 9]
[21 25 29]]
[[ 2 6 10]
[22 26 30]]
[[ 3 7 11]
[23 27 31]]
[[ 4 8 12]
[24 28 32]]]
通过上述 例子,可以 得到 一个结论,我们可以 理解 的,或者 使用的通常是维度较低的情况,更高维度的时候 ,使用比较困难。