高效Tensor张量生成
高效Tensor张量生成
Efficient Tensor Creation
从C++中的Excel数据中创建Tensor张量的方法有很多种,在简单性和性能之间都有不同的折衷。本文讨论了一些方法及其权衡。
提示
继续阅读之前请务必阅读C++指南
将数据直接写入Tensor张量
如果能做到这一点就更好了。
不要复制数据或包装现有数据,而是直接将数据写入Tensor张量。
正向
对于进程内和进程外的执行,这将在没有副本的情况下工作
没有内存对齐要求
不需要使用删除程序
反向
可能需要对现有的应用程序进行大量的重构,才能使其正常工作
实例
可以将数据直接接收到Tensor张量的底层缓冲区中:
// Allocate a tensor
auto tensor = allocator->allocate_tensor<float>({6, 6});
// Get a pointer to the underlying buffer
auto data = tensor->get_raw_data_ptr();
// Some function that writes data directly into this buffer
recv_message_into_buffer(data);
或者可以手动填写Tensor张量:
// Allocate a tensor
auto tensor = allocator->allocate_tensor<float>({256, 256});
const auto &dims = tensor->get_dims();
// Get an accessor
auto accessor = tensor->accessor<2>();
// Write data directly into it
for (int i = 0; i < dims[0]; i++)
{
for (int j = 0; j < dims[1]; j++)
{
accessor[i][j] = i * j;
}
}
甚至可以将其与TBB并行:
// Allocate a tensor
auto tensor = allocator->allocate_tensor<float>({256, 256});
const auto &dims = tensor->get_dims();
// Get an accessor
auto accessor = tensor->accessor<2>();
// Write data into the tensor in parallel
tbb::parallel_for(
// Parallelize in blocks of 16 by 16
tbb:blocked_range2d<size_t>(0, dims[0], 16, 0, dims[1], 16),
// Run this lambda in parallel for each block in the range above
[&](const blocked_range2d<size_t>& r) {
for(size_t i = r.rows().begin(); i != r.rows().end(); i++)
{
for(size_t j = r.cols().begin(); j != r.cols().end(); j++)
{
accessor[i][j] = i * j;
}
}
}
);
包装现有内存
如果已经在某个缓冲区中保存了数据,那么这个方法很好。
正向
在进程内执行期间,这将在没有副本的情况下工作
如果已经有数据很容易做到
反向
需要了解什么是删除者以及如何正确使用
为了有效地使用TF,数据需要64字节对齐
注意:这不是一个硬性要求,但是TF可以在引擎盖下复制未对齐的数据
与#1相比,这会在进程外执行期间生成一个额外的副本
实例
从cv::Mat包装数据:
cv::Mat image = ... // An image from somewhere
auto tensor = allocator->tensor_from_memory<uint8_t>(
// Dimensions
{1, image.rows, image.cols, image.channels()},
// Data
image.data,
// Deleter
[image](void * unused) {
// By capturing `image` in this deleter, we ensure
// that the underlying data does not get deallocated
// before we're done with the tensor.
}
);
将数据复制到Tensor张量中
正向
很容易做到
无内存对齐要求
不需要使用删除程序
反向
在进程内执行期间总是生成一个额外的副本
与#1相比,这会在进程外执行期间生成一个额外的副本(尽管此副本是由用户显式编写的)
实例
从cv::Mat复制:
cv::Mat image = ... // An image from somewhere
auto tensor = allocator->allocate_tensor<uint8_t>(
// Dimensions
{1, image.rows, image.cols, image.channels()}
);
// Copy data into the tensor
tensor->copy_from(image.data, tensor->get_num_elements());
该用哪一个?
一般来说,按业绩衡量的方法顺序如下:
直接将数据写入Tensor张量
包装现有内存
将数据复制到Tensor张量中
也就是说,分析是朋友。
简单性和性能之间的折衷对于大Tensor张量和小Tensor张量也是不同的,因为副本对于小Tensor张量更便宜。
高效Tensor张量生成的更多相关文章
- pytorch中tensor张量数据基础入门
pytorch张量数据类型入门1.对于pytorch的深度学习框架,其基本的数据类型属于张量数据类型,即Tensor数据类型,对于python里面的int,float,int array,flaot ...
- 深度学习框架Tensor张量的操作使用
- 重点掌握基本张量使用及与numpy的区别 - 掌握张量维度操作(拼接.维度扩展.压缩.转置.重复……) numpy基本操作: numpy学习4:NumPy基本操作 NumPy 教程 1. Tens ...
- [PyTorch 学习笔记] 1.2 Tensor(张量)介绍
本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/tensor_introduce1.py https: ...
- 8 tensorflow修改tensor张量矩阵的某一列
1.tensorflow的数据流图限制了它的tensor是只读属性,因此对于一个Tensor(张量)形式的矩阵,想修改特定位置的元素,比较困难. 2.我要做的是将所有的操作定义为符号形式的操作.也就是 ...
- TensorFlow中的 tensor 张量到底是什么意思?
详见[Reference]: TensorFlow中的“Tensor”到底是什么? 以下摘录一些要点: 这个图好生动呀!~ 标量和向量都是张量(tensor).
- pytorch中tensor张量的创建
import torch import numpy as np print(torch.tensor([1,2,3])) print(torch.tensor(np.arange(15).reshap ...
- 更短且不失高效的UUID生成算法
Java原生的UUID长度为36位,嫌长 这里自己实现了一套自己的算法,来生成较短的UUID 由雪花算法启发而来, 大致原理是利用时间戳+随机值做值,然后转换成62进制(当然这个进制数你也可以搞成更多 ...
- TensorFlow tensor张量拼接concat - split & stack - unstack
TensorFlow提供两种类型的拼接: tf.concat(values, axis, name='concat'):按照指定的已经存在的轴进行拼接 tf.stack(values, axis=0, ...
- tensorflow中张量(tensor)的属性——维数(阶)、形状和数据类型
tensorflow的命名来源于本身的运行原理,tensor(张量)意味着N维数组,flow(流)意味着基于数据流图的计算,所以tensorflow字面理解为张量从流图的一端流动到另一端的计算过程. ...
随机推荐
- 【JVM】JVM中的垃圾收集器
垃圾收集器组合 Serial+Serial Old Serial+CMS ParNew+CMS ParNew+Serial Old Paralle Scavenge + Serial Old Para ...
- Http Get与Post的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- WindowsPE 第五章 导出表编程-1(枚举导出表)
导出表编程-1-枚举导出表 开始前先回忆一下导出表: 1.枚举dll函数的导出函数名字: 思路: (1)加载dll到内存里. (2)获取PE头,逐步找到可选头部. (3)然后找到里面的第一个结构(导出 ...
- Win64 驱动内核编程-28.枚举消息钩子
枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之 ...
- scrapy爬虫案例--爬取阳关热线问政平台
阳光热线问政平台:http://wz.sun0769.com/political/index/politicsNewest?id=1&page=1 爬取最新问政帖子的编号.投诉标题.投诉内容以 ...
- Day005 for循环
for循环 虽然所有循环结构都可以用while或者do-while表示,但java提供了另一种语句--for循环,使一些循环结构变得更加简单. for循环语句是支持迭代的一种通用结构,是最有效.最灵活 ...
- 手机访问电脑本地localhost网页
项目需要用手机访问电脑本地网页,从而可以调试项目,对代码的理解的快一点 重点 确保手机和电脑在同一个局域网 可以通过手机开热点电脑连接或者电脑开便携式热点手机连接 确保电脑的防火墙是关闭的 打开apa ...
- 测试的V模型和W模型
V模型 :后测试 优点: 1.每一阶段都清晰明了,便于把控开发的每一个过程. 2.既包含了单元测试又包含了系统测试 缺点: 1.测试介入的比较晚,所以开发前期的缺陷无从修改. 2.开发和测试串行. W ...
- Java 正则表达式实例操作
Regular Expression正则表达式,简称RegExp,常规通用的表达式,在多个开发语言中都有它的实现,可以通过正则表达式来快速的检索.匹配.查找.替换字符串中的文本. 简单实例 匹配网址 ...
- java基础——何为方法
方法 java中方法时语句的集合,他们在一起执行一个功能 方法时解决一类问题的步骤的有序组合 方法包含于与类或者对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:保持其原子性. 就是一个方 ...