【问题标题】:Keras Lambda Layer for matrix vector multiplication用于矩阵向量乘法的 Keras Lambda 层
【发布时间】:2019-12-23 21:11:40
【问题描述】:

我试图在 keras 中创建一个执行向量矩阵乘法的 lambda 层,然后再将其传递到另一层。矩阵是固定的(我不想学习它)。代码如下:

model.add(Dropout(0.1))    
model.add(Lambda(lambda x: x.dot(A)))
model.add(Dense(output_shape, activation='softmax'))
model.compile(<stuff here>)}

A是固定矩阵,我想做x.dot(A)

当我运行它时,我收到以下错误:

'Tensor' object has no attribute 'dot'

当我用 matmul 替换 dot 时出现同样的错误(我正在使用 tensorflow 后端)

最后,当我将 lambda 层替换为

model.add(Lambda(lambda x: x*A))

我收到以下错误:

model.add(Lambda(lambda x: x*G))

model.add(Dense(output_shape, activation='softmax'))

AttributeError: 'tuple' object has no attribute '_dims'

我是 Keras 的新手,因此我们将不胜感激。谢谢

【问题讨论】:

    标签: neural-network deep-learning keras


    【解决方案1】:

    我认为您可以添加一个初始权重为矩阵ADense 层,并设置参数trainable=Falseuse_bias=False。这一层将相当于一个固定的矩阵乘法。

    model.add(Dense(A.shape[1], trainable=False, weights=[A], use_bias=False))
    

    【讨论】:

    • 这似乎很合理,我试过了,但得到以下结果:层权重形状 (1, 265) 与提供的权重形状 (265, 265) 不兼容。 265 是 A.shape[1] (它是一个方阵)
    • 你能提供model.summary()吗?似乎之前的层的输出维度等于 1。
    • 如果上一层的输出形状是(None, 265, 1),那么我想你可以通过添加Flatten层来移除多余的轴。
    • 没有上一层是(无,265)。我实现了@Daniel 的方法,但它对我有用
    • 谢谢!这正是我所需要的。我需要在每个训练步骤中更改矩阵(权重),这个解决方案提供了一种方法来做到这一点。谢谢
    【解决方案2】:

    为 lambda 创建一个函数:

    import keras.backend as K
    import numpy as np
    
    numpyA = np.array(define A correctly here, with 2 dimensions)
    
    def multA(x):
        A = K.variable(numpyA)
    
        return K.dot(x,A)
    
    model.add(Lambda(multA))
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 1970-01-01
      • 2020-03-16
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2020-01-17
      相关资源
      最近更新 更多