Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在keras中使用lambda层?_Python_Lambda_Keras Layer - Fatal编程技术网

Python 如何在keras中使用lambda层?

Python 如何在keras中使用lambda层?,python,lambda,keras-layer,Python,Lambda,Keras Layer,我想定义lambda层,将特征与交叉积相结合,然后合并这些模型,就像图一样,我应该怎么做 测试模型_1,从稠密的表单中获取128维,使用pywt获取两个64维功能(cA,cD),然后返回cA*cD//当然我想合并两个模型,但首先尝试模型_1 from keras.models import Sequential,Model from keras.layers import Input,Convolution2D,MaxPooling2D from keras.layers.core impor

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

测试模型_1,从稠密的表单中获取128维,使用
pywt
获取两个64维功能(
cA,cD
),然后返回cA*cD//当然我想合并两个模型,但首先尝试模型_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)

我得到了
kvar.eval()
我得到了
b'CudaNdarray([[1.2.]\n[3.4.]])
。我使用keras,那么如何使用keras获得类似tensorflow的阵列呢?

我可能会复制密集层。不是有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)
现在,对于lambda函数:

import keras.backend as K

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

谢谢!当我使用model.add(稠密(128))获得128维时,我添加model.add(Lambda(小波,output\u shape=input\u shape[0]),但我不知道如何使用Lambda层。我想使用小波(function:(cA,cD)=pywt.dwt(x,'db1'))来获得近似值和细节系数(它们都是64维的,如图所示)。然后对模型1和模型2的近似系数进行叉积。最后将近似系数和细节系数与模式concat合并。你能帮我写lambda图层吗?对不起,不是叉积,它*更新了我的答案。对不起,输出_形状=。。?我使用theano作为后端,它不能自动推断。是的,您必须将输出形状放在lambda层中。如果使用一维向量,密集层将输出
(64,)
,因此lambda中的输出形状也将是
(64,)
,因此,keras lambda函数需要所有操作才能使用“张量”。中列出了所有常用操作。您必须找到一种以张量方式重写pywt.dwt的方法。不幸的是,这不是一项容易的任务。我认为这个问题很重要,我无法正确回答。lambda层是否必须使用keras后端功能?我可以将张量转换为数组,然后使用pywt.dwt,然后将数组转换为张量吗?这是可能的,但这会中断“图形”并带来错误。要转换数组中的张量,请使用“tensorVar.eval()”。要从数组创建张量,请使用“K.variable(arrayVar)”,其中K是keras.backend。非常感谢!我将尝试itTry
karr=kvar.eval()