Keras中如何实现标量张量与高维张量的乘法运算?
嘿,这个问题我之前踩过坑!Keras自带的multiply确实要求输入张量的维度完全匹配,但咱们可以利用TensorFlow的广播机制,或者手动扩展标量张量的维度来解决,两种方法都很简单,我给你拆解下:
方法一:直接在Lambda层完成乘法(推荐)
TensorFlow本身支持维度广播,所以我们可以把标量张量和向量张量的乘法直接放到同一个Lambda层里完成,不用单独处理维度问题。修改你的代码如下:
scale_, mean_ = 2., 4. a = Input(shape=(300,), name='Input_vec') m_num = Input(shape=(1,), name='Input_num') # 把两个输入传入Lambda,一次性完成指数变换+广播乘法 output = Lambda(lambda x: K.exp(x[1] * scale_ + mean_) * x[0])([a, m_num])
这里x[0]是你的300维向量,x[1]是标量张量,TensorFlow会自动把标量广播成和向量一样的形状((300,)),然后执行元素级乘法,完美适配你的需求。
方法二:手动扩展标量张量维度再用multiply
如果你坚持想用Keras的multiply函数,可以先把标量张量的维度扩展成和向量一致,比如用K.repeat_elements重复标量值:
scale_, mean_ = 2., 4. a = Input(shape=(300,), name='Input_vec') m_num = Input(shape=(1,), name='Input_num') mulNum = Lambda(lambda x: K.exp(x * scale_ + mean_))(m_num) # 把形状为(None,1)的mulNum扩展成(None,300) mulNum_expanded = Lambda(lambda x: K.repeat_elements(x, rep=300, axis=1))(mulNum) output = multiply([mulNum_expanded, a])
这样两个张量维度完全匹配,multiply就能正常工作了。
两种方法里更推荐第一种,代码更简洁,也少了一层额外的操作,效率更高。
内容的提问来源于stack exchange,提问作者user7867665
相关产品推荐
相关产品推荐

