在模型创建期间,如何在keras/tensorflow中执行层的笛卡尔积?
我需要帮助在我的模型中创建最后一层,使其成为前三层的笛卡尔积 我有三个输入层大小为None,2,模型返回三个输出层大小为None,2 因此,我的最后一层应该有大小为None的笛卡尔积,8 我在以下方面尝试过这个建议: 及 没有成功 我正在使用keras。我尝试了merge-layer-multiply函数,但它只是元素乘积,而不是笛卡尔乘积 我的模型如下:在模型创建期间,如何在keras/tensorflow中执行层的笛卡尔积?,keras,merge,layer,Keras,Merge,Layer,我需要帮助在我的模型中创建最后一层,使其成为前三层的笛卡尔积 我有三个输入层大小为None,2,模型返回三个输出层大小为None,2 因此,我的最后一层应该有大小为None的笛卡尔积,8 我在以下方面尝试过这个建议: 及 没有成功 我正在使用keras。我尝试了merge-layer-multiply函数,但它只是元素乘积,而不是笛卡尔乘积 我的模型如下: from keras.layers import Dense, Input, Flatten, Lambda from keras.mode
from keras.layers import Dense, Input, Flatten, Lambda
from keras.models import Model
from keras.layers.merge import concatenate, multiply, add
from keras import backend as K
import tensorflow as tf
left_input = Input(shape=(2, ), name='alice')
left_branch = Dense(128, activation='relu', name='left_branch')(left_input)
a = Dense(2, activation='softmax', name='soft_left_branch')(left_branch)
middle_input = Input(shape=(2,), name='bob')
middle_branch = Dense(128, activation='relu', name='middle_branch')(middle_input)
b = Dense(2, activation='softmax', name='soft_middle_branch')(middle_branch)
right_input = Input(shape=(2,), name='charlie')
right_branch = Dense(128, activation='relu', name='right_branch')(right_input)
c = Dense(2, activation='softmax', name='soft_right_branch')(right_branch)
x = multiply([a, b, c])
predictions = Dense(8, activation='softmax', name='main_output')(x)
model = Model(inputs=[left_input, middle_input, right_input], outputs=predictions)
因此,我需要笛卡尔积axbxc,而不是x中的乘法
如果a=[a1,a2],b=[b1,b2]和c=[c1,c2]
我需要x=[a1*b1*c1,a1*b1*c2,a1*b2*c1,a1*b2*c2,a2*b1*c1,a2*b1*c2,a2*b2*c1,a2*b2*c2],形状为无,8
提前感谢您的帮助。受此答案启发:
我最终得到了这个解决方案,也许它可以帮助别人
from keras.layers import Dense, Input, Flatten, Lambda, BatchNormalization
from keras.models import Model
from keras.layers.merge import concatenate, multiply, add, Dot
from keras.backend import slice
left_input = Input(shape=(2, ), name='alice')
left_branch = Dense(128, activation='relu', name='left_branch')(left_input)
a = Dense(2, activation='softmax', name='soft_left_branch')(left_branch)
middle_input = Input(shape=(2,), name='bob')
middle_branch = Dense(128, activation='relu', name='middle_branch')(middle_input)
b = Dense(2, activation='softmax', name='soft_middle_branch')(middle_branch)
right_input = Input(shape=(2,), name='charlie')
right_branch = Dense(128, activation='relu', name='right_branch')(right_input)
c = Dense(2, activation='softmax', name='soft_right_branch')(right_branch)
outs_a = []
outs_b = []
outs_c = []
len_outs = a.get_shape().as_list()[1] #a, b and c have same number of columns. Here "len_outs = 2".
for i in range(0, len_outs):
outs_a.append(Lambda(lambda x: x[:,i:i+1], output_shape=(1,), name="a"+str(i))(a))
outs_b.append(Lambda(lambda x: x[:,i:i+1], output_shape=(1,), name="b"+str(i))(b))
outs_c.append(Lambda(lambda x: x[:,i:i+1], output_shape=(1,), name="c"+str(i))(c))
cp_l = []
for i in range(0,len_outs):
for j in range(0,len_outs):
for k in range(0,len_outs):
cp_l.append( multiply([ outs_a[i],outs_b[j],outs_c[k] ]) )
cp = concatenate(cp_l) #cartesian product as the concatenation of the terms in list cp_l
predictions = cp
model = Model(inputs=[left_input, middle_input, right_input], outputs = predictions)
有人能给点小费吗?仍然卡住:/