当前位置: 首页 > news >正文

京东网站设计风格移动排名提升软件

京东网站设计风格,移动排名提升软件,广东建设营销型网站,网络建站公司源码源代码作者:https://github.com/zjhellofss 本文仅作为个人学习心得领悟 ,将原作品提炼,更加适合新手 什么是推理框架? 深度学习推理框架用于对已训练完成的神经网络进行预测,也就是说,能够将深度训练框…

源代码作者:https://github.com/zjhellofss

本文仅作为个人学习心得领悟 ,将原作品提炼,更加适合新手

什么是推理框架?

深度学习推理框架用于对已训练完成的神经网络进行预测,也就是说,能够将深度训练框架例如Pytorch、Tensorflow中定义的算法移植到中心侧和端侧,并高效执行。与训练框架不同的是,深度学习推理框架没有梯度反向传播功能,因为算法模型文件中的权重系数已经被固化,推理框架只需要读取、加载并完成对新数据的预测即可。

模型加载阶段

训练完成的模型被放置在两个文件中,一个是模型定义文件,一个是权重文件

ONNX文件是将模型定义文件和权重文件合二为一的文件格式。

关于维度的预备知识

在Tensor张量中,共有三维数据进行顺序存放,分别是Channels(维度),Rows(行高), Cols(行宽),

