混淆了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列分开。