gpt4 book ai didi

c++ - 当从 0 阶张量到 1 阶张量时, Eigen 张量 reshape 然后以乱码数字广播结果

转载 作者:行者123 更新时间:2023-12-05 04:21:45 24 4
gpt4 key购买 nike

我有以下代码寻找 1 阶张量的最大元素,它缩小到 0 阶张量,然后将它广播回 1 阶张量的全长,这样我就可以在涉及原始秩 1 张量的进一步计算。

//reduces a rank 1 tensor to a rank 0 tensor.
Tensor<double,0> columnmaximum = input_tensor.maximum(this->imposed_dim).eval();

std::cout << "colmax is\n" << columnmaximum << std::endl;

this->columnbroadcast = Eigen::array<int,1> ({M});
this->rank1base = Eigen::array<int,1> ({1});

//expands it back out to a full column. columnshape is just
Tensor<double,1> columnmaximum_rk2 = columnmaximum.reshape(this->rank1base).broadcast(this->columnbroadcast);
std::cout << "colmaxrk2 is\n" << columnmaximum_rk2 << std::endl;

并注意到以下奇怪的输出:

colmax is
-2
colmaxrk2 is
-2
0.238402
3.91433e-310
-3.33086
-2

广播时出了点问题。我的想法是将 0 阶张量提升到 1 阶张量(长度为 1),然后在一维中广播以复制最大值,直到我需要能够从其他东西中减去它为止。

打印放大的张量时,中间的这三个数字出了什么问题?我知道在这种特殊情况下,我可以使用 setConstant 方法,但我想对高维张量使用 reshape 然后 broadcast 技巧其中汇总统计量不太重要,即 2 阶张量等。

任何人都可以向我解释这些无意义的数字是从哪里来的吗?我犯了一个基本错误吗?在我看来,这个小得惊人的数字有点像未分配的内存。

非常感谢!

最佳答案

这似乎是 Eigen 3.4.0 中与零维张量相关的错误。可重现的例子(godbolt):

#include <iostream>
#include <Eigen/../unsupported/Eigen/CXX11/Tensor>

int main()
{
Eigen::Tensor<double, 3> MaxTest(4, 4, 4);
MaxTest.setRandom();
Eigen::Tensor<double, 0> columnmaximum = MaxTest.maximum();

std::cout << "colmax is\n" << columnmaximum << std::endl;

Eigen::array<Eigen::Index, 1> columnbroadcast({6});
Eigen::array<Eigen::Index, 1> rank1base({1});

Eigen::Tensor<double, 1> columnmaximum_rk2 = columnmaximum.reshape(rank1base).broadcast(columnbroadcast);
std::cout << "colmaxrk2 is\n" << columnmaximum_rk2 << std::endl;
}

如果启用了标准库中的调试检查(-D_GLIBCXX_DEBUG 用于 gcc 的 stdlibc++),则评估赋值(operator=())到 columnmaximum_rk2 失败。没有调试,它会打印一些随机值,如原始帖子中所示。

reshape()broadcast() 之间放置一个 eval() 可以防止这个问题 ( godbolt ):

Tensor<double, 1> columnmaximum_rk2 = 
columnmaximum.reshape(rank1base).eval().broadcast(columnbroadcast);

有趣的是,Eigen 主干不再受此问题的影响 (godbolt)。显然,它从 Eigen 3.4.0 开始得到修复。确实有 one commit至少处理了张量广播(但我不确定这个提交是否专门解决了这个问题)。因此,另一种解决方法是使用当前的主干版本。

关于c++ - 当从 0 阶张量到 1 阶张量时, Eigen 张量 reshape 然后以乱码数字广播结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74156096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com