【问题标题】:Keras/Tensorflow: ValueError: Shape (?,12) must have rank 1Keras/Tensorflow: ValueError: Shape (?,12) must have rank 1
【发布时间】:2016-11-27 17:58:09
【问题描述】:

(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))

我收到以下错误:

/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 方法为什么会抛出这个错误?

【问题讨论】:

    标签: python neural-network tensorflow keras


    【解决方案1】:

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

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

    在 TensorFlow 中,切片操作的灵活性略低于 python numpy。切片中指定的维数必须等于张量的秩。

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

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

    begin 是从零开始的; size 是基于 1 的。如果 size[i] 为 -1,则维度 i 中的所有剩余元素都包含在切片中。

    简而言之,运算符要求定义要切片的子张量的 begin 和 size 向量具有与输入中的维数相同的长度。例如,要对一个 3-D 张量进行切片,您必须传递一个包含三个数字的向量(或列表)作为 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)
    

    【讨论】:

      【解决方案2】:

      注意我无法使用最新版本的 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)
      

      【讨论】:

        猜你喜欢
        • 2018-06-01
        • 1970-01-01
        • 2018-10-20
        • 2021-12-29
        • 2022-07-16
        • 2017-02-04
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多