我阅读了有关点层的所有文章,但都没有解释如何做,因此将计算输出形状!似乎很标准! 沿特定轴的值如何精确计算?
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.]]]
我无法用数学和代数矩阵的专业知识来理解这是怎么算出来的?
答案 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)
首先,您仅在批次尺寸上执行逐元素点。因此该维度保持不变。
现在,您可以忽略a
和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.]]]