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. 【Azure Cloud Service】使用RESTAPI更新Cloud Service(Extended Support) 中所配置的证书

    问题描述 当根据Cloud Service (Extended Support) 文档更新证书 ( https://docs.azure.cn/zh-cn/cloud-services-extende ...

  2. KubeSphere 助力提升研发效能的应用实践分享

    作者:卢运强,主要从事 Java.Python 和 Golang 相关的开发工作.热爱学习和使用新技术:有着十分强烈的代码洁癖:喜欢重构代码,善于分析和解决问题.原文链接. 我司从 2022 年 6 ...

  3. 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(4)

    1.问题描述: 目前华为推送API使用的是v2或者v1版本,请问目前最新的鸿蒙next使用v3版本是否兼容v2或者v1,反过来将v2或者v1的api可以推送鸿蒙next的设备吗? 解决方案: v3接口 ...

  4. 如何解决MySQL Connector NET xxxx无法卸载的问题(win10)

    使用Power BI(以下简称PBI)的小伙伴想必都知道,想要在PBI连接MySQL数据库,必须安装MySQL connector net,我之前安装过MySQL connector net 6.9. ...

  5. SHA1withRSA签名Python版本

    from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import SHA ...

  6. redis哨兵模式下主从切换后,php实现自动切换

    redis的哨兵模式,在主服务器挂掉后,会通过选举将对应的从服务器切换为主服务器,以此来达到服务的高可用性. 在业务层面如果主从做了切换可能相对应的服务器IP地址会发生改变,这样会带来程序的的正常运行 ...

  7. WinDbg调试命令之线程操作

    WinDbg的线程操作命令可以帮助开发人员诊断和解决多线程应用程序中的问题,常用的命令有以下这些. ~*e - 列出当前进程中的所有线程 这个命令会列出当前进程中的所有线程,包括它们的线程ID.状态. ...

  8. CUDA编程学习 (4)——thread执行效率

    1. Warp 和 SIMD 硬件 1.1 作为调度单位的 Warp 每个 block 分为 32-thread warp 在 CUDA 编程模型中,虽然 warp 不是显式编程的一部分,但在硬件实现 ...

  9. KVM的基本使用

    1. 虚拟化介绍 虚拟化是云计算的基础.简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU.内存.IO 硬件资源,但逻辑上虚拟机之间是相互隔离的. 物理机我们一般称为 ...

  10. 联邦学习开山之作Communication-Efficient Learning of Deep Networks from Decentralized Data

    1 介绍 1.1 背景 越来越多的手机和平板电脑成为许多人的主要计算设备.这些设备上强大的传感器(包括摄像头.麦克风和GPS),加上它们经常被携带的事实,意味着它们可以访问前所未有的大量数据,其中大部 ...