2017-10-19 65 views
2

我想在训练样本中引入稀疏性。我的数据矩阵的大小(比如说)NxP,我想通过它的权重大小与输入大小相同的图层(keras图层)。这是可训练的权重矩阵W具有N×P的形状。我想对这个图层做一个输入矩阵的哈达玛产品(元素级乘法)。 W将元素与输入相乘。在这种情况下如何获得W的可训练层?如何在keras中添加可训练的hadamard产品图层?

编辑: 顺便说一句,非常感谢你的快速回复。然而,我想要做的hadamard产品是在两个矩阵之间,一个是输入,让它叫做X,我的X是NxP的形状。我希望我的内核在hadamard层中与X的大小相同,因此内核的大小也应该是NxP。通过调用函数实现两个矩阵的元素乘法。

但是当前的实现只给出了P的内核大小。另外,我试图改变内核的形状在构建如下:

self.kernel = self.add_weight(name='kernel', 
             shape=input_shape, 
             initializer='uniform', 
             trainable=True) 

但它给了我下面的错误:

类型错误:未能类型的对象转换为张量。内容:(无,16)。考虑将元素转换为支持的类型。

这里P是16,我将在运行期间得到我的N,N与训练样本的数量相似。

非常感谢您的帮助。

回答

2

documentation为例创建一个图层,并在call函数中将其定义为x * self.kernel

这是我的POC:

from keras import backend as K 
from keras.engine.topology import Layer 
from keras.models import Sequential 
from keras.layers import Dense, Activation 
import numpy as np 
np.random.seed(7) 

class Hadamard(Layer): 

    def __init__(self, **kwargs): 
     super(Hadamard, self).__init__(**kwargs) 

    def build(self, input_shape): 
     # Create a trainable weight variable for this layer. 
     self.kernel = self.add_weight(name='kernel', 
             shape=(1,) + input_shape[1:], 
             initializer='uniform', 
             trainable=True) 
     super(Hadamard, self).build(input_shape) # Be sure to call this somewhere! 

    def call(self, x): 
     print(x.shape, self.kernel.shape) 
     return x * self.kernel 

    def compute_output_shape(self, input_shape): 
     print(input_shape) 
     return input_shape 

N = 10 
P = 64 

model = Sequential() 
model.add(Dense(128, input_shape=(N, P), activation='relu')) 
model.add(Dense(64)) 
model.add(Hadamard()) 
model.add(Activation('relu')) 
model.add(Dense(32)) 
model.add(Dense(1)) 

model.compile(loss='mean_squared_error', optimizer='adam') 

print(model.summary()) 

model.fit(np.ones((10, N, P)), np.ones((10, N, 1))) 

print(model.predict(np.ones((20, N, P)))) 

如果你需要使用它作为第一层,你应该包括输入形状参数:

N = 10 
P = 64 

model = Sequential() 
model.add(Hadamard(input_shape=(N, P))) 

model.compile(loss='mean_squared_error', optimizer='adam') 

print(model.summary()) 

这导致:

_________________________________________________________________ 
Layer (type)     Output Shape    Param # 
================================================================= 
hadamard_1 (Hadamard)  (None, 10, 64)   640  
================================================================= 
Total params: 640 
Trainable params: 640 
Non-trainable params: 0 
WOW !!
+0

这是一些快速答复。非常感谢。 –

+0

没问题,它适合你吗? –

+0

其实不,我已编辑我的问题,以包含更多详细信息 –

相关问题