欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

libtorch学习笔记(3)- 一些基本概念

程序员文章站 2023-04-03 20:28:40
几个基本概念标量 (scaler)看名称scaler就知道它是一个数字,在libtorch中可以把标量视为零阶张量,可以如此声明// 标量auto scaler = torch::tensor(1.0f);std::cout << "scaler sizes() length: " << scaler.sizes().size() << "\n" << scaler << std::endl;输出结果:向量 (vector)向量...

几个基本概念

1. 标量 (scaler)

看名称scaler就知道它是一个数字,在libtorch中可以把标量视为零阶张量,可以如此声明

// 标量
auto scaler = torch::tensor(1.0f);
std::cout << "scaler sizes() length: " << scaler.sizes().size() << "\n" << scaler << std::endl;

输出结果:
libtorch学习笔记(3)- 一些基本概念

2. 向量 (vector)

向量就是一列数,
x=x1x2xn \begin{aligned} \vec x= \begin{array} {|c|} x_{1} \\ x_{2}\\ \vdots&\\ x_{n} \end{array} \end{aligned}
在libtorch中可以把向量看作一阶张量,可以如此声明:

// 向量
auto v = torch::tensor({ 1, 2, 3, 4 });
std::cout << "v sizes() length: " << v.sizes().size() << "\n" << v << std::endl;

输出结果:
libtorch学习笔记(3)- 一些基本概念
不能把向量理解成1xN或者Nx1的矩阵,可以用Tensor.t()来验证,不论怎么转换,都是一样的。

3. 矩阵 (matrix)

矩阵是二维数组,
Rmn=a11a12a1na21a22a2nam1am2amn \begin{aligned} \mathbb{R}^{m*n}=\begin{array} {|cccc|} a_{11}&a_{12}&\cdots&a_{1n}\\ a_{21}&a_{22}&\cdots&a_{2n}\\ \vdots&\cdots&\ddots&\vdots&\\ a_{m1}&a_{m2}&\cdots&a_{mn}\\ \end{array} \end{aligned}
可以看作二阶张量,可以如此声明:

// 矩阵
auto m = torch::randn({ 2, 8 });
std::cout << "m sizes() length: " << m.sizes().size() << "\n" << m << std::endl;

输出结果如下:
libtorch学习笔记(3)- 一些基本概念
要做数学上的矩阵运算,需使用matmul,普通的*乘法符号可能会得到不同的结果,请看:
A=x1x2xnATA=x1x1x1x2x1xnx2x1x2x2x2xnxnx1xnx2xnxnAAT=x12+x22+...+xn2 \begin{aligned} A= \begin{array} {|cccc|} x_{1} &x_{2}&\cdots&x_{n} \end{array} \end{aligned}\\ \begin{aligned}A^T*A=\begin{array}{|cccc|} x_{1}*x_{1}&x_{1}*x_{2}&\cdots&x_{1}*x_{n}\\ x_{2}*x_{1}&x_{2}*x_{2}&\cdots&x_{2}*x_{n}\\ \vdots&\cdots&\ddots&\vdots&\\ x_{n}*x_{1}&x_{n}*x_{2}&\cdots&x_{n}*x_{n}\\ \end{array}\end{aligned}\\A*A^T = x_{1}^2+x_{2}^2+ ... + x_{n}^2

torch::Tensor A = torch::randint(0, 16, { 1, 4 });
std::cout << "A (rows: " << A.sizes()[0] << ", cols: " << A.sizes()[1] <<  ")\n" << A << std::endl;
std::cout << "AT:\n" << A.t() << std::endl;
std::cout << "A.matmul(AT): \n" << A.matmul(A.t()) << std::endl;
std::cout << "A*AT: \n" << A*A.t() << std::endl;

输出结果:
libtorch学习笔记(3)- 一些基本概念

4. 张量 (tensor)

可以是n阶的,n从0到无穷大,一个典型的多阶张量就是表示图像的数据,图像可以分解成R,G,B三个通道,或者Y,U,V三个通道,然后每个通道都是一个二阶矩阵,里面存放各个颜色通道的值。
这是一个三阶张量的申明:

// 张量
auto t = torch::randn({ 3, 5, 5 });
std::cout << "t sizes() length: " << t.sizes().size() << "\n" << t << std::endl;

输出结果:
libtorch学习笔记(3)- 一些基本概念

本文地址:https://blog.csdn.net/defi_wang/article/details/107453819