2016-11-27 192 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) 
相关问题