caffe2 tensor< cudacontext>作业,施工或副本

技术标签: C ++  OPENCV  caffe2

这是一个远景,如果您认为问题过于本地化,请进行投票以结束。我搜索了 caffe2 github 存储库,打开 一个问题 问同样的问题,在 caffe2_ccp_tutorials 存储库是因为其作者似乎最好地理解它,请阅读有关Doxygen文档 caffe2 ::张量caffe2 :: cudacontext,甚至穿过caffe2 源代码,以及特定的 tensor.h, context_gpu.hcontext_gpu.cc.

我知道目前 caffe2不允许将设备内存复制到张量。我愿意扩展图书馆并执行拉动请求以实现这一目标。我背后的原因是我使用 cv::cuda::* 在设备内存上运行的方法,因此我认为在GPU上进行预处理,只是将结果重新下载到主机上,然后将其重新上传到从主机到设备的网络上,这显然是一个问题。

看着的构造函数 Tensor<Context> 我可以看到也许只有

template<class SrcContext , class ContextForCopy > 
Tensor (const Tensor< SrcContext > &src, ContextForCopy *context)

可能会实现我想要的,但我不知道如何设置 <ContextForCopy> 然后将其用于施工。

此外,我看到我可以用正确的尺寸构造张量,然后 也许 使用

template <typename T>
T* mutable_data()

我可以分配/复制数据。数据本身存储在 std::vector<cv::cuda::GpuMat,所以我必须迭代它,然后使用任何一个 cuda::PtrStepSz 或者 cuda::PtrStep 访问基础设备分配的数据。这与我需要复制/分配到的数据相同 caffe2::Tensor<CUDAContext>.

我一直在试图找出内部 Tensor<CPUContext> 被复制到 Tensor<CUDAContext> 由于我已经看到了它的示例,但是我无法弄清楚,尽管我认为使用的方法是 CopyFrom。如已经提到的通常示例,从CPU复制到GPU:

TensorCPU tensor_cpu(...);
TensorCUDA tensor_cuda = workspace.CreateBlob("input")->GetMutable<TensorCUDA>();
tensor_cuda->ResizeLike(tensor_cpu);
tensor_cuda->ShareData(tensor_cpu);

我非常惊讶,没有人遇到过这项任务,简短的搜索只能产生一个 公开问题 作者(@peterneher)或多或少地问同一件事。

看答案

我设法弄清楚了。最简单的方法是告诉OpenCV 哪个 内存位置要使用。这可以通过使用 第七和第8个超负荷 cv::cuda::GpuMat 构造函数 如下所示:

cv::cuda::GpuMat::GpuMat(int    rows,
                         int    cols,
                         int    type,
                         void *     data,
                         size_t     step = Mat::AUTO_STEP 
                        )       

cv::cuda::GpuMat::GpuMat(Size   size,
                         int    type,
                         void *     data,
                         size_t     step = Mat::AUTO_STEP 
                        )       

这样做意味着 caffe2::TensorCUDA 已被宣布 分配 预先:

std::vector<caffe2::TIndex> dims({1, 3, 224, 224});
caffe2::TensorCUDA tensor;
auto ptr = tensor.mutable_data<float>();
cv::cuda::GpuMat matrix(224, 224, CV_32F, ptr);

例如,使用3通道BGR Float矩阵使用 cv::cuda::split:

cv::cuda::GpuMat mfloat;
// TODO: put your BGR float data in `mfloat`
auto ptr = tensor.mutable_data<float>();
size_t width = mfloat.cols * mfloat.rows;
std::vector<cv::cuda::GpuMat> input_channels {
    cv::cuda::GpuMat(mfloat.rows, mfloat.cols, CV_32F, &ptr[0]),
    cv::cuda::GpuMat(mfloat.rows, mfloat.cols, CV_32F, &ptr[width]),
    cv::cuda::GpuMat(mfloat.rows, mfloat.cols, CV_32F, &ptr[width * 2])
};
cv::cuda::split(mfloat, input_channels);

希望这将帮助任何人居住在Caffe2的C ++方面。

笔记caffe2::Predictor 不使用 caffe2::TensorCUDA,您将需要手动传播张量。有关此的更多信息, caffe2_cpp_tutorial mnist.cc.


智能推荐

【caffe2从头学】:3.5.Models and Datasets

本片文章是我的【caffe2从头学】系列中的一篇,如果想看其他文章,请看目录: 0.目录 1.快速开始 1.1.什么是caffe2 ? 1.2.安装caffe2 2.学习caffe2 3.caffe2官方教程的安装与使用 3.1.Blobs and Workspace, Tensors,Net 概念 3.2.Caffe2 的一些基本概念 - Workspaces&Operators &am...

Caffe2 实现卷积计算原理(1)

