2017-07-03 1281 views
1

我想要定义lambda层以将特征与叉积组合,然后合并这些模型,就像图。 ,我该怎么办?如何在keras中使用lambda层?

enter image description here

测试model_1,得到128个尺寸形成密集,使用pywt得到两个64维特征(cA,cD),然后返回CA *的cD //我当然希望两个模型结合起来,但第一次尝试model_1。

from keras.models import Sequential,Model 
from keras.layers import Input,Convolution2D,MaxPooling2D 
from keras.layers.core import Dense,Dropout,Activation,Flatten,Lambda 
import pywt 

def myFunc(x): 
    (cA, cD) = pywt.dwt(x, 'db1') 
# x=x*x 
    return cA*cD 

batch_size=32 
nb_classes=3 
nb_epoch=20 
img_rows,img_cols=200,200 
img_channels=1 
nb_filters=32 
nb_pool=2 
nb_conv=3 

inputs=Input(shape=(1,img_rows,img_cols)) 
x=Convolution2D(nb_filters,nb_conv,nb_conv,border_mode='valid', 
        input_shape=(1,img_rows,img_cols),activation='relu')(inputs) 
x=Convolution2D(nb_filters,nb_conv,nb_conv,activation='relu')(x) 
x=MaxPooling2D(pool_size=(nb_pool,nb_pool))(x) 
x=Dropout(0.25)(x) 
x=Flatten()(x) 
y=Dense(128,activation='relu')(x) 
cross=Lambda(myFunc,output_shape=(64,))(y) 
predictions=Dense(nb_classes,activation='softmax')(cross) 
model = Model(input=inputs, output=predictions) 
model.compile(loss='categorical_crossentropy',optimizer='adadelta',metrics=['accuracy']) 

model.fit(X_train,Y_train,batch_size=batch_size,nb_epoch=nb_epoch, 
      verbose=1,validation_data=(X_test,Y_test)) 

对不起,我可以问一个关于张量的问题吗?

import tensorflow as tf 
W1 = tf.Variable(np.array([[1,2],[3,4]])) 
init = tf.global_variables_initializer() 
sess = tf.Session() 
sess.run(init) 
array = W1.eval(sess) 
print (array) 

没错!然而,

from keras import backend as K 
import numpy as np 
kvar=K.variable(np.array([[1,2],[3,4]])) 
K.eval(kvar) 
print(kvar) 

<CudaNdarrayType(float32, matrix)>kvar.eval()b'CudaNdarray([[ 1. 2.]\n [ 3. 4.]])'。我使用keras,所以如何使用keras获得类似tensorflow的数组?

+0

所以,keras lambda函数需要的所有操作使用 “张量”。常用操作全部列在https://keras.io/backend/中。你必须找到一种以张量方式重写pywt.dwt的方法。不幸的是,这不是一件容易的事。我相信这个问题非常重要,我无法正确回答。 –

+0

lambda层必须使用keras后端功能吗?我可以将张量转换为数组,然后使用pywt.dwt,然后将数组转换为张量? –

+0

这是可能的,但是这会中断“图形”并且会带来错误。要转换数组中的张量,请使用“tensorVar.eval()”。要从数组创建张量,请使用“K.variable(arrayVar)”,其中K是keras.backend。 –

回答

1

我会probaly复制致密层。而不是有128个单位的2层,有64个单位的4层。结果是一样的,但你将能够更好地执行交叉产品。现在

from keras.models import Model 

#create dense layers and store their output tensors, they use the output of models 1 and to as input  
d1 = Dense(64, ....)(Model_1.output) 
d2 = Dense(64, ....)(Model_1.output) 
d3 = Dense(64, ....)(Model_2.output) 
d4 = Dense(64, ....)(Model_2.output) 

cross1 = Lambda(myFunc, output_shape=....)([d1,d4]) 
cross2 = Lambda(myFunc, output_shape=....)([d2,d3]) 

#I don't really know what kind of "merge" you want, so I used concatenate, there are Add, Multiply and others.... 
output = Concatenate()([cross1,cross2]) 
    #use the "axis" attribute of the concatenate layer to define better which axis will be doubled due to the concatenation  

model = Model([Model_1.input,Model_2.input], output) 

,为lambda函数:

import keras.backend as K 

def myFunc(x): 
    return x[0] * x[1] 
+0

非常感谢!当我使用model.add(Dense(128))获得128维时,我添加了model.add(Lambda(wavelets,output_shape = input_shape [0])),但我不知道如何使用lambda层。我想使用小波(函数:(cA,cD)= pywt.dwt(x,'db1'))来获得近似和细节系数(它们都是64维,就像图)。然后用模型1和2交叉乘积近似系数。最后将近似和细节系数与模式concat合并。你能帮助写入lambda层吗? –

+0

对不起,没有跨产品,它* –

+0

更新了我的答案。 –