IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> C++ Eigen3库Tensor操作整理(持续更新) -> 正文阅读

[人工智能]C++ Eigen3库Tensor操作整理(持续更新)

项目引入

VS2019环境下

  1. 点击<项目>
  2. 管理NuGet程序包
  3. 搜索Eigen3,安装即可
    Eigen3
    在项目源代码添加头文件
#include <unsupported/Eigen/CXX11/Tensor>

类型转换

C++ 数组转Eigen::Tensor(包含reshape操作)

例如从float数组转到储存类型为float的Tensor

  1. float数组转Eigen::TensorMap
  2. Eigen::TensorMap类型转换回Eigen::Tensor
#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>

int main()
{
	// 定义一个一维数组,在下面将其转换为2x2的tensor
    float arr[] = { 0.1, 0.2, 0.3, 0.4 };
    // 定义转换的Eigen::TensorMap,同时做了一个reshape操作
    auto mapped_t = Eigen::TensorMap<Eigen::Tensor<float, 2>>(arr, 2, 2);
    std::cout << typeid(mapped_t).name() << std::endl;
    // 强制转换为Tensor
    auto result = Eigen::Tensor<float, 2>(mapped_t);
    std::cout << typeid(result).name() << std::endl;
    std::cout << result << std::endl;
}

输出

class Eigen::TensorMap<class Eigen::Tensor<float,2,0,__int64>,0,struct Eigen::MakePointer>
class Eigen::Tensor<float,2,0,__int64>
0.1 0.3
0.2 0.4

上面的操作与python numpy的narray.reshape()是一致的。下面代码是对narray.reshape()的实现。已验证与上面结果一致。

Eigen::Tensor<float, 3> reshape(float* oneDimArray, int channel,int height, int width)
{
    const int frameSize = height * width;
    const auto length = channel * height * width;
    int index = 0;
    Eigen::Tensor<float, 3> result(channel, height, width);
    for (int c = 0; c < channel; c++)
    {
        for (int w = 0; w < width; w++)
        {
            for (int h = 0; h < height; h++)
            {
                index = c * frameSize + w * height + h;
                float value = oneDimArray[index];
                result(c, h, w) = value;
            }
        }
    }
    return result;
}

Tensor操作

concatenate

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

int main()
{
	// 创建一个2维,2x2的tensor
    Eigen::Tensor<float, 2, 1> a(2, 2);
    Eigen::Tensor<float, 2, 1> b(2, 2);
    // 给tensor设置默认值
    a.setConstant(1.0);
    b.setConstant(2.0);
    // 从维度0进行拼接
    auto res = a.concatenate(b, 0);
    std::cout << res << std::endl;
}

输出结果:

1 1
1 1
2 2
2 2

transpose

#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>
using namespace std;
int main()
{
    Eigen::Tensor<int, 3> m(2, 3, 3);
    m.setValues(
        {
            {{1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}},
            {{10, 11, 12},
            {13, 14, 15},
            {16, 17, 18}}
        });

    Eigen::array<int, 3> shuffling({ 2, 1, 0});

    Eigen::Tensor<int, 3> transposed = m.shuffle(shuffling);

    cout << transposed(0, 0, 0) << ',' << transposed(0, 0, 1) << endl;
    cout << transposed(0, 1, 0) << ',' << transposed(0, 1, 1) << endl;
    cout << transposed(0, 2, 0) << ',' << transposed(0, 2, 1) << endl;
    cout << transposed(1, 0, 0) << ',' << transposed(1, 0, 1) << endl;
    cout << transposed(1, 1, 0) << ',' << transposed(1, 1, 1) << endl;
    cout << transposed(1, 2, 0) << ',' << transposed(1, 2, 1) << endl;
    cout << transposed(2, 0, 0) << ',' << transposed(2, 0, 1) << endl;
    cout << transposed(2, 1, 0) << ',' << transposed(2, 1, 1) << endl;
    cout << transposed(2, 2, 0) << ',' << transposed(2, 2, 1) << endl;
}

输出

1,10
4,13
7,16
2,11
5,14
8,17
3,12
6,15
9,18

该操作与python的numpy库的ndarray.transpose一致

import numpy as np

mat = [
            [[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]],
            [[10, 11, 12],
            [13, 14, 15],
            [16, 17, 18]]
        ]
mat = np.array(mat)
mat = mat.transpose(2, 1, 0)
print(mat[0][0][0], mat[0][0][1])
print(mat[0][1][0], mat[0][1][1])
print(mat[0][2][0], mat[0][2][1])
print(mat[1][0][0], mat[1][0][1])
print(mat[1][1][0], mat[1][1][1])
print(mat[1][2][0], mat[1][2][1])
print(mat[2][0][0], mat[2][0][1])
print(mat[2][1][0], mat[2][1][1])
print(mat[2][2][0], mat[2][2][1])

输出

1 10
4 13
7 16
2 11
5 14
8 17
3 12
6 15
9 18

reshape

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:49:57  更:2021-11-16 18:52:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 6:21:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码