
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)
其输出结果如下:
那axes的作用到底是什么呢?通俗的讲是指定参与运算的轴。以上程序运行过程用以下图形展示:
其中a就是程序中的arr12张量,b就是arr13张量。axes=[2,1],表示a中的第三个维度(即shape数值3)与b中的第二个维度(即shape数值3)进行点击运算(注,维度索引从0开始)。具体运算过程看上图。
经过反复测试和验证,目前基本理解axes的参数是批张量中哪些维度参与运算,以上是个人理解,有不正之处,请大佬指正!
学习犹如逆水行舟,不进则退!加油!!!
本文标签:
转载请注明出处: http://www.itsec365.cn/?id=72
已有 1127 位网友参与,快来吐槽:
发表评论