对DenseTensor进行Transpose
ML.NET 是微软推出的为. NET 平台设计的深度学习库,通过这个东西(ModelBuilder)可以自己构建模型,并用于后来的推理与数据处理。虽然设计是很好的,但是由于现在的 AI 发展基本上都以 python 实现作为基础,未来这个东西的发展不好说,特别是模型构建部分。我个人认为,它提供的最有价值的场景是:算法组的同学进行模型构建,然后导出 onnx 格式模型,由 ML.NET 加载并应用于生产环境中。这个流程可以进行持续集成与持续部署,性能也不错。此外,后端人员不需要太多 AI 相关知识,只需要了解怎么处理结果就可以了,这样降低了部署的门槛。
按照这个思路,最近使用 ML. NET 加载 pytorch 导出的 onnx 模型进行推理时,由于模型的输出的行顺序做了调整,我在利用之前需要进行一个 transpose 操作。
请分清楚 reshape 与 transpose 操作的区别,两者有本质不同。
但是 ML.NET 自带的数据功能太少了,后来找了一圈,发现 ML. NET 的 ONNXRUNTIME 设计之初就没有考虑过对其的后续数据处理,他们认为后续处理应当是属于另外过程的问题,需要使用其他的手段来处理数据变换等操作。
不得不说貌似非常有道理,我理解还是太肤浅了,最后使用了很多方法,甚至自己去实现了一个,但是感觉好像有点问题,不能白写,贴在这里了。
//用法
TransposeHelper.TransposeDimensions(w, new int[] { 1, 3, 80, 80, 57 }, new int[] { 1, 3, 57, 80, 80 }, new int[] { 0, 1, 4, 2, 3 })
//貌似还是有点问题
internal class TransposeHelper
{
public static float[] TransposeDimensions(float[] data, int[] inputShape, int[] outputShape, int[] permutation)
{
var rank = inputShape.Length;
var indices = Enumerable.Range(0, rank).ToArray();
var transposedIndices = permutation ?? indices.Reverse().ToArray();
if (inputShape.Length != transposedIndices.Length || inputShape.Length != outputShape.Length)
{
throw new ArgumentException("Invalid input shape, output shape or permutation.");
}
var transposedData = new float[data.Length];
var index = new int[rank];
for (var i = 0; i < data.Length; i++)
{
index = GetIndex(i, index, inputShape);
var transposedIndex = GetTransposedIndex(index, transposedIndices);
var transposedOffset = GetOffset(transposedIndex, outputShape);
transposedData[transposedOffset] = data[i];
}
return transposedData;
}
private static int[] GetIndex(int i, int[] index, int[] shape)
{
for (var j = shape.Length - 1; j >= 0; j--)
{
var div = 1;
for (var k = j - 1; k >= 0; k--)
{
div *= shape[k];
}
index[j] = i / div % shape[j];
}
return index;
}
private static int[] GetTransposedIndex(int[] index, int[] transposedIndices)
{
var transposedIndex = new int[index.Length];
for (var i = 0; i < index.Length; i++)
{
transposedIndex[i] = index[transposedIndices[i]];
}
return transposedIndex;
}
private static int GetOffset(int[] index, int[] shape)
{
var offset = 0;
var stride = 1;
for (var i = shape.Length - 1; i >= 0; i--)
{
offset += index[i] * stride;
stride *= shape[i];
}
return offset;
}
}
活不能不干,总得想想办法,经过查找,发现 NumSharp 支持 numpy 的 transpose 功能,实现起来和在 numpy 上一样简单:
NumSharp 实现在
C#上用numpy的语法实现其功能,以下代码使用 RoslynPad 运行并测试。
#r "nuget: NumSharp, 0.30.0"
#r "nuget: System.Numerics.Tensors, 0.1.0"
using System.Numerics.Tensors;
using NumSharp.Utilities;
using NumSharp;
var tensor = new DenseTensor<float>(new float[] { 1, 2, 3, 4, 5, 6 }, new[] { 2, 3 });
//tensor.Dump();
tensor.Reshape(new int[]{ 3, 2}).Dump();
NDArray nDArray = new NDArray(tensor.ToArray(), new Shape(new []{ 2, 3}));
//nDArray.Dump();
nDArray = nDArray.transpose(new int[]{1,0});
nDArray.Dump();
对DenseTensor进行Transpose的更多相关文章
- [LeetCode] Transpose File 转置文件
Given a text file file.txt, transpose its content. You may assume that each row has the same number ...
- TRANSPOSE的DATA步实现
data a; input name $ a b ; cards; x x x y y y ; run; %macro transpose; proc sql noprint ; select cou ...
- SAS实验室之PROC TRANSPOSE
首先,抛开SAS,回忆我们在数学课本上学习的转置是什么概念,转置如下图: 以上就是数学中的转置. 那么在SAS里该如何转置呢? 先看语法格式: PROC TRANSPOSE <DATA=inpu ...
- Excel: Switch (transpose) columns and rows
链接:https://support.office.com/en-in/article/Switch-transpose-columns-and-rows-ed1215f5-59af-47e6-953 ...
- V-rep学习笔记:机器人逆运动学数值解法(The Jacobian Transpose Method)
机器人运动学逆解的问题经常出现在动画仿真和工业机器人的轨迹规划中:We want to know how the upper joints of the hierarchy would rotate ...
- Matlab中transpose函数的使用
就是转置的意思,和'一个意思,但是并不重复,因为在cellfun中你无法'这样吧,所以有了这个函数,’只是符号. K>> aa = magic(4) aa = 16 2 3 13 5 11 ...
- Transpose File
Given a text file file.txt, transpose its content. You may assume that each row has the same number ...
- Python-图像处理库PIL图像变换transpose和transforms函数
1.transpose有这么几种模式FLIP_LEFT_RIGHT ,FLIP_TOP_BOTTOM ,ROTATE_90 ,ROTATE_180 ,ROTATE_270,TRANSPOSE ,TRA ...
- [LeetCode] Transpose Matrix 转置矩阵
Given a matrix A, return the transpose of A. The transpose of a matrix is the matrix flipped over it ...
- [Bash]LeetCode194. 转置文件 | Transpose File
Given a text file file.txt, transpose its content. You may assume that each row has the same number ...
随机推荐
- Java日期时间API系列24-----Jdk8中java.time包中的新的日期时间API类,MonthDay类源码和应用,对比相同月日时间。
Java8中为月日新增了类MonthDay,可以用来处理生日,节日.纪念日和星座等周期性问题. 1.MonthDay 特别需要注意的:它的默认打印格式会带前缀"--" ,比如--1 ...
- 墨天轮沙龙 | 北京大学李文杰:面向知识图谱应用的图数据库系统gStore
在6月8日举办的[墨天轮数据库沙龙第七期-开源生态专场]中,北京大学重庆大数据研究院图数据库与知识图谱实验室副主任.北京大学王选计算机研究所全职博士后 李文杰老师分享了<面向知识图谱应用的图数据 ...
- netCore 封装一个检验邮箱的类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 如何在Windows 11系统中将任意文件(如bat/log等)固定在开始菜单?
在Windows 11系统中,默认只支持将.exe/文件夹/.zip固定在开始菜单,如果想将其他文件如.bat/.log等文件固定在开始菜单将在右键菜单中找不到选项. 一个更简单的办法: 对任意文件右 ...
- 彻底搞懂ScheduledThreadPoolExecutor
前言 项目中经常会遇到一些非分布式的调度任务,需要在未来的某个时刻周期性执行.实现这样的功能,我们有多种方式可以选择: Timer类, jdk1.3引入,不推荐. 它所有任务都是串行执行的,同一时间只 ...
- redis的CPA三进二原则
CAP C:consistency,数据在多个副本中能保持一致的状态. A:Availability,整个系统在任何时刻都能提供可用的服务,通常达到99.99%四个九可以称为高可用 P:Partiti ...
- Halcon 快速入门教程
文章首发于我的 github 仓库-cv算法工程师成长之路,欢迎关注我的公众号-嵌入式视觉. 本人水平有限,文章如有问题,欢迎及时指出.如果看完文章有所收获,一定要先点赞后收藏.毕竟,赠人玫瑰,手有余 ...
- NPM 包开发与优化全面指南
前言 Hey, 我是 Immerse 系列文章首发于[Immerse],更多内容请关注该网站 转载说明:转载请注明原文出处及版权声明! 1. 理解 NPM 包的结构 1.1 package.json ...
- 掌控物体运动艺术:图扑 Easing 函数实践应用
现如今,前端开发除了构建功能性的网站和应用程序外,还需要创建具有吸引力且尤为流畅交互的用户界面,其中动画技术在其中发挥着至关重要的作用.在数字孪生领域,动画的应用显得尤为重要.数字孪生技术通过精确模拟 ...
- 如何解决PL/SQL Developer过期的情况
方法一:删除注册信息(文后有彩蛋) 原文出自度娘:https://jingyan.baidu.com/article/ce43664911c5303773afd38b.html 在此我仅作为记录,以便 ...