libtorch 哪些函數比較經常使用?

//輸入32x32 3通道圖片
        auto input = torch::rand({ 1,3,32,32 });

        //輸出
        auto output_bilinear = torch::upsample_bilinear2d(input, { 8,8 }, false);
        auto output_nearest = torch::upsample_nearest2d(input, { 5,5 });
        auto output_avg = torch::adaptive_avg_pool2d(input, { 3,9 });
        
        std::cout << output_bilinear << std::endl;
        std::cout << output_nearest << std::endl;
        std::cout << output_avg << std::endl;

libtorch 加載 pytorch 模塊進行預測示例ios

void mat2tensor(const char * path, torch::Tensor &output)
{
    //讀取圖片
    cv::Mat img = cv::imread(path);
    if (img.empty()) {
        printf("load image failed!");
        system("pause");
    }

    //調整大小
    cv::resize(img, img, { 224,224 });
    cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
    //浮點
    img.convertTo(img, CV_32F, 1.0 / 255.0);

    torch::TensorOptions option(torch::kFloat32);
    auto img_tensor = torch::from_blob(img.data, { 1,img.rows,img.cols,img.channels() }, option);// opencv H x W x C  torch C x H x W
    img_tensor = img_tensor.permute({ 0,3,1,2 });// 調整 opencv 矩陣的維度使其和 torch 維度一致

    //均值歸一化
    img_tensor[0][0] = img_tensor[0][0].sub_(0.485).div_(0.229);
    img_tensor[0][1] = img_tensor[0][1].sub_(0.456).div_(0.224);
    img_tensor[0][2] = img_tensor[0][2].sub_(0.406).div_(0.225);

    output = img_tensor.clone();
}

int main() 
{
    torch::Tensor dog;
    mat2tensor("dog.png", dog);

    // Load model.
    std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("model.pt");
    
    assert(module != nullptr);
    std::cout << "ok\r\n" << std::endl;

    // Create a vector of inputs.
    std::vector<torch::jit::IValue> inputs;
    torch::Tensor tensor = torch::rand({ 1, 3, 224, 224 });
    inputs.push_back(dog);

    // Execute the model and turn its output into a tensor.
    at::Tensor output = module->forward(inputs).toTensor();

    //加載標籤文件
    std::string label_file = "synset_words.txt";
    std::fstream fs(label_file, std::ios::in);
    if (!fs.is_open()) {
        printf("label open failed!\r\n");
        system("pause");
    }
    std::string line;
    std::vector<std::string> labels;
    while (std::getline(fs,line))
    {
        labels.push_back(line);
    }

    //排序 {1,1000} 矩陣取前10個元素(預測值),返回一個矩陣和一個矩陣的下標索引
    std::tuple<torch::Tensor,torch::Tensor> result = output.topk(10, -1);
    auto top_scores = std::get<0>(result).view(-1);//{1,10} 變成 {10}
    auto top_idxs = std::get<1>(result).view(-1);
    std::cout << top_scores << "\r\n" << top_idxs << std::endl;

    //打印結果
    for (int i = 0; i < 10; ++i) {
        std::cout << "score: " << top_scores[i].item().toFloat() << "\t" << "label: " << labels[top_idxs[i].item().toInt()] << std::endl;
    }
    
    system("pause");
    return 0;
]

torch::sortrest

torch::Tensor x = torch::rand({ 3,3 });
    std::cout << x << std::endl;

    //排序操做 true 大到小排序,false 小到大排序
    auto out = x.sort(-1, true);

    std::cout << std::get<0>(out) << "\r\n" << std::get<1>(out) << std::endl;

輸出以下:code

0.0855  0.4925  0.4323
 0.8314  0.8954  0.0709
 0.0996  0.3108  0.6845
[ Variable[CPUFloatType]{3,3} ]

 0.4925  0.4323  0.0855
 0.8954  0.8314  0.0709
 0.6845  0.3108  0.0996
[ Variable[CPUFloatType]{3,3} ]

 1  2  0
 1  0  2
 2  1  0
[ Variable[CPULongType]{3,3} ]
相關文章
相關標籤/搜索