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

本文共 5056 字,大约阅读时间需要 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/

你可能感兴趣的文章
Node.js RESTful API如何使用?
查看>>
node.js url模块
查看>>
Node.js Web 模块的各种用法和常见场景
查看>>
Node.js 之 log4js 完全讲解
查看>>
Node.js 函数是什么样的?
查看>>
Node.js 函数计算如何突破启动瓶颈,优化启动速度
查看>>
Node.js 切近实战(七) 之Excel在线(文件&文件组)
查看>>
node.js 初体验
查看>>
Node.js 历史
查看>>
Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
查看>>
Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
查看>>
Node.js 异步模式浅析
查看>>
node.js 怎么新建一个站点端口
查看>>
Node.js 文件系统的各种用法和常见场景
查看>>
Node.js 模块系统的原理、使用方式和一些常见的应用场景
查看>>
Node.js 的事件循环(Event Loop)详解
查看>>
node.js 简易聊天室
查看>>
Node.js 线程你理解的可能是错的
查看>>
Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
查看>>
node.js 配置首页打开页面
查看>>