三维矩阵我们可以看作多个连续的二维矩阵组成,最简单的方法就是std::vector<std::vector<std::vector<float>>>,但是这种方法非常不利于数据的访问(尤其是内存不连续的问题 、修改以及查询,特别是在扩容的时候非常不方便。不能满足使用需求

不连续会造成数组访问慢的问题,在这里我用chrono做了测试:

#include<iostream>
#include <gtest/gtest.h>
#include <armadillo>
#include <glog/logging.h>
#include <vector>
#include <chrono>
#define TICK(x) auto bench_##x = std::chrono::steady_clock::now();
#define TOCK(x) std::cout << #x ": " << std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - bench_##x).count() *1000000<< "ns" << std::endl;
using namespace std;
int m = 10000 , n = 10000 , channel = 2;
TEST(test_compare_vector , speed2D){LOG(INFO)<<"Test of vector & cube"<<endl;vector<vector<float>> matA (m , vector<float>(n , 1));TICK(2D);for (int  i = 0; i <matA.size(); i++){for (int j = 0; j < matA[0].size(); j++){matA[i][j] = matA[i][j]*matA[j][i];}}TOCK(2D);arma::fcube matB( m , n , 1 , arma::fill::ones);TICK(cube);for (int  i = 0; i <m; i++){for (int j = 0; j < n; j++){matB(i , j , 0) = matB(i , j , 0)*matB( j , i , 0);}}TOCK(cube);}

因此,综合考虑灵活性和开发的难易度,作者在这里以Armadillo类中的arma::mat(矩阵 matrix)类和arma::cube 作为数据管理(三维矩阵)类来实现Tensor 库中类的主体,一个cube由多个matrix组成,cube又是Tensor类中的数据实际管理者。一块连续的大内存分配开始写一个tensor,工作量会特别大,折中!

 作者设计的类是以arma::cube为基础实现了Tensor我们主要是提供了更方便的访问方式和对外接口 

 上图即为Tensor与cube的对应关系。

 cube一般有多个维度,在channel维度上有多个matrix。

arma::cube(2,5,3),表示当前的三维矩阵共有2个矩阵构成,每个矩阵都是5行3列的。如果放在我们项目中会以这形式提供 Tensor tensor(2,5,3)

下图是这种情况下的三维结构图,可以看出一个Cube一共有两个Matrix,也就是共有两个Channel。一个Channel放一个Matrix. Matrix的行宽均为Rows和Cols.

 Tensor类方法总览

这里的很多都不需要我们重新去造轮子

比如Fill(float value)就可以直接调用cube里的fill:

void Tensor<float>::Fill(float value) {CHECK(!this->data_.empty());this->data_.fill(value);
}

再比如这个at:

float &Tensor<float>::at(uint32_t channel, uint32_t row, uint32_t col) {CHECK_LT(row, this->rows());CHECK_LT(col, this->cols());CHECK_LT(channel, this->channels());return this->data_.at(row, col, channel);
}

再难一些的就需要我们自己去实现了:

Fill(vector)方法实现:

TEST(test_tensor, fill) {using namespace kuiper_infer;Tensor<float> tensor(3, 3, 3);ASSERT_EQ(tensor.channels(), 3);ASSERT_EQ(tensor.rows(), 3);ASSERT_EQ(tensor.cols(), 3);std::vector<float> values;for (int i = 0; i < 27; ++i) {values.push_back((float) i);}tensor.Fill(values);LOG(INFO) << tensor.data();int index = 0;for (int c = 0; c < tensor.channels(); ++c) {for (int r = 0; r < tensor.rows(); ++r) {for (int c_ = 0; c_ < tensor.cols(); ++c_) {ASSERT_EQ(values.at(index), tensor.at(c, r, c_));index += 1;}}}LOG(INFO) << "Test1 passed!";
}

padding功能实现:

 


TEST(test_tensor, padding1) {using namespace kuiper_infer;Tensor<float> tensor(3, 3, 3);ASSERT_EQ(tensor.channels(), 3);ASSERT_EQ(tensor.rows(), 3);ASSERT_EQ(tensor.cols(), 3);tensor.Fill(1.f); // 填充为1tensor.Padding({1, 1, 1, 1}, 0); // 边缘填充为0ASSERT_EQ(tensor.rows(), 5);ASSERT_EQ(tensor.cols(), 5);int index = 0;// 检查一下边缘被填充的行、列是否都是0for (int c = 0; c < tensor.channels(); ++c) {for (int r = 0; r < tensor.rows(); ++r) {for (int c_ = 0; c_ < tensor.cols(); ++c_) {if (c_ == 0 || r == 0) {ASSERT_EQ(tensor.at(c, r, c_), 0);}index += 1;}}}LOG(INFO) << "Test2 passed!";
}

再谈谈Tensor类中数据的排布

我们以具体的图片作为例子,来讲讲Tensor中数据管理类arma::cube的数据排布方式Tensor类是arma::cube对外更方便的接口,所以说armadillo::cube怎么管理内存的,Tensor类就是怎么管理内存的。希望大家的能理解到位。如下图中的一个Cube,Cube的维度是2,每个维度上存放的是一个Matrix,一个Matrix中的存储空间被用来存放一张图像(lena) 。一个框内(channel)是一个Matrix,Matrix1存放在Cube第1维度(channel 1)上,Matrix2存放在Cube的第2维度上(channel 2). Matrix1和Matrix2的Rows和Cols均代表着图像的高和宽,在本例中就是512和384。

 

http://www.jinmujx.cn/news/80556.html

相关文章:

  • 网站建设的目的怎样做好服务营销
  • 大型网站建设方案关键词如何优化排名
  • 网站建设长期待摊费用在线服务器网站
  • 做减肥网站怎么让客户主动找你
  • 使用joomla的网站学it学费大概多少钱
  • 苏州实力做网站公司有哪些北京优化核酸检测
  • 用花生棒自己做内网网站百度提问登录入口
  • 镜像的网站怎么做排名百度互联网营销
  • 做流量网站市场营销说白了就是干什么的
  • 网站建设教学seo关键词首页排名
  • 喜欢做网站的行业seo在线诊断工具
  • vr成品网站源码百度推广后台管理
  • 专业网站建设公司郑州新闻源
  • 一个网站多久能做完自己建网站详细流程
  • 做冷饮的网站免费b站在线观看人数在哪
  • 沈阳共产党员两学一做网站电商seo优化是什么
  • 鲜花店网站源码友情链接在线观看
  • 龙游做网站东莞网站建设推广平台
  • 网站研发进度表下载网络营销方案ppt
  • 网站整体运营厦门seo排名优化公司
  • 计算机应用专业(网站开发)嘉兴seo外包公司费用
  • 广东网站建设公司报价重庆seo网络优化咨询热线
  • 长沙理财网站建设seo是指搜索引擎优化
  • 五十一团 黑龙江生产建设兵团知青网站上海seo网站优化软件
  • 青海建设厅通报网站网络营销推广有效方式
  • 黄岛因特网站建设公司怎么做宣传推广
  • magento网站建设流量精灵网页版
  • 政府网站建设工作经验交流网络平台运营是做什么的
  • 沈阳哪里做网站百度seo优化教程免费
  • 做国外lead应该做什么网站百度知道在线问答