不懂锤爆我系列之Tensorflow入门学习—— 张量扩展函数tile()详解

版权声明:CopyRight:Marval-C 欢迎转载 https://blog.csdn.net/gaotianyu824/article/details/82932678

第二期,第二期,开始,开始。

在tensorflow中有个很常用的张量扩展函数——tile(),看过了许多讲解博客之后,觉得有必要系统的进行一下整理。同时,我将讲解一维、二维、乃至多维张量使用tile()的运算过程与规则。

下面,我们还是以一段代码为例:

import tensorflow as tf
#下面两行是为了抛掉错误信息的提示,大家忽略即可
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

#一维张量, 即shape = [X, ]的张量
a = tf.tile([1, 2, 3],[3])

#二维张量, 即shape = [X, Y]的张量
b = tf.tile( [[1, 2], [2, 3], [3, 4]] ,[3, 2])

#三维张量, 即shape = [X, Y, Z]的张量
temp = tf.Variable(tf.random_normal(shape=(1, 3, 2)))

c = tf.tile(temp, [2, 1, 1])
d = tf.tile(temp, [2, 2, 1])
e = tf.tile(temp, [2, 2, 2])

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(a))
    print(sess.run(b))
    print("---------------------------")
    print(sess.run(temp))
    print("---------------------------")
    print(sess.run(c))
    print(sess.run(d))
    print(sess.run(e))

上文的代码,大家可以根据注释按顺序看,下面我的讲解也将按照a到e的顺序进行。

  • 首先我们要明白tf.tile( , )函数中的两个参数,第一个参数就是传入的张量第二个参数则是扩展的倍数

       明白了函数内容后我们看到 a = tf.tile([1, 2, 3], [3]) , a作为一维张量,后面的3赋予a的意义为对a进行三倍的扩展。由于tile()的扩展遵循不变维数的原则,所以这里的扩展结果要将一维张量的所有数看作一个整体,对整体进行倍增

即:[1 2 3 1 2 3 1 2 3]

  • 接下来是二维张量b = [[1, 2], [2, 3], [3, 4]] ,要扩展的倍数为[3, 2]。看到这里很多朋友可能就有点嘀咕:这个 [3, 2]的扩展规则是个什么意思呢?

      其实很简单,在这里我们要用到shape的概念,如果大家还不清楚的话就先去看看喽,很容易理解。 我们先看扩展规则中的第一个3, 在这里乘以3的具体操作流程为:打开b最外层的一对 [ ],这时对应的shape为3(这个值和操作流程无关)。打开之后我们很直观的看到剩下的是[1, 2], [2, 3], [3, 4]这三个并列的项。我们就将每一项翻3倍得到——>[1, 2],[1, 2],[1, 2], [2, 3],[2, 3],[2, 3],[3, 4], [3, 4], [3, 4]。

这时再看倍数中的第二个数2,这个的意思是,在我们第一步操作结束的基础上,对我们得到的这9个一维并列项。

应用在上面我对一维张量a进行的扩展操作的讲解得到——>

[[1 2 1 2], [2 3 2 3],[3 4 3 4],[1 2 1 2], [2 3 2 3], [3 4 3 4], [1 2 1 2], [2 3 2 3], [3 4 3 4]]

再看下面的temp,其实就是一个由随机数组成的shape为(1, 3, 2)的三维张量。 在这里,我们应用递归的思想解释问题(其实就是偷个懒,大家理解了一维二维的话,我只需要讲下多出来那一维,剩下的同理啦~)

假设我们得到的三维张量如下: 

[[[-0.9044834  -0.9477105 ]
  [-0.48063868 -0.12450311]
  [-0.09301946 -0.5487149 ]]]

  • 针对c = tf.tile(temp, [2, 1, 1]),我们可以看到倍数参数中为对应temp维度的[2, 1, 1]。

       三维张量,一共有三层的shape值(如代码中的[1, 3, 2]),shape的这三个值与倍数参数中的三个值一 一对应

在这里按照拆最外层中括号的思想,2这个值其实就对应把temp拆除最外层【】-->得到:

[[-0.9044834  -0.9477105 ] ,[-0.48063868 -0.12450311] ,[-0.09301946 -0.5487149 ]]

        因为这一层shape为1,所以我们就将上面的整体翻二倍即可。(shape的1对应倍数的2)

同理,再拆一层,shape为三就要将以逗号为分隔符的三项整体分别扩展1倍 (shape的3对应倍数的1)

           对下一层而言,注意:如果每个并列项只含有一对 [ ],那么我们就不再拆除他,这样便于理解。我们在这里就对所有的并列项做同上文对a的操作一样,进行整体倍增即可。

大家按照这个思路自己进行一下计算,看看和结果是否匹配哦~~

[[[-0.9044834  -0.9477105 ]
  [-0.48063868 -0.12450311]
  [-0.09301946 -0.5487149 ]]

 [[-0.9044834  -0.9477105 ]
  [-0.48063868 -0.12450311]
  [-0.09301946 -0.5487149 ]]]

猜你喜欢

转载自blog.csdn.net/gaotianyu824/article/details/82932678