高效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张量生成的更多相关文章

  1. pytorch中tensor张量数据基础入门

    pytorch张量数据类型入门1.对于pytorch的深度学习框架,其基本的数据类型属于张量数据类型,即Tensor数据类型,对于python里面的int,float,int array,flaot ...

  2. 深度学习框架Tensor张量的操作使用

    - 重点掌握基本张量使用及与numpy的区别 - 掌握张量维度操作(拼接.维度扩展.压缩.转置.重复……) numpy基本操作: numpy学习4:NumPy基本操作 NumPy 教程 1. Tens ...

  3. [PyTorch 学习笔记] 1.2 Tensor(张量)介绍

    本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/tensor_introduce1.py https: ...

  4. 8 tensorflow修改tensor张量矩阵的某一列

    1.tensorflow的数据流图限制了它的tensor是只读属性,因此对于一个Tensor(张量)形式的矩阵,想修改特定位置的元素,比较困难. 2.我要做的是将所有的操作定义为符号形式的操作.也就是 ...

  5. TensorFlow中的 tensor 张量到底是什么意思?

    详见[Reference]: TensorFlow中的“Tensor”到底是什么? 以下摘录一些要点: 这个图好生动呀!~ 标量和向量都是张量(tensor).

  6. pytorch中tensor张量的创建

    import torch import numpy as np print(torch.tensor([1,2,3])) print(torch.tensor(np.arange(15).reshap ...

  7. 更短且不失高效的UUID生成算法

    Java原生的UUID长度为36位,嫌长 这里自己实现了一套自己的算法,来生成较短的UUID 由雪花算法启发而来, 大致原理是利用时间戳+随机值做值,然后转换成62进制(当然这个进制数你也可以搞成更多 ...

  8. TensorFlow tensor张量拼接concat - split & stack - unstack

    TensorFlow提供两种类型的拼接: tf.concat(values, axis, name='concat'):按照指定的已经存在的轴进行拼接 tf.stack(values, axis=0, ...

  9. tensorflow中张量(tensor)的属性——维数(阶)、形状和数据类型

    tensorflow的命名来源于本身的运行原理,tensor(张量)意味着N维数组,flow(流)意味着基于数据流图的计算,所以tensorflow字面理解为张量从流图的一端流动到另一端的计算过程. ...

随机推荐

  1. dedecms arclist分页

    https://blog.csdn.net/qq_41104911/article/details/81510589

  2. mac系统 PHP Nginx环境变量修改

    场景:php默认的环境变量不是我们实际工作中想要的 执行命令:which php 查看默认的php指向的目录 :  /usr/bin/php 修改· ~/.bash_profile 文件 添加php环 ...

  3. POJ3498最大流,枚举终点,企鹅,基础最大流

    题意:       有一n个冰块,每个冰块上都有一些企鹅,所有的企鹅要跳到一个冰块上去,但是由于起跳是的后坐力原因导致每个冰块最多条mi次,最后问你所有的企鹅都跳到一个冰块上去的那块冰块可以是哪一块, ...

  4. 使用 cmake 来搭建跨平台的应用程序框架:C语言版本

    目录 一.前言 二.示例代码说明 1. 功能描述 2. 文件结构 3. cmake 构建步骤 4. Utils 目录说明 5. Application 目录说明 三.Linux 系统下操作步骤 1. ...

  5. 分布式ID

    需求 全局唯一 高性能 高可用 简单易用 UUID 优点: 唯一 不依赖于任何第三方服务 缺点: 是字符串类型而非数字,不满足数字ID的需求 字符串太长了,DB查询效率受影响 数据库自增ID 如果使用 ...

  6. 使用C#进行数据库增删改查ADO.NET(二)

    这节接着讲用C#进行数据库CRUD,高级部分.  事务: 事务是执行一批sql语句,如果中途失败,全部回滚,数据不会受影响,中途没有出错则会提交事务,真正对数据进行修改.C#提供了SqlTransac ...

  7. .NET 平台系列6 .NET Core 发展历程

    系列目录     [已更新最新开发文章,点击查看详细] 在我的上一篇博客<.NET平台系列5 .NET Core 简介>中主要介绍了.NETCore的基本情况,主要包括.NET跨平台的缘由 ...

  8. Redis 存储对象信息是用 Hash 还是 String

    Redis 内部使用一个 RedisObject 对象来表示所有的 key 和 value,RedisObject 中的 type,则是代表一个 value 对象具体是何种数据类型,它包含字符串(St ...

  9. [BUAA2021软工]结对第一阶段博客作业小结

    作业链接 结对项目-第一阶段 优秀作业推荐 本次博客作业虽然是简单总结,但是以下作业中都不乏有思考.有亮点的精彩内容,推荐给同学们阅读学习. 山鸣谷应,相得益彰--杰对项目-第一阶段总结 该组对于可能 ...

  10. [re模块、json&pickle模块]

    [re模块.json&pickle模块] re模块 什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则 ...