第一章 libtorch初步认识,Tensor的各种操作
介绍如何加减乘除,矩阵,转置,矩阵相乘等,主要是认识Tensor变量在C++中的作用以及使用方法,如果忘记了,还可以翻下自己的博客看看怎么用,后面有看到比较有趣的操作会发到文章上。
文章目录
前言
说个屁的前言,本章就是用程序搞下最基础的Tensor变量操作练习,其实python上的tensor变量我已经搞的很熟了,主要是C++没搞过。
一、Tensor是什么?
Tensor变量这个东西,只是一个被定义的,拥有多个数学方法以及数学属性的类而已,只是集成了一堆数学和加速运算的东西,才成为了一个特殊的变量而已,就好像,字符串只是因为能随便写字符才被命名为字符变量。
但是,一个好的数学思维就是密码的加速运算,只要算的快,理解这个变量的本质,才能在深度学习和机器学习中,如臂驱使一样操纵这些变量,不然,你脑阔想加一下变量,结果,来Tensor变量怎么加都不知道,下面,我用一个个问题开启好奇心,生动的去介绍介绍这些操作,调动一下脑子。
——首先,到了这里的家伙都应该装好libtorch这个库了
先把这些写上防止出现什么编码问题
#include <iostream>
#include <locale>
#include <torch/torch.h>
using namespace std;
int main() {
locale::global(locale("zh_CN.UTF-8"));
}
二、Tensor在各种深度学习的操作
如果抱着学习的心态,你肯定会想这有什么用,首先,tensor变量除了能加减乘除以外,还能被追踪从计算开始到最后结果的过程,比如,1+1=2,但是tensor的1+1=2的2这个tensor变量,能被追踪到2怎么来的,也就反向传播2=1+1这个过程,不然2还可以2=0.5+1.5呢
在神经网络正向传播的过程中,运用到加是非常的多的,比如残差网络(resnet)的跳层连接,在神经网络结构图就是 加 号。
1.如何让Tensor变量相加?
直接摆代码
void tensorAdd() {
std::cout<<"数学运算:"<<std::endl;
torch::Tensor tensor1 = torch::tensor({{1,2},{3,4}});
torch::Tensor tensor2 = torch::tensor({{5,6},{7,8}});
std::cout << "tensorADD1:\n" << tensor1+tensor2 << std::endl;
std::cout << "tensorADD2:\n" << tensor1+10 << std::endl;
}
直接写个加号就能加起来,能直接加tensor变量以及任意的基本数字类型
数学运算:
tensorADD1: tensorADD2:
6 8 11 12
10 12 13 14
[ CPULongType{2,2} ] [ CPULongType{2,2} ]
运用案例为
—— 残差网络的跳层连接
—— 平滑一些数值,防止一些数据小于零或等于零
2.如何创建随机Tensor变量
void tensorRand() {
std::cout<<"随机张量:"<<endl;
torch::Tensor tensor = torch::rand({2, 3});
std::cout << "tensor:\n" << tensor << std::endl;
}
3.如何让矩阵的Tensor变量转置
void tensorT() {
std::cout<<"矩阵转置:"<<std::endl;
torch::Tensor tensor = torch::tensor({{1,2},{3,4},{5,6}});
std::cout << "tensor:\n" << tensor << std::endl;
std::cout << "tensorT:\n" << tensor.t() << std::endl;
}
4. 如何让矩阵Tensor变量相乘
void tensorMatmul() {
std::cout<<"矩阵乘法:"<<std::endl;
torch::Tensor tensor = torch::tensor({{1,2},{3,4},{5,6}});
torch::Tensor tensor2 = torch::tensor({{5,6,7},{7,8,9}});
torch::Tensor multiplied = torch::matmul(tensor, tensor2);
std::cout << "tensor:\n" << multiplied << std::endl;
}
5.矩阵Tensor变量形状改变
void tensorReshaped(){
std::cout<<"张量形状改变:"<<std::endl;
torch::Tensor tensor = torch::rand({2, 3});
std::cout << "原来的tensor:\n" << tensor << std::endl;
torch::Tensor reshaped = tensor.view({3, 2});
std::cout << "改变形状的tensor:\n" << reshaped << std::endl;
}
6.待定
总结
了解Tensor变量的操作对于构建神经网络以及输入模型数据和输出模型数据的处理具有非常重大的作用,后续每次探究出来的内容都会重新更新文章,希望能起到一些帮助。
如果说有同样一起探究的朋友,可以共同一起学习,提出一些新的观点或者对Tensor变量理解更深的内容,这样可以将这个文章变得更完善。