Python 如何在 keras 中使用 lambda 层?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/44886195/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 00:34:59  来源:igfitidea点击:

How to use lambda layer in keras?

pythonlambdakeras-layer

提问by Ting Li

I want to define lambda layer to combine features with cross product, then merge those models,just like the fig. ,What should I do?

我想定义 lambda 层以将特征与叉积相结合,然后合并这些模型,就像图一样。,我该怎么办?

enter image description here

在此处输入图片说明

Test model_1, get 128 dimensions form dense, use pywtget two 64 dimensions feature(cA,cD), then return cA*cD //of course I want to combine two models ,but try model_1 first.

测试model_1,得到128维形成dense,使用pywt得到两个64维的feature( 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))

Sorry, can I ask a question about tensor?

抱歉,我可以问一个关于张量的问题吗?

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)

That's right! However,

这是正确的!然而,

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

I got <CudaNdarrayType(float32, matrix)>and kvar.eval()I got b'CudaNdarray([[ 1. 2.]\n [ 3. 4.]])'. I use keras, so how can I get array like tensorflow using keras?

我得到了<CudaNdarrayType(float32, matrix)>kvar.eval()我得到了b'CudaNdarray([[ 1. 2.]\n [ 3. 4.]])'。我使用 keras,那么如何使用 keras 获得像 tensorflow 这样的数组?

采纳答案by Daniel M?ller

I would probaly duplicate the dense layers. Instead of having 2 layers with 128 units, have 4 layers with 64 units. The result is the same, but you will be able to perform the cross products better.

我可能会复制密集层。不是有 2 层有 128 个单元,而是有 4 层有 64 个单元。结果是相同的,但您将能够更好地执行交叉产品。

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)

Now, for the lambda function:

现在,对于 lambda 函数:

import keras.backend as K

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