【问题标题】:Efficiently Create compressed banded diagonal matrix in mxnet在 mxnet 中有效地创建压缩带状对角矩阵
【发布时间】:2018-02-21 15:28:00
【问题描述】:

在我的问题中,我有一个包含 n 元素的向量。给定一个窗口大小k 我想有效地创建一个矩阵大小n x 2k+1 包含带状对角线。例如:

a = [a_1, a_2, a_3, a_4]
k = 1
b = [[0, a_1, a_2],
    [a_1, a_2, a_3],
    [a_2, a_3, a_4],
    [a_3, a_4, a_5],
    [a_4, a_5, 0]]

实现这一点的简单方法是使用 for 循环

out_data = mx.ndarray.zeros((n, 2k+1))
for i in range(0, n):
    for j in range(0, 2k+1):
        index = i - k + j
        if not (index < 0 or index >= seq_len):
            out_data[i][j] = in_data[index]

这很慢。

只需使用tilereshape 就可以轻松创建完整的矩阵,但是掩蔽部分不清楚。

更新 我发现了一个更快但仍然很慢的实现:

window = 2*self.windowSize + 1
in_data_reshaped = in_data.reshape((batch_size, seq_len))
out_data = mx.ndarray.zeros((seq_len * window))
for i in range(0, seq_len):
    copy_from_start = max(i - self.windowSize, 0)
    copy_from_end = min(seq_len -1, i+1+self.windowSize)
    copy_length = copy_from_end - copy_from_start
    copy_to_start = i*window + (2*self.windowSize + 1 - copy_length)
    copy_to_end = copy_to_start + copy_length
    out_data[copy_to_start:copy_to_end] = in_data_reshaped[copy_from_start:copy_from_end]
out_data = out_data.reshape((seq_len, window))

【问题讨论】:

    标签: python mxnet


    【解决方案1】:

    如果在您的操作中,kn 是不变的,您可以使用 mxnet.nd.gather_nd()mx.nd.scatter_nd 的组合来做您想做的事情。即使生成索引张量同样低效,因为您只需要执行一次,这不会成为问题。您可能希望使用gather_nd 有效地“复制”原始数组中的数据,然后使用scatter_nd 将它们分散到最终的矩阵形状。或者,您可以简单地将 0 元素连接到输入数组(例如,[a_1, a_2, a_3] 会变成 [0, a_1, a_2, a_3]),然后仅使用 mxnet.nd.gather_nd() 将元素复制到最终矩阵中。

    【讨论】:

    • 感谢这个提示很有帮助。我做了一个示例实现看到这个gist。有两个警告。 (1) mxnet 中的填充仅适用于 4 维或 5 维数组see this feature request (2)gather_nd 尚未与批次“兼容”,这意味着必须明确计算索引see this feature request
    • 对于第一个警告,您可以调用NDArray.reshape(),为您的数组添加额外的维度,并在完成填充后重新整形: attention_padded = mx.nd.pad(attention.reshape( (1, 2, 4, 1)), mode='constant', constant_value=0, pad_width=(0, 0, 0, 0, k, k, 0, 0)).reshape((2, 4, 1 ))
    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多