对keras点层感到困惑。点积如何计算?

时间:2019-12-27 15:21:33

标签: 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(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.]]]

我无法用数学和代数矩阵的专业知识来理解这是怎么算出来的?

1 个答案:

答案 0 :(得分:0)

Dot产品的工作原理如下。内部调用K.batch_dot

首先,我认为您可能打算这样做,

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.variable(value=val)

如果您具有所需的代码,则将引发错误,因为您希望点积所在的尺寸不匹配。继续

点积的计算方式

您有

a.shape = (2,3,4)
b.shape = (2,3,4)

首先,您仅在批次尺寸上执行逐元素点。因此该维度保持不变。

现在,您可以忽略ab的第一个维,并考虑两个矩阵(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.]]]