【问题标题】:keras/theano-how to return a constant in lambdakeras/theano-如何在 lambda 中返回一个常量
【发布时间】:2017-09-11 11:56:48
【问题描述】:

我正在尝试在 keras 中使用 lambda 层来返回两个向量的欧几里得距离。代码是:

def distance(x):
    a=x[0]
    b=x[1]
    dist=np.linalg.norm(a-b)
    return dist
dist=Lambda(distance,output_shape=(1,1)name='dist')([x,y])

这一层的输入是(100,1,8192)的两个向量。 100是批次。理论上输出是一个常数。我想使用 dist 作为这个模型的输出,比如:

model = Model(inputs=[probe_input_car,probe_input_sign,gallary_input_car,gallary_input_sign], outputs=dist, name='fcn')`

我运行这个模型的时候会报错:

ValueError: Input dimension mis-match. (input[0].shape[2] = 1, input[1].shape[2] = 8192)
Apply node that caused the error: Elemwise{Composite{EQ(i0, RoundHalfToEven(i1))}}(/dist_target, Elemwise{Composite{sqrt(sqr(i0))}}.0)
Toposort index: 92
Inputs types: [TensorType(float32, 3D), TensorType(float32, 3D)]
Inputs shapes: [(100, 1, 1), (100, 1, 8192)]
Inputs strides: [(4, 4, 4), (32768, 32768, 4)]
Inputs values: ['not shown', 'not shown']
Outputs clients: [[Sum{acc_dtype=int64}(Elemwise{Composite{EQ(i0, RoundHalfToEven(i1))}}.0)]]

我认为这是由 lambda 层的 output_shape 引起的。我应该如何设置图层的 output_shape。因为我使用 theano 作为后端,所以它不能计算 output_shape 本身。 如果不是由 output_shape 引起的。哪里出错了?

【问题讨论】:

  • 你能发布你“运行”这个模型的行吗?

标签: python lambda keras theano


【解决方案1】:

您似乎只是获取了向量的错误部分。

消息说它正在尝试用两个形状如下的张量计算一些东西:

  • (100,1,1)
  • (100,1,8192)

根据您的输入列表,您有[car,signal,car2,signal2]。我相信您可能想要在car x carsignal x signal 之间进行一些操作。

因此,您的 lambda 层可能应该从以下任一开始:

a = x[0]
b = x[2]

或:

a = x[1]
b = x[3]

提示:如果你能够在keras backend 中找到一个等价的函数来计算你想要的,那可能会更好。我想知道您如何没有收到使用 numpy 函数的“断开连接”错误消息。

【讨论】:

    【解决方案2】:

    发生错误是因为您在 Theano 张量上使用了np.linalg.norm()。它不会抛出错误,但输出肯定不是你所期望的。

    为避免此错误,请改用 Keras 后端函数。例如,

    dist = K.sqrt(K.sum(K.square(a - b), axis=-1, keepdims=True))
    

    np.linalg.norm(x) 内部发生了什么:

    1. x = np.asarray(x)a - b 包装成一个长度为 1 的数组(dtype object),其唯一元素是形状为 (100, 1, 8192) 的 Theano 张量。
    2. sqnorm = np.dot(x, x):回忆点积的定义。当你用它自己点一个长度为 1 的数组时,你实际上是在计算 (a - b) * (a - b),或 a - b 的元素平方。这就是为什么在您的错误的第二行中有sqr(i0)
    3. np.sqrt(sqnorm) 返回。所以你可以看到sqrt(sqr(i0))出现在你的错误中。
    4. 因此,np.linalg.norm(a - b) 的输出是形状为 (100, 1, 8192) 的张量,而不是 (100, 1, 1)。

    另外,如果您仔细观察the codeElemwise{Composite{EQ(i0, RoundHalfToEven(i1))}} 就是准确度。

    def binary_accuracy(y_true, y_pred):
        return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
    

    因此错误消息试图告诉您y_truey_pred 的形状不匹配。 y_true 的形状为 (100, 1, 1),y_pred 的形状为 (100, 1, 8192),因为 np.linalg.norm() 为 Theano 张量提供了错误的结果。

    【讨论】:

    • 感谢您的回答。使用您的方法后它开始工作。
    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多