Python Keras:如何访问乘法的特定索引
我正在构建一个函数,它以特定的方式将来自一个模型分支的输入与来自另一个模型分支的输入相乘,但访问张量的特定部分并没有达到我所期望的效果 最简单的例子:假设我们得到两个张量,其中一个包含Python Keras:如何访问乘法的特定索引,python,tensorflow,neural-network,deep-learning,keras,Python,Tensorflow,Neural Network,Deep Learning,Keras,我正在构建一个函数,它以特定的方式将来自一个模型分支的输入与来自另一个模型分支的输入相乘,但访问张量的特定部分并没有达到我所期望的效果 最简单的例子:假设我们得到两个张量,其中一个包含[1,2],另一个包含[10,20,30],通过取第一个张量的第一个值,其中一个输出应该是[1]x[10,20,30] 如果我从这样的变量开始: import keras.backend as K import numpy as np from keras.layers import Multiply x
[1,2]
,另一个包含[10,20,30]
,通过取第一个张量的第一个值,其中一个输出应该是[1]x[10,20,30]
如果我从这样的变量开始:
import keras.backend as K
import numpy as np
from keras.layers import Multiply
x = K.variable(value=np.array([1,2]))
y = K.variable(value=np.array([[10,20,30]]))
这样我就可以很容易地访问x[0]:
print(K.eval(x[0]))
给出:1.0
但似乎相同的索引对乘法不起作用,如下代码:
z = Multiply()([x[0], y])
生成:
索引器错误:元组索引超出范围
因此,问题是:我如何才能访问keras中乘法层中的特定值索引(或者我如何才能进行等效)?只是为了向您展示一个示例,说明如何实现您想要的目标。假设我们有两个输入:
input_1 = Input(shape=(2,))
input_2 = Input(shape=(3,))
现在,让我们定义以下函数:
def custom_multiply(list_):
x, y = list_[0], list_[1]
y = K.reshape(y, (-1, 1, 3)) # (1, 2, 3) -> ((1), (2), (3))
x = K.reshape(x, (-1, 2, 1)) # (1, 2) -> ((1, 2))
partial_result = K.batch_dot(x, y)
return K.reshape(partial_result, (-1, 6))
现在-
output=custom\u multiply([input\u 1,input\u 2])
应该做您期望的事情。拜访一对[(1,2),(3,4,5)]
应该返回(3,4,5,6,8,10)
你能展示完整的模型吗?@MarcinMożejko-我很乐意,但它有数百行代码,包括一些“客户机密”的东西。这就是为什么我做了一个生成错误的最小示例。你认为有什么特别的信息会有帮助吗?我基本上是在尝试完全乘法[a,b]X[c,d,e]=[ac,ad,ae,bc,bd,be],但这是keras模型的一部分,对吧?@MarcinMożejko-是的,我为任何不清晰的地方道歉。我已经添加了导入,这样整个最小示例就可以运行了,而不需要假设任何人知道包缩写:)看起来很棒!我需要回到我的办公桌去测试,如果有效的话,我会把答案记下来!已证实的很好,谢谢!我在搜索中没有找到batch_dot,这也是一个巧妙的重塑语法。太棒了。祝你在进一步的研究中好运。