batch_dot的理解

batch_dot的理解

时间:2022-10-09 作者:zhankehua 评论:0 点击:1127 次

最近对人工智能很感兴趣,业余时间研究图深度学习,在学习过程中遇到这这样一个函数:keras.backend.batch_dot(x, y, axes=None)

对这个函数中的axes参数一直不理解,看官方的解析:

批量化的点积
当 x 和 y 是批量数据时, batch_dot 用于计算 x 和 y 的点积, 即尺寸为 (batch_size, :)。
batch_dot 产生一个比输入尺寸更小的张量或变量。 如果维数减少到 1,我们使用 expand_dims 来确保 ndim 至少为 2。
参数
x: ndim >= 2 的 Keras 张量或变量。
y: ndim >= 2 的 Keras 张量或变量。
axes: 表示目标维度的整数或列表。 axes[0] 和 axes[1] 的长度必须相同。
返回
一个尺寸等于 x 的尺寸(减去总和的维度)和 y 的尺寸(减去批次维度和总和的维度)的连接的张量。 如果最后的秩为 1,我们将它重新转换为 (batch_size, 1)。
例子
假设 x = [[1, 2], [3, 4]] 和 y = [[5, 6], [7, 8]], batch_dot(x, y, axes=1) = [[17], [53]] 是 x.dot(y.T) 的主对角线, 尽管我们不需要计算非对角元素。
伪代码:
inner_products = []
for xi, yi in zip(x, y):
    inner_products.append(xi.dot(yi))
result = stack(inner_products)
尺寸推断: 让 x 的尺寸为 (100, 20),以及 y 的尺寸为 (100, 30, 20)。 如果 axes 是 (1, 2),要找出结果张量的尺寸, 循环 x 和 y 的尺寸的每一个维度。
x.shape[0] : 100 : 附加到输出形状,
x.shape[1] : 20 : 不附加到输出形状, x 的第一个维度已经被加和了 (dot_axes[0] = 1)。
y.shape[0] : 100 : 不附加到输出形状,总是忽略 y 的第一维
y.shape[1] : 30 : 附加到输出形状,
y.shape[2] : 20 : 不附加到输出形状, y 的第二个维度已经被加和了 (dot_axes[0] = 2)。 output_shape = (100, 30)

以上解释看的我一头雾水,没办法,自己写程序测试,研究吧。测试程序如下:

import numpy as np
from tensorflow.keras import backend as K

arr12=np.array(
        [[[[0,1],[3,4],[6,7]]],
        [[[0,5],[3,4],[6,7]]],
        [[[0,1],[3,4],[6,7]]]]) #(3,1,3,2)

arr13=np.array([[0,1,2],[3,4,5],[6,7,8]]) #(3,3)
c = K.batch_dot(arr12, arr13, axes = [2,1])

print(c.shape, c)

其输出结果如下:

image.png

那axes的作用到底是什么呢?通俗的讲是指定参与运算的轴。以上程序运行过程用以下图形展示:

batch_dot.png

其中a就是程序中的arr12张量,b就是arr13张量。axes=[2,1],表示a中的第三个维度(即shape数值3)与b中的第二个维度(即shape数值3)进行点击运算(注,维度索引从0开始)。具体运算过程看上图。

经过反复测试和验证,目前基本理解axes的参数是批张量中哪些维度参与运算,以上是个人理解,有不正之处,请大佬指正!

学习犹如逆水行舟,不进则退!加油!!!


已有 1127 位网友参与,快来吐槽:

发表评论

必填

选填

选填

◎欢迎参与讨论,发表您的看法、交流您的观点。