Neural network 矩阵向量乘法的Keras-Lambda层

Neural network 矩阵向量乘法的Keras-Lambda层,neural-network,deep-learning,keras,Neural Network,Deep Learning,Keras,我试图在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>)} model.add(退出(0.1)) model.add(Lam

我试图在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>)}
model.add(退出(0.1))
model.add(Lambda(Lambda x:x.dot(A)))
添加(密集(输出_形,激活='softmax'))
model.compile()}
A是固定矩阵,我想做x.dot(A)

当我运行此操作时,会出现以下错误:

“张量”对象没有属性“点”

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

最后,当我将lambda层替换为

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

我得到以下错误:

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

model.add(密集型(输出_形,activation='softmax'))

AttributeError:“tuple”对象没有属性“\u dims”


我是Keras的新手,所以任何帮助都将不胜感激。谢谢

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

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

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

这似乎是合理的,我试过了,但得到了以下结果:层权重形状(1265)与提供的权重形状(265265)不兼容。265是A.shape[1](它是一个方阵)您能提供
model.summary()
?似乎前一层的输出尺寸等于1。如果前一层的输出形状是
(None,265,1)
,那么我认为您可以通过添加
展平
层来删除额外的轴。不,前一层是(None,265)。我实现了@Daniel的方法,但这对我来说很有效