libtorch / torch 常用语法记录

简单整理libtorch的用法
lib torch API
cnpy 读写npy,npz 的库,还算好用

赋值

double array[] = { 1, 2, 3, 4, 5};
auto options = torch::TensorOptions().dtype(torch::kFloat32).device(torch::kCUDA, 1);
torch::Tensor tharray = torch::from_blob(array, {5}, options);

索引

设置 one-hot, by index_put_

feat 最后一维为one-hot

torch::Tensor ids = torch::randint(0, 5, {2, 3} ).to(torch::kLong);
torch::Tensor ids1 = torch::arange(2*3).to(torch::kLong);
torch::Tensor feat = torch::zeros({2, 3, 5});
feat.view({-1, 5}).index_put_( { ids1, ids.view({-1}) }, 1 );

曲折的中间研究

using namespace torch::indexing; // 可以使用None
// feat.index_put_( { Slice(), ids.view({-1}) }, 1 );

accessor

torch::Tensor foo = torch::rand({12, 12}); 
// assert foo is 2-dimensional and holds floats.
auto foo_a = foo.accessor<float,2>();

auto srcdata = score.accessor<float,3>();
// srcdata[i][j][k] 访问 

narrow

ta.index_put_( { Slice(1, 3) }, tb.index( { Slice(1, 3) } ) );
ta.index_put_( { Slice(1, 3) }, tb.narrow(0, 1, 2) );
ta.narrow(0, 1, 2) =  tb.narrow(0, 1, 2) ; // dim, start, len

raw 指针数据

cout<<ids.sizes()<<endl;
int * _a = (int*) ids.data_ptr();
int * _a2 = ids.data_ptr<int>();
cnpy::npy_save("tmp/ck_inp_ids.npy", _a, { ids.size(0), ids.size(1), ids.size(2) },"w");

模型与C++交互

支持可修改变量

  1. 必须 self.register_buffer 这样的变量才能被保存,被修改[内/外]。
  2. 如果没有注册的话,那forward 中不能修改,外部也访问不到。

模型类的方法

主要可以看 这里

torch::jit::script::Module net;
for (const auto& _n : net.named_buffers()) {
    cout<< _n.name <<endl;
    cout<<_n.value.select(0, 1)<<endl;
    auto  a = _n.value.select(0, 1).data_ptr<float>();
    a[0] = 111;
}
void load_(torch::jit::script::Module& net, string fpt){
    net = torch::jit::load(fpt);
}

– torch

插值

希望实现按照 np.interlp 那样的插值,且支持多维

from torch.nn.functional import interpolate

a=torch.zeros( ( 3, 4 ) )
seq=torch.arange(1000)
a[0] = seq[::2][:4]
a[1] = seq[100::2][:4]
a[2] = seq[10::4][:4]

print(a)
a=a.view(1, 3, 4)
print(a.size())
b=interpolate( a, size=(7), mode="linear", align_corners=True )
# 这里size 是看了代码才知道,原来只用管最后一维就行了
print(b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值