2017-04-07 22 views
0

這裏看到:https://gist.github.com/narphorium/d06b7ed234287e319f18爲什麼增加張量的維數可以實現元素減法?

這是重現,能夠代碼:

import numpy as np 
import tensorflow as tf 

points = np.random.random_sample((10,2)) 
tf_points = tf.constant(points) 
slice = tf.slice(tf_points,[0,0],[4,-1]) 

print tf.subtract(tf_points,slice).get_shape() #This errors out because the dimensions are incorrect 

tf_points_expanded = tf.expand_dims(tf_points,0) 
slice_expanded = tf.expand_dims(slice,1) 

print tf.subtract(tf_points_expanded,slice_expanded).get_shape() #This works and prints (4,10,2) 

這是爲什麼元素方面的減法?這個怎麼用?

回答

1

你在這裏看到的是張量(或數組)Broadcasting的影響。

在張量流/ numpy中,減法始終是元素明智的。您的第一個減法不起作用,因爲操作數的形狀爲(10,2)(4,2),它們不是兼容。當您擴展尺寸時,形狀變得相容。

操作數矩陣的形狀可能不同,但需要兼容元素式操作才能工作。

對於要兼容的形狀,形狀在尾部/最後尺寸處對齊,然後每2個相應的尺寸必須兼容。兩個維度是兼容,如果:

  1. 它們是相等的,或

  2. 其中之一是圖1(a 「簡併」 尺寸)

例如np.zeros((5,1,2)) - np.ones((3,1))作品,因爲形狀是兼容的:

5 1 2 
    3 1 
    ^aligned at the trailing dimension 

它的工作方式是對於每個維度(從最後一個維度開始),該維度中較小大小的矩陣將沿着該維度重複以匹配另一個矩陣。在此示例中,對於最後一個維度,(3,1)矩陣需要在最後維度重複爲(3,2)。然後,對於倒數第二維,需要重複(5,1,2)以變爲(5,3,2)。最後,沿着新的第一維重複5次矩陣,也變成(5,3,2)。然後正常執行逐元減法。

在您的示例中,對不兼容形狀(10,2)(4,2)進行減法會導致錯誤。但在將其尺寸擴大至(1,10,2)(4,1,2)後,它們根據以上規則變得兼容:

1 10 2 
4 1 2 
相關問題