博客
关于我
LibTorch之张量操作与线性回归
阅读量:802 次
发布时间:2023-01-31

本文共 4909 字,大约阅读时间需要 16 分钟。

LibTorch 张量操作与线性回归

在LibTorch中,张量操作与PyTorch相比,主要体现在基础操作的写法上。值得注意的首要事务是理解LibTorch与PyTorch之间的语法差异,尤其是变量命名方式的变化。

一 张量初始化

1. torch::zeros

#include 
using namespace std;int main() { torch::Tensor b = torch::zeros({2, 3}); cout << b << endl; system("pause"); return 0;}

위키百科

2. torch::ones

#include 
using namespace std;int main() { torch::Tensor b = torch::ones({2, 3}); cout << b << endl; system("pause"); return 0;}

위키百科

3. torch::eye

#include 
using namespace std;int main() { torch::Tensor b = torch::eye(3); cout << b << endl; system("pause"); return 0;}

위키百科

4. torch::full

#include 
using namespace std;int main() { torch::Tensor b = torch::full({2, 3}, 999); cout << b << endl; system("pause"); return 0;}

위키百科

5. torch::tensor

#include 
using namespace std;int main() { torch::Tensor b = torch::tensor({ {1,2,3}, {4,5,6} }); cout << b << endl; system("pause"); return 0;}

위키百科

6. torch::rand

#include 
using namespace std;int main() { torch::Tensor b = torch::rand({2, 3}); cout << b << endl; system("pause"); return 0;}

위키百科

7. torch::randn

#include 
using namespace std;int main() { torch::Tensor b = torch::randn({2, 3}); cout << b << endl; system("pause"); return 0;}

위키百科

8. torch::randint

#include 
using namespace std;int main() { torch::Tensor b = torch::randint(1, 10, {2, 3}); cout << b << endl; system("pause"); return 0;}

二 深浅拷贝

1. 浅拷贝

#include 
using namespace std;int main() { torch::Tensor b1 = torch::zeros({2, 3}); torch::Tensor b2 = b1; // 浅拷贝 auto b3 = torch::Tensor(b1);}

2. 深拷贝

#include 
using namespace std;int main() { torch::Tensor b1 = torch::zeros({2, 3}); torch::Tensor b2 = b1.clone(); // 测试深拷贝后的独立性 b2[0][0] = 888; cout << "b2: " << b2 << endl; cout << "b1: " << b1 << endl;}

3. 张量大小一致的深拷贝

#include 
using namespace std;int main() { torch::Tensor b1 = torch::zeros({2, 3}); torch::Tensor b2 = torch::zeros_like(b1); // 测试形状一致性 cout << "b2(ones-like): " << b2 << endl; b2 = torch::ones_like(b1); cout << "b2(ones-like):" << b2 << endl; b2 = torch::rand_like(b1, torch::kFloat); cout << "b2(random-like):" << b2 << endl;}

三 C++ 常用数据类型转换为Tensor变量

1. 使用from_blob方法从数组转换Tensor

#include 
using namespace std;int main() { int a[] = {1, 2, 3, 4, 5, 6}; torch::Tensor b = torch::from_blob(a, {6}, torch::kInt); cout << b << endl;}

2. 使用from_blob方法从浮点数数组转换Tensor

#include 
using namespace std;int main() { float data[] = {1, 2, 3, 4, 5, 6}; torch::Tensor f = torch::from_blob(data, {2, 3});}

3. 从std::vector

转换Tensor

#include 
using namespace std;int main() { vector
a = {1, 2, 3, 4, 5, 6}; // 方法一:直接使用 tensorSYSTEMrepr torch::Tensor b = torch::tensor(a); // 方法二:使用from_blob torch::Tensor b = torch::from_blob(a.data(), {2}, torch::kFloat);}

四 张量维度变换

1. 拼接操作:torch::cat

#include 
using namespace std;int main() { auto a = torch::ones({2, 3}); auto a1 = torch::cat({a, a}, 0); auto a2 = torch::cat({a, a}, 1); cout << "a1: " << a1 << endl; cout << "a2: " << a2 << endl;}

2. 堆叠操作:torch::stack

#include 
using namespace std;int main() { auto a = torch::ones({2, 3}); auto a1 = torch::stack({a, a}, 2); cout << a1.shape() << endl;}

3. 切分操作:torch::chunk

#include 
using namespace std;int main() { auto a = torch::ones({2, 5}); auto chunks = torch::chunk(a, 2, 1); for (int idx, t : chunks) { cout << "idx: " << idx << " tensor: " << t << endl; }}

4. unsqueeze操作(无维度展开):torch::unsqueeze

#include 
using namespace std;int main() { auto a = torch::rand({2, 3}); // 查看原始形状 cout << a << endl; // 增加一个维度(默认在第一个维度) auto b = a.unsqueeze(1); cout << b << endl; // 测试形状变化 cout << b.shape() << endl;}

五 截取张量

1. 截取张量的特定部分

#include 
using namespace std;int main() { auto a = torch::rand({2, 3, 5, 4}); // 截取最后两个元素 auto b = a.slice(2, -2, -1); cout << b << endl;}

六 张量的四则运算

1. 加法运算

#include 
using namespace std;int main() { auto a = torch::rand({2, 3}); auto b = torch::rand({3, 2}); auto c = a + b; cout << c << endl;}

2. 乘法运算

#include 
using namespace std;int main() { auto a = torch::rand({2, 3}); auto b = torch::rand({3, 2}); auto c = torch::matmul(a, b); cout << c << endl;}

3. 绝对值

#include 
using namespace std;int main() { auto a = torch::rand({2, 3}); auto b = torch::abs(a); cout << b << endl;}

七 获取张量的大小

#include 
using namespace std;int main() { auto a = torch::rand({2, 3, 6, 6}); cout << a << endl; cout << "Tensor size: " << a.sizes() << endl;}

八 其他操作(需cmd+T>Code查看完整代码)

以上内容涵盖了LibTorch中常用操作的实现,对于线性回归部分,可参考标准教程或进一步优化模型结构。但请注意,在实际应用中,需根据需求选择适合的框架和模型结构。

转载地址:http://nwwfk.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>