web-dev-qa-db-fra.com

Comment utiliser la couche lambda dans les keras?

Je veux définir une couche lambda pour combiner des fonctionnalités avec un produit croisé, puis fusionner ces modèles, tout comme la fig. ,Que devrais-je faire?

enter image description here

Testez model_1, obtenez 128 dimensions sous forme dense, utilisez pywt obtenez deux fonctionnalités de 64 dimensions (cA,cD), Puis retournez cA * cD // bien sûr, je veux combiner deux modèles, mais essayez d'abord 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))

Désolé, puis-je poser une question sur le tenseur?

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)

C'est vrai! cependant,

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

J'ai obtenu <CudaNdarrayType(float32, matrix)> et kvar.eval() J'ai obtenu b'CudaNdarray([[ 1. 2.]\n [ 3. 4.]])'. J'utilise des keras, alors comment obtenir un tableau comme tensorflow en utilisant des keras?

10
Ting Li

Je dupliquerais probablement les couches denses. Au lieu d'avoir 2 couches avec 128 unités, ayez 4 couches avec 64 unités. Le résultat est le même, mais vous pourrez mieux réaliser les produits croisés.

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)

Maintenant, pour la fonction lambda:

import keras.backend as K

def myFunc(x):
    return x[0] * x[1]
6
Daniel Möller