2017-07-03 2 views
1

Ich möchte Lambda-Layer definieren, um Features mit Cross-Produkt zu kombinieren, dann füge ich diese Modelle zusammen, genau wie die Abb. ,Was soll ich machen?Wie verwende ich Lambda-Layer in Keras?

enter image description here

-Test model_1, erhalten 128 Dimensionen dicht bilden, verwenden pywt erhalten zwei 64 Dimensionen verfügen (cA,cD), dann wieder KeyCA cD // ich natürlich zwei Modelle kombinieren wollen, aber versuchen model_1 zuerst.

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

Entschuldigung, kann ich eine Frage über Tensor stellen?

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) 

Das stimmt! Allerdings

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

Ich habe <CudaNdarrayType(float32, matrix)> und kvar.eval() Ich habe b'CudaNdarray([[ 1. 2.]\n [ 3. 4.]])'. Ich benutze Keras, also wie bekomme ich Array wie Tensorflow mit Keras?

+0

So Keras Lambda-Funktionen alle Operationen benötigen "Tensor" zu verwenden. Die allgemeinen Vorgänge sind in https://keras.io/backend/ aufgeführt. Sie müssen einen Weg finden, um pywt.dwt auf Tensor-Art umzuschreiben. Leider ist das keine leichte Aufgabe. Ich glaube, dass diese Frage sehr wichtig ist und ich kann sie nicht richtig beantworten. –

+0

Muss die Lambda-Schicht die Keras-Backend-Funktion verwenden? Kann ich Tensor in ein Array transformieren, dann pywt.dwt verwenden und Array in Tensor umwandeln? –

+0

Es ist möglich, aber das wird den "Graphen" unterbrechen und wird einen Fehler bringen. Um einen Tensor in einem Array zu konvertieren, verwenden Sie "tensorVar.eval()". Um einen Tensor aus einem Array zu erstellen, verwenden Sie "K.variable (arrayVar)", wobei K das keras.backend ist. –

Antwort

1

Ich würde wahrscheinlich die dichten Schichten duplizieren. Anstatt 2 Schichten mit 128 Einheiten zu haben, haben Sie 4 Schichten mit 64 Einheiten. Das Ergebnis ist das gleiche, aber Sie können die Cross-Produkte besser ausführen.

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) 

Nun, für die Lambda-Funktion:

import keras.backend as K 

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

Vielen Dank! Wenn ich model.add (Dense (128)) verwende 128 Dimensionen, füge ich model.add hinzu (Lambda (wavelets, output_shape = input_shape [0])), aber ich weiß nicht, wie man die Lambda-Ebene benutzt. Ich möchte Wavelets (Funktion: (cA, cD) = pywt.dwt (x, 'db1')) verwenden, um Approximations- und Detailkoeffizienten zu erhalten (beide 64 Dimensionen, wie diese Abb.). Dann kreuzen Sie die Produkt-Approximationskoeffizienten mit Modell 1 und 2. Schließlich verschmelzen Sie die Approximations- und Detailkoeffizienten mit dem Modus concat. Kannst du mir helfen, Lambda-Layer zu schreiben? –

+0

Sorry nicht Cross-Produkt, es ist * –

+0

Aktualisiert meine Antwort. –