在模型创建期间,如何在keras/tensorflow中执行层的笛卡尔积?

在模型创建期间,如何在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

我需要帮助在我的模型中创建最后一层,使其成为前三层的笛卡尔积

我有三个输入层大小为None,2,模型返回三个输出层大小为None,2

因此,我的最后一层应该有大小为None的笛卡尔积,8

我在以下方面尝试过这个建议:

没有成功

我正在使用keras。我尝试了merge-layer-multiply函数,但它只是元素乘积,而不是笛卡尔乘积

我的模型如下:

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)

有人能给点小费吗?仍然卡住:/