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的更多相关文章

  1. [LeetCode] Transpose File 转置文件

    Given a text file file.txt, transpose its content. You may assume that each row has the same number ...

  2. TRANSPOSE的DATA步实现

    data a; input name $ a b ; cards; x x x y y y ; run; %macro transpose; proc sql noprint ; select cou ...

  3. SAS实验室之PROC TRANSPOSE

    首先,抛开SAS,回忆我们在数学课本上学习的转置是什么概念,转置如下图: 以上就是数学中的转置. 那么在SAS里该如何转置呢? 先看语法格式: PROC TRANSPOSE <DATA=inpu ...

  4. Excel: Switch (transpose) columns and rows

    链接:https://support.office.com/en-in/article/Switch-transpose-columns-and-rows-ed1215f5-59af-47e6-953 ...

  5. V-rep学习笔记:机器人逆运动学数值解法(The Jacobian Transpose Method)

    机器人运动学逆解的问题经常出现在动画仿真和工业机器人的轨迹规划中:We want to know how the upper joints of the hierarchy would rotate ...

  6. Matlab中transpose函数的使用

    就是转置的意思,和'一个意思,但是并不重复,因为在cellfun中你无法'这样吧,所以有了这个函数,’只是符号. K>> aa = magic(4) aa = 16 2 3 13 5 11 ...

  7. Transpose File

    Given a text file file.txt, transpose its content. You may assume that each row has the same number ...

  8. Python-图像处理库PIL图像变换transpose和transforms函数

    1.transpose有这么几种模式FLIP_LEFT_RIGHT ,FLIP_TOP_BOTTOM ,ROTATE_90 ,ROTATE_180 ,ROTATE_270,TRANSPOSE ,TRA ...

  9. [LeetCode] Transpose Matrix 转置矩阵

    Given a matrix A, return the transpose of A. The transpose of a matrix is the matrix flipped over it ...

  10. [Bash]LeetCode194. 转置文件 | Transpose File

    Given a text file file.txt, transpose its content. You may assume that each row has the same number ...

随机推荐

  1. 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2024年7月刊

    本文为大家整理了墨天轮数据社区2024年7月发布的优质技术文章/文档,主题涵盖Oracle.MySQL.PostgreSQL等主流数据库系统以及国产数据库的深度教程和实用指南.从基础的安装配置到复杂的 ...

  2. 动态去读 dll 文件

    // 反射动态读取 dll // Assembly assembly = Assembly.LoadFile(); 路径 // Assembly assembly = Assembly.LoadFro ...

  3. mysql+navicat+eclipse+jsp

    mysql server 5.5安装 微信公众号搜软件智库,然后找到mysql 5.5 百度网盘下载对应自己电脑版本的mysql 百度网盘:http://pan.baidu.com/s/1jI5oB6 ...

  4. 调试npm下载的组件

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  5. KubeSphere 3.4.0 发布:支持 K8s v1.26

    2023 年 07 月 26 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere 3.4.0 正式发布! 让我们先简单回顾下之前三个大版本的主要变化: KubeSphere 3. ...

  6. 云原生爱好者周刊:使用 Cilium 和 Grafana 实现无侵入可观测性

    开源项目推荐 Cilium Grafana Observability Demo 这个项目由 Cilium 母公司 Isovalent 开源,提供了一个 Demo,使用 Cilium.OpenTele ...

  7. Redhat 7安装Oracle 11.2.0.4 RAC 数据库软件中报错:Error in invoking target 'agent nmhs' of makefile

    环境:Redhat Linux 7.6 + Oracle 11.2.0.4 RAC 现象:图像化安装数据库软件过程中的86%时,报错. 1. 具体现象 2. 定位问题 3. 解决问题 1. 具体现象 ...

  8. vs程序员使用windbg实例

    如果使用32位的windbg,windbg加载完dump文件后,窗口会显示wow64cpu,表示是64位进程,需要切换到64位环境: .load wow64exts !sw 设置符号表(crtl+s) ...

  9. 狂神说-Docker基础-学习笔记-06 commit镜像

    狂神说-Docker基础-学习笔记-06 commit镜像 视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?p=20 如何提交一个自己的镜像? doc ...

  10. 一文彻底弄懂Java的IO操作

    Java 的 IO(输入/输出)操作是处理数据流的关键部分,涉及到文件.网络等多种数据源.以下将深入探讨 Java IO 的不同类型.底层实现原理.使用场景以及性能优化策略. 1. Java IO 的 ...