如何在不编写自己的 cuda 代码的情况下在 Rust 中实现 Arrayfire 中的 Max Pooling

How can I implement Max Pooling in Arrayfire in rust without resorting to writing my own cuda code

我正在尝试弄清楚如何在 Arrayfire 上实现最大池化。我目前最好的方法是迭代每个卷积输出并应用一个函数,该函数应用四个内核,[1 0 0 0]、[0 1 0 0]、[0 0 1 0]、[0 0 0 1],并产生四个输出,然后我可以比较每个像素的最大值。

我的问题是,在张量库中这样循环似乎非常慢且不正确,但我一直无法想出更好的解决方案

我已经确定了以下内容: 用 seq 索引象限,然后获取最大值

#[test]
    fn maxfilt____() {
        let fourxfour = Array::new(&(0..16).into_iter().collect::<Vec<_>>(), dim4!(4, 4, 1, 1));

        let dim0 = fourxfour.dims()[0] as i32;
        let dim1 = fourxfour.dims()[1] as i32;

        let q1_indices = &[seq!(0, dim0 - 1, 2), seq!(0, dim1 - 1, 2), seq!(), seq!()];
        let q2_indices = &[seq!(0, dim0 - 1, 2), seq!(1, dim1 - 1, 2), seq!(), seq!()];
        let q3_indices = &[seq!(1, dim0 - 1, 2), seq!(0, dim1 - 1, 2), seq!(), seq!()];
        let q4_indices = &[seq!(1, dim0 - 1, 2), seq!(1, dim1 - 1, 2), seq!(), seq!()];

        let q1s = index(&fourxfour, q1_indices);
        let q2s = index(&fourxfour, q2_indices);
        let q3s = index(&fourxfour, q3_indices);
        let q4s = index(&fourxfour, q4_indices);
   
        let max = maxof(&q1s, &maxof(&q2s, &maxof(&q3s, &q4s, false), false), false);

        af_print!("max", max);
    }

您可以使用 wrap 和 unwrap 来执行此操作,也许效率更高。

逻辑如下:

  1. 将大小为 2x2 的 window 展开成列
  2. 沿列执行最大值
  3. 返回原始图像形状

我认为这可能是更快的索引偏移位置,这可能导致内存读取不理想。

这里是上述功能相关文档的链接

展开 - https://arrayfire.org/arrayfire-rust/arrayfire/fn.unwrap.html 换行 - https://arrayfire.org/arrayfire-rust/arrayfire/fn.wrap.html

虽然我确实在 rust 文档中写了一个示例,但我认为 C++ 文档中的图像插图在理解正在发生的事情方面要好得多。以下是这些链接

展开 - https://arrayfire.org/docs/group__image__func__unwrap.htm 换行 - https://arrayfire.org/docs/group__image__func__wrap.htm

希望这对您有所帮助