我正在Keras中编写Lambda层,以计算张量和常数矩阵的乘积。但是输出的大小出错了。
在代码中,jdes
是张量为TensorShape([Dimension(None), Dimension(100)])
的张量。此外,six_title_embedding
是常数的矩阵,其形状为(6, 100)
。
def cosine_distance(input):
jd = K.l2_normalize(input, axis=-1)
jt_six = K.l2_normalize(six_title_embedding, axis=-1)
return jd * jt_six
distance = Lambda(cosine_distance, output_shape=(None, 6,100))(jdes)
result = Dense(1, activation='sigmoid')(distance)
在输出中,我期望result
的形状为(None, 6, 1)
,但是现在它的形状为(6, 1)
,因此batch_size
的数量在lambda层的计算过程中会丢失。 distance
的形状现在为TensorShape([Dimension(6), Dimension(100)])
。应该是(None, 6, 100)
,以便结果可以有(None, 6, 1)
吗?
答案 0 :(得分:0)
您需要为jdes
创建一个附加轴,以便在将它与恒定张量相乘时可以将它们广播为相同的形状:
def cosine_distance(input):
jd = K.l2_normalize(input, axis=-1)
jt_six = K.l2_normalize(six_title_embedding, axis=-1)
jd = K.expand_dims(jd, axis=1) # now it would have a shape of (None, 1, 100)
return jd * jt_six # the result would be (None, 6, 100)