在模型创建过程中如何在角膜/张量流中执行层的笛卡尔积?

问题描述 投票:0回答:1

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

我有三个大小为(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)。

提前感谢您的帮助。

keras merge layer
1个回答
1
投票

受到此答案的启发: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)
© www.soinside.com 2019 - 2024. All rights reserved.