在Tensorflow中使用tf.expand_dims和tf.newaxis有什么区别?

Yoh*_*hei 5 python tensorflow

嗨,我是Tensorflow的新手.
我想改变Tensor的维度,我找到了3种类型的方法来实现它,如下所示:

a = tf.constant([[1,2,3],[4,5,6]]) # shape (2,3)

# change dimention of a to (2,3,1)
b = tf.expand_dims(a,2)   # shape(2,3,1)
c = a[:,:,tf.newaxis]     # shape(2,3,1)
d = tf.reshape(a,(2,3,1)) # shape(2,3,1)
Run Code Online (Sandbox Code Playgroud)

3种方法之间是否有任何差异,例如在性能方面?
我应该使用哪种方法?

jde*_*esa 12

三者之间没有真正的区别,但有时其中一个可能更方便:

  • tf.expand_dims(a, 2):当你想添加一个维度并且它的索引是可变的(例如另一个TensorFlow操作的结果,或者某个函数参数)时,很方便。根据您的风格,您可能会发现它更具可读性,因为它清楚地表达了添加维度的意图。
  • a[:,:,tf.newaxis]:我个人经常使用它,因为我觉得它可读(也许是因为我从 NumPy 习惯了它),尽管不是在所有情况下。如果要添加多个维度(而不是tf.expand_dims多次调用),则特别方便。另外(显然)如果您想同时切片并添加新尺寸。但是,它不适用于可变轴索引,如果您有很多维度,则tf.expand_dims可能不那么令人困惑。
  • tf.reshape(a,(2,3,1)):我个人很少或从不使用它来仅添加维度,因为它需要我知道并指定所有(或除一个之外的所有)剩余维度大小,并且在阅读代码时可能会产生误导。但是,如果我需要重塑和添加维度,我通常会在同一个操作中进行。