最近花费两个月时间接触caffe2框架和卷积计算; 1.卷积计算原理 借用yangqing大神的原图 (1)矩阵变换 图片维度:通道(C)*高度(H)*宽度(W)),可以看到按照通道方向,即C方向进行矩阵变换 (2)按行获取图像中每个点的值,依次进行矩阵变换 依次按照通道方向,即C方向取值 (3)获取最终图像矩阵 虽然按照通道方向取值每个点,实际过程中是将每个通道划分为小段进行取值。将图像转换后的...

Ubuntu源码配置Caffe2(问题集合)

现在时间是2018.03.14,在Ubuntu16.04 平台 源码方式编译安装Caffe2(CPU版),遇到了一些问题,以及最后的解决方案整理如下。 Step1:安装 安装过程 参考的是官方主页上给出的安装教程,链接 https://caffe2.ai/docs/getting-started.html?platform=ubuntu&configuration=compile 在执行最...

ubuntu16.04中安装caffe2 和 detectron

参考文章:https://www.cnblogs.com/zhencv/p/8384419.html 1,  首先安装好cuda和cudnn,我目前是使用cuda8.0,cudnn6.1(安装教程参考本博客其他文章,基本所有的框架都是需要这个步骤) 2,   按照官网教程按照caffe2:       &nb...

Caffe2(3)----下载现成的模型并使用

Caffe2(3)----下载现成的模型并使用 Caffe2训练好的模型可在Model Zoo下载,下载的命令很简单,接下来以下载和使用squeezenet为例,进行简单说明。   1.浏览可下载的模型 已有模型都放在github上,地址:https://github.com/caffe2/caffe2/wiki/Model-Zoo,当前有caffe和caffe2两种版本的选择。 &nb...

猜你喜欢

Caffe2:移动计算的深度学习框架

文章讲的是Caffe2:移动计算的深度学习框架,Caffe2是Facebook新的开源深度学习框架。与之前的PyTorch不同,Caffe2专门用于将深度学习移植到移动应用程序中,这将会让智能手机更“深入”、更智能!   如果你认为深度学习还只是一个概念,你就错了。世界各地的研究实验室都试图开发高效快速的软件框架,使研究人员或程序员能够实施和测试深度学习模型。现在,每个新的...

关于caffe2中的make,cmake

今天在装caffe2中的时候,提示我需要make,搞不懂什么是make,甚至都忘了什么是编译和链接了。 巩固了下知识: 首先对上图进行解释: CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执...

「机器学习_5」逻辑回归(Logistic Regression )

学习逻辑回归需要清楚的几件事:假设函数怎么用(怎么预测),决策边界怎么用(一般取0.5),损失函数如果计算(因为要取最小),优化方法(重新计算各个权重) 建议:我阅读的英文参考资料的相关内容除了公式我并没有往上发布。但是我会放到我的下载资料中,建议,想彻底理解这几个内容的,如果不想直接从公式推导入手,可以考虑看下具体的例子,就会明白其中的含义。   前言  本文主要介绍逻辑回归的基础知识...

工业4.0知识图谱

编者按         本篇文章来自于17th Extended Semantic Web Conference (ESWC2020) 会议。该文章提出了基于语义标注网络的结构化数据集,包含工业4.0标准、范式和框架,并给出了知识图谱在工业4.0应用的现有案例。   本文作者北京大学周雨奇,将对原文进行概要阐述。   文末提供获...

缓冲区溢出实例(二)–Linux

原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞。 工具: 调试工具:edb; ###python在漏洞溢出方面的渗透测试和漏洞攻击中,具有很大的优势 实验对象:crossfire【多人在线RPG游戏】 运行平台:Kali i386 虚拟机【32位,计算机CPU位数是指地址总线位数,64位系统的寻址空间为2^64,寻址过大,难以处理,为了简化操作,所以选用...

问答精选

insertMany drop down mongodb service

I have API, where I get datas. I use mongoose to save it into my local MongoDB. Each time when I save, I create dynamically new model and use insertMany on it: But... later, when all almost complete, ...

How to use Task.WhenAll to wait for third party Async method call

I have been trying to figure this out for a few hours and haven't been able to understand why this isn't working. I have a TPL Dataflow batch block that accepts a batch of files that I want to upload....

Python Pandas KeyError when trying to save a timestamp to MySQL

I'm trying to save a data frame to a mysql database. But it seems that it doesn't work because of the timestamp (format?). When I run this script, the following Error occurs ..... Can't figure it out ...

Auto renumbering sections with Notepad++ automated scripts

I am a modder with very little scripting experience. I need a way to renumber the following Sections of a file: etc. The file looks like this: and has to be continued like this: and so on. So simply s...

Write log-file when testing with NUnit

I have a test-assembly (MyTestProject) where I want to write some logging using log4net. Thus I created a config-file with the same name as the assembly where I set up the logging as suggested here: W...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答