2016-11-27 190 views
2

(Keras 1.0.7,Tensorflow r0.10Keras/Tensorflow:ValueError異常:(?,12)形狀必須有秩1

我想實現我自己的激活功能:

# Custom activation function (Radial Basis Function - RBF) 
l2_norm = lambda a, b: K.sqrt(((a - b) ** 2).sum()) 
def rbf(x, gamma=1.0): 
    return K.exp(-1 * gamma * l2_norm(x[0], x[1]) ** 2) 

這裏是我的模型的相關部分,在那裏我指定我的自定義激活功能:

model = Sequential() 
# Some other layers go here 
model.add(Dense(n_classes, activation=rbf)) 

我得到以下錯誤:

/raid/home/user/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/tensor_shape.pyc in assert_has_rank(self, rank) 
619  """ 
620  if self.ndims not in (None, rank): 
--> 621  raise ValueError("Shape %s must have rank %d" % (self, rank)) 
622 
623 def with_rank(self, rank): 

ValueError: Shape (?, 12) must have rank 1 

錯誤嘗試切片x(已經形(?, 12))插入x[0]x[1]當發生就行return K.exp(-1 * gamma * l2_norm(x[0], x[1]) ** 2)

爲什麼Tensorflow slice方法會拋出此錯誤?

回答

1

正如錯誤所述,形狀(?, 12)不是等級1.張量等級(有時稱爲等級或等級或n維)是張量的維數。例如,下面的張量(定義爲Python列表)具有秩2:

t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

在TensorFlow,切片操作稍有比蟒numpy的不太靈活。切片中指定的維數必須等於張量的等級。

tf.slice(input, begin, size, name=None)

此操作從張量輸入開始在由begin指定的位置中提取大小size的切片。切片size表示爲張量形狀,其中size[i]是要切片的「i」維輸入的元素數。切片的起始位置(開始)表示爲輸入的每個維度中的偏移量。換句話說,begin[i]是您想要切片的輸入「i」維的偏移量。

begin是基於零的; size是基於一個的。如果size [i]爲-1,則維度i中的所有其餘元素都包含在切片中。

簡而言之,操作符要求開始和大小向量 - 定義要分割的子範圍 - 具有與輸入中的維數相同的長度。例如,要分割三維張量,必須傳遞三個數字的向量(或列表)作爲tf.slice()的第二個和第三個參數。

例如:

# 'input' is [[[1, 1, 1], [2, 2, 2]], 
#    [[3, 3, 3], [4, 4, 4]], 
#    [[5, 5, 5], [6, 6, 6]]] 
tf.slice(input, [1, 0, 0], [1, 1, 3]) ==> [[[3, 3, 3]]] 
tf.slice(input, [1, 0, 0], [1, 2, 3]) ==> [[[3, 3, 3], 
              [4, 4, 4]]] 
tf.slice(input, [1, 0, 0], [2, 1, 3]) ==> [[[3, 3, 3]], 
              [[5, 5, 5]]] 

所以,你可以如下,它應該工作修改rbf()功能:

def rbf(x, gamma=1.0): 
    return K.exp(-1 * gamma * l2_norm(x[0, :], x[1, :]) ** 2) 
0

注:我無法用最新版本的TensorFlow重現此問題。我懷疑你正在使用TensorFlow 0的候選版本之一。10,或更早的版本,因爲在發佈的版本就可以寫:

x = tf.placeholder(tf.float32, shape=[None, 12]) 
print(x[0].get_shape()) # ==> (12,) 
print(x[1].get_shape()) # ==> (12,) 

在老版本TensorFlow的,你必須明確指定切片的每一個層面使用tf.slice()運算時或[] Python切片運算符。如果您無法升級到最新版本(我們一般推薦!),您的rbf()函數的以下修改版本應該可以工作:

def rbf(x, gamma=1.0): 
    return K.exp(-1 * gamma * l2_norm(x[0, :], x[1, :]) ** 2) 
相關問題