混淆了keras点层。如何计算点积?
我阅读了所有关于点层的文章,但没有一篇解释如何计算输出形状!但它看起来很标准! 如何准确地计算沿特定轴的值混淆了keras点层。如何计算点积?,keras,keras-layer,Keras,Keras Layer,我阅读了所有关于点层的文章,但没有一篇解释如何计算输出形状!但它看起来很标准! 如何准确地计算沿特定轴的值 val = np.random.randint(2, size=(2, 3, 4)) a = K.variable(value=val) val2 = np.random.randint(2, size=(2, 2, 3)) b = K.variable(value=val) print("a") print(val) print("b") print(val2) out = Dot(ax
val = np.random.randint(2, size=(2, 3, 4))
a = K.variable(value=val)
val2 = np.random.randint(2, size=(2, 2, 3))
b = K.variable(value=val)
print("a")
print(val)
print("b")
print(val2)
out = Dot(axes = 2)([a,b])
print(out.shape)
print("DOT")
print(K.eval(out))
我得到:
a
[[[0 1 1 1]
[1 1 0 0]
[0 0 1 1]]
[[1 1 1 0]
[0 0 1 0]
[0 1 0 0]]]
b
[[[1 0 1]
[1 0 1]]
[[1 0 1]
[1 1 0]]]
(2, 3, 3)
DOT
[[[ 3. 1. 2.]
[ 1. 2. 0.]
[ 2. 0. 2.]]
[[ 3. 1. 1.]
[ 1. 1. 0.]
[ 1. 0. 1.]]]
我无法理解我的数学和代数矩阵知识是如何计算的?以下是
点
产品的工作原理。它在内部呼叫
首先,我想你可能打算这么做
val = np.random.randint(2, size=(2, 3, 4))
a = K.variable(value=val)
val2 = np.random.randint(2, size=(2, 2, 3))
b = K.variable(value=val2) # You have val here
但幸运的是,你曾经(或者也可能是你最初的意图。无论如何,只是指出)
b=K.变量(value=val)
如果您有预期的代码,它将抛出一个错误,因为您希望点积所在的维度不匹配。继续
如何计算点积
你有
a.shape = (2,3,4)
b.shape = (2,3,4)
首先,您仅在批处理维度上执行按元素的点操作。所以这个维度保持不变
现在,你可以忽略两个代码的第一个维度:< <代码> > >代码> b>代码,并考虑两个矩阵之间的点积<代码>(3,4)和<代码>(3,4)< /代码>,并在最后一个轴上做点积,从而产生<代码>(3,3)矩阵。现在添加得到的批次维度
(2,3,3)张量 现在让我们以你为例。你有a
[[[0 1 1 1]
[1 1 0 0]
[0 0 1 1]]
[[1 1 1 0]
[0 0 1 0]
[0 1 0 0]]]
b
[[[0 1 1 1]
[1 1 0 0]
[0 0 1 1]]
[[1 1 1 0]
[0 0 1 0]
[0 1 0 0]]]
然后你做以下两个点积
# 1st sample
[0 1 1 1] . [0 1 1 1]
[1 1 0 0] . [1 1 0 0]
[0 0 1 1] . [0 0 1 1]
# 2nd sample
[1 1 1 0] . [1 1 1 0]
[0 0 1 0] . [0 0 1 0]
[0 1 0 0] . [0 1 0 0]
这就给,
# 1st sample
[3 1 2]
[1 2 0]
[2 0 2]
# 2nd sample
[ 3 1 1]
[ 1 1 0]
[ 1 0 1]
最后,通过添加您得到的缺少的批次维度
[[[ 3. 1. 2.]
[ 1. 2. 0.]
[ 2. 0. 2.]]
[[ 3. 1. 1.]
[ 1. 1. 0.]
[ 1. 0. 1.]]]
Keras圆点一直是不同种类产品之间的一个非常奇怪的混淆。每当我需要矩阵乘法时,我就使用
tf.matmul
,这样就不会有奇怪的结果。如果我想要一个元素级的产品,我需要a*b
。在过去,我成功地让Keras dot执行矩阵乘法,但再次理解它的麻烦太多了,我干脆放弃了。因为大多数高级MDEL都使用类似点层的注意力模型,我想知道如果我有多维输入,以及如何在特定轴上进行点积,这是如何工作的……什么是你所知道的“点积”吗?如果它是这里定义的标准:,那么Keras所做的事情就没有任何意义。轴2在两个张量中应该具有相同的大小。像wikipedia这样的点积应该是prod=A*b
,prod=K.sum(prod,axis=desired\u axis)
。是的,我想这就是我们想要的。所以你会用K.Sum(axis=2)(K.mulitply([a,b])之类的东西来表示keras层先乘以,然后再乘以Sum
。谢谢。那么轴的尺寸对于点积应该是一样的吗?怎么说:“考虑两个矩阵(3,4)和(3,4)之间的点积?”在最后一个轴上做点积,结果是a(3,3)”?也许我已经知道如何沿着一个轴做矩阵乘法了?@Chrishum,例如,当你有两个矩阵a(3,4)和B(3,4)在轴=1上做点积时,基本上是,转置第二个矩阵(它给出了(4,3))还有做点积。但另一种思维方式是,你把点积的第1列和B的第1列分开,把点积的第1列和B的第2列分开,依此类推。最后,把点积的第4列和B的第4列分开。