我需要帮助在模型中创建最后一层,使其成为前三层的笛卡尔积。
我有三个大小为(None,2)的输入层,模型返回了三个大小为(None,2)的输出层。
所以我的最后一层应该具有大小为(None,8)的笛卡尔积。
我尝试过以下建议:
Cartesian Product in Tensorflow
和
https://github.com/keras-team/keras/issues/12608
没有成功。
我正在使用keras。我尝试了合并层乘法功能,但这只是逐元素乘积,而不是笛卡尔乘积。
我的模特如下:
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”中的“ multiply”。
如果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)。
提前感谢您的帮助。
受到此答案的启发:Slice tensor with variable indexes with Lambda Layer in Keras,
我最终得到了这个解决方案,也许它可以对某人有所帮助。
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)