首页 > 其他分享 >对DenseTensor进行Transpose

对DenseTensor进行Transpose

时间:2023-06-12 21:55:35浏览次数:76  
标签:index int Transpose shape Length DenseTensor var new 进行

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();

标签:index,int,Transpose,shape,Length,DenseTensor,var,new,进行
From: https://www.cnblogs.com/podolski/p/17476202.html

相关文章

  • C++采用Daemon进行后台程序的部署
    文章目录一、如何采用Daemon进行后台程序的部署1.创建子进程2.终止父进程3.创建新的会话4.改变当前工作目录5.重设文件权限掩码6.关闭不需要的文件描述二.代码示例 一、如何采用Daemon进行后台程序的部署在C++中,如果要让一个程序一直在后台运行并且和......
  • 给CPU进行压力测试
    教你怎么在Linux下给CPU一点压力原创 入门小站 入门小站 2023-06-0322:13 发表于湖北收录于合集#Linux804个入门小站分享运维技巧及10k+Stars的开源项目265篇原创内容公众号“【Linux250个常用命令速查手册】关注【入门小站】,后台回复「1001」......
  • Fiddler:对神策埋点数据进行解码
    配置1.安装配置Fiddler略1.修改脚本语言修改脚本语言为C#2.配置只对『埋点url』抓包参考:3.修改FiddlerScript在FiddlerScript中OnBeforeResponse方法中添加脚本,参考:https://www.sensorsdata.cn/tools/decode.htmlif(oSession.uriContains("sa.gif"))......
  • 企业如何进行数字化建设
    很多企业都开始数字化建设,并探索不同工具和方法来实现。然而,企业往往又会被不同的解决方案所困惑。那么,企业应该如何选择大数据解决方案呢?主要考虑以下6个重要方面:01分析蓝图无论是从哪一类具体的分析需求开始,对于分析的构建,都需要设想整个蓝图。在构建企业分析时,有三个维度是很重......
  • 龙芯下如何进行.net core程序开发部署
    龙芯LoongArch64已经发布了对.NETCore的支持,相关工具链也已完成,目前支持.NETCore3.1、.NET6、.NET7版本。本文以.NETCore3.1在loongnix-server8.4下部署为例说明开发部署过程。.NETCore3.1是基于上游社区.NETCore3.1-LTS-SDK制作的,同样是LTS版本。1、在龙芯开源社区下载安装.net......
  • try……except配合traceback模块,进行不报错异常捕获
    通过try语句去尝试做正确的事,如果中途遭遇了意外情况就引发异常提示try:………………………………………………………………return"成功执行"exceptExceptionase:#Handletheexceptiont......
  • 利用Kali进行简单的 SYN FLOOD 攻击测试
    本文实验旨在简单介绍下使用kali的自带工具hping3进行SYNFLOOD(属于典型的DOS/DDOS攻击)测试攻击,实验环境均在VMware虚拟机内,并无涉及真实IP地址。若因传播或利用本文所提供的信息而造成任何直接或间接的后果,均由使用者本人负责,作者不为此承担任何责任!打开Kali虚拟机后,进入管理......
  • 根据已有链表中的元素进行排序
    思想为先将链表中的每一个节点映射到一个链表节点为变量的数组里,在根据节点的元素进行排序,本程序为ave,过程中将数组变量排序,最后重新生成链voidpaixu(LinkListhead)//从大到小{intlength=len(head),i=0,j=0,sum1[length],n1;LinkListsum[length];LinkListpa=hea......
  • 对数据进行模糊匹配搜索(动态规划、最长公共子串、最长公共子序列)
    在搜索时常常在输入一半或者输入错误时,搜索引擎就给出智能提示。已知的搜索推荐主要包括以下几个方面:包含:“清华”和“清华大学”相似:“聊天软件”和“通讯软件”相关:“明星”和“刘亦菲”纠错:“好奇害死毛”和“好奇害死猫”其中包含模糊匹配可以使用动态规划算......
  • 【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实
    异常传播有时候,您可能需要重新抛出捕获到的异常。这种情况通常发生在捕获到Error或RuntimeException时,因为您可能没有预料到这些异常,但在声明捕获Throwable和Exception时,它们也被包含在内了。为了解决这个问题,Guava提供了多种方法来判断异常类型并重新抛出异常。例如:try{......