Python Keras/Tensorflow:ValueError:形状(?,12)必须具有秩1

Python Keras/Tensorflow:ValueError:形状(?,12)必须具有秩1,python,neural-network,tensorflow,keras,Python,Neural Network,Tensorflow,Keras,(Keras1.0.7,Tensorflowr0.10) 我正在尝试实现我自己的激活功能: # 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 = Sequ

(Keras
1.0.7
,Tensorflow
r0.10

我正在尝试实现我自己的激活功能:

# 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))
以下是我的模型的相关部分,我在其中指定了自定义激活功能:

# 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]
中时,在返回K.exp(-1*gamma*l2_norm(x[0],x[1])**2
上发生错误


为什么Tensorflow
slice
方法会抛出此错误?

正如错误所说,形状
(?,12)
不是等级1。张量秩(有时称为阶、度或n维)是张量的维数。例如,以下张量(定义为Python列表)的秩为2:

t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
在TensorFlow中,切片操作的灵活性略低于python numpy。切片中指定的维数必须等于张量的秩

此操作从张量输入中提取一个大小为
size
的切片,从
begin
指定的位置开始。切片
size
表示为张量形状,其中
size[i]
是要切片的输入“i”维的元素数。切片的起始位置(begin)表示为输入的每个维度中的偏移量。换句话说,
begin[i]
是要从中切片的输入的“i”维的偏移量

begin
以零为基础<代码>大小
基于一个。如果大小[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)
def rbf(x, gamma=1.0):
    return K.exp(-1 * gamma * l2_norm(x[0, :], x[1, :]) ** 2)

N.B.我无法用最新版本的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中,在使用op或
[]
Python切片运算符时,必须显式指定切片的每个维度。如果无法升级到最新版本(我们通常会推荐!),则以下修改版本的
rbf()
函数应该可以工作:

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