機能をクロス積と組み合わせるラムダレイヤーを定義してから、図のようにそれらのモデルをマージします。 、私は何をすべきか?
Model_1をテストし、128次元を密に取得し、pywt
を使用して2つの64次元を取得しますfeature(_cA,cD
_)、次にcA * cDを返します//もちろん2つのモデルを結合したいのですが、まず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.]])'
を取得しました。私はケラスを使用していますが、ケラスを使用してテンソルフローのような配列を取得するにはどうすればよいですか?
私はおそらく密な層を複製するでしょう。 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)
ここで、ラムダ関数について:
import keras.backend as K
def myFunc(x):
return x[0] * x[1]