对DenseTensor进行Transpose

这篇具有很好参考价值的文章主要介绍了对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 运行并测试。文章来源地址https://www.toymoban.com/news/detail-482273.html

#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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【机器学习】Spark ML 对数据特征进行 One-Hot 编码

    什么是 One-Hot 编码? 在机器学习中,一般需要对非数值型的特征进行编码处理,将其转化为数值型的特征。其中,One-Hot 编码是一种常见的特征编码方式。 One-Hot 编码是将一个离散特征的每个取值映射为一个唯一的整数编号,并将该编号表示成一个二进制向量的形式。具体来

    2024年02月04日
    浏览(43)
  • 【使用机器学习和深度学习对城市声音进行分类】基于两种技术(ML和DL)对音频数据(城市声音)进行分类(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 算例1 2.2 算例2 2.3 算例3 2.4 算例4

    2024年02月16日
    浏览(51)
  • 微软.NET、.NET Framework和.NET Core联系和区别

    我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,我小时候喜欢看小人书(连环画),在那个没有电视、没有手机的年代,这是为数不多的课余生活方式这一。我画的不好,但是如果能帮大家理解编程语言

    2024年01月16日
    浏览(61)
  • 【.NET全栈】.net的微软API接口与.NET框架源码

    如果浏览器打不开链接,换一个浏览器打开。 我是 打不开微软的链接,使用: 可以打开!!! https://docs.microsoft.com/zh-cn/dotnet/api/?view=netframework-4.8 https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms?view=netframework-4.8 .Net Framework的源码可以从这里下载: https://referencesource.microso

    2024年02月04日
    浏览(66)
  • .NET Framework 微软官方下载地址

    微软官方下载地址: 下载 .NET Framework | 免费官方下载 (microsoft.com) 版本 发布日期 终止支持 .NET Framework 4.8.1 2022年8月9日 .NET Framework 4.8 2019年4月18日 .NET Framework 4.7.2 2018年4月30日 .NET Framework 4.7.1 2017年10月17日 .NET Framework 4.7 2017年4月5日 .NET Framework 4.6.2 2016年8月2日 .NET Framework 3.5

    2024年02月10日
    浏览(52)
  • 【微软技术栈】C#.NET 依赖项注入

    多个构造函数发现规则 使用扩展方法注册服务组 框架提供的服务 服务生存期 服务注册方法 作用域验证 范围场景 .NET 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现控制反转 (IoC) 的技术。 .NET 中的依赖关系注入是框架的内置部分,与配置、日志记

    2024年02月03日
    浏览(48)
  • 微软官网下载Net Framework流程

    1、官网下载链接 https://dotnet.microsoft.com/en-us/download/dotnet-framework/net451 2、选择合适的版本 3、点击下载

    2024年02月16日
    浏览(48)
  • 关于微软NET家族族谱将讲解 关于 最全.NET Core、NET 5、NET 6和.NET 7简介和区别

    不知道从什么时候开始,.NET 出来了越来愈多的名词 ,Visual Studio 版本从2000 一直到了 现在2022 ,中间陆续出来十多个版本,到后面 vscode ,底层 .NET 名称也是越来越花里胡哨的 从.NET FrameWork 1.0到 .net core 到 .NET  5 ,还有各种SDK 啥玩意的,最主要的是 市面上用.NET的公司不多,

    2024年01月18日
    浏览(51)
  • 微软发布ChatGPT 版必应 用的是 .NET 技术

    微软在今天在Redmond 线下举办媒体一场活动,发布了新版的微软必应, 在桌面上推出了测试版,移动版也即将推出。微软首席执行官纳德拉称Al-powered搜索为公司自云15年以来最大的事情。 2023年1月初,微软已经在讨论将OpenAI的技术纳入Word、PowerPoint、Outlook和其他应用程序,这

    2024年02月08日
    浏览(46)
  • 【微软技术栈】C#.NET 中使用依赖注入

    先决条件 创建新的控制台应用程序 添加接口 添加默认实现 添加需要 DI 的服务 为 DI 注册服务 结束语 本文介绍如何在 .NET 中使用依赖注入 (DI)。 借助 Microsoft 扩展,可通过添加服务并在 IServiceCollection 中配置这些服务来管理 DI。 IHost 接口会公开 IServiceProvider 实例,它充

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包