keras+cntk后端在c#封装实现

博客介绍了在CNTK框架下的操作流程。先给出相关参考代码链接,指导从指定网址下载CNTK - master并解压。说明了在keras + cntk(backend)框架下训练神经网络得到权重,以及获取最后一层权重用于C#预测的命令。还详细介绍了创建C#控制台程序、安装nuget包、添加相关文件及修改目标平台等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体参考:
https://github.com/Microsoft/CNTK/blob/master/Examples/Evaluation/CNTKLibraryCSEvalCPUOnlyExamples/CNTKLibraryCSEvalExamples.cs

通过以下网址下载CNTK-master,并解压
https://github.com/Microsoft/CNTK/tree/master

神经网络在keras+cntk(backend)框架下训练得到权重
使用如下命令得到训练的神经网络权重的最后一层用于在C#中调用来进行预测(需要import cntk)
cntk.combine(model.outputs).save(’/home/wxcnl/Downloads/cntk’)

创建一个C#控制台程序,在C#中安装以下nuget包
https://www.nuget.org/packages/CNTK.CPUOnly/
并右击该项目-添加-现有项
添加如下目录中的CNTKExtensions.cs
D:\CNTK-master\Examples\Evaluation\CNTKLibraryCSEvalCPUOnlyExamples
再添加以下目录中的CNTKImageProcessing.cs
D:\CNTK-master\Examples\Evaluation\ImageExtension

右击项目-属性-生成-目标平台改为x64

以下为测试样本代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using CNTK;
using CNTKExtension;
using CNTKImageProcessing;


namespace cntk_test
{
    class Program
    {
        static void Main(string[] args)
        {
            EvaluationSingleImage();
            Console.WriteLine("success");
            Console.ReadLine();
        }

        public static string cntk_model_file = "D:\\SDI_0123cntkcntk";
        private static string SampleImage = "D:\\SDI\\imgr\\0.bmp";
        public static DeviceDescriptor device = CNTK.DeviceDescriptor.CPUDevice;
        public static Function modelFunc = Function.Load(cntk_model_file, device);

        public static void EvaluationSingleImage()
        {
            Console.WriteLine("\n===== Evaluate single image =====");

            // Get input variable. The model has only one single input.
            // The same way described above for output variable can be used here to get input variable by name.
            Variable inputVar = modelFunc.Arguments.Single();

            // Get shape data for the input variable
            NDShape inputShape = inputVar.Shape;
            int imageWidth = inputShape[1];
            int imageHeight = inputShape[2];
            Bitmap bmp = new Bitmap(Bitmap.FromFile(SampleImage));
            var resized = bmp.Resize(imageWidth, imageHeight, true);
            List<float> resizedCHW_temp = resized.ParallelExtractCHW();
            //训练图片为灰度图,所以只取单通道数组,以该方式读取得到的数组为一个通道的所有像素
            List<float> resizedCHW = resizedCHW_temp.Take(256 * 4800).ToList();
            //单通道数组在输入模型时所有像素值需要除以255
            for (int i = 0; i < 256 * 4800; i++)
            {
                resizedCHW[i] = resizedCHW[i]/(255.0f);
            }
            //CNTK C#网页上的example代码
            var inputDataMap = new Dictionary<Variable, Value>();
            var inputVal = Value.CreateBatch(inputShape, resizedCHW, device);
            inputDataMap.Add(inputVar, inputVal);
            Variable outputVar = modelFunc.Output;
            var outputDataMap = new Dictionary<Variable, Value>();
            outputDataMap.Add(outputVar, null);
            modelFunc.Evaluate(inputDataMap, outputDataMap, device);
            var outputVal = outputDataMap[outputVar];
            var outputData = outputVal.GetDenseData<float>(outputVar);
            //显示通过神经网络处理后的图片标注,本任务为切割任务,所以需要显示图片标注
            byte[] outputimg = new byte[256 * 4800*3];
            for (int i = 0; i < outputData[0].Count; i++)
            {
                outputimg[i] = (byte)(outputData[0][i]*255.0f);
            }
            int o = 0;
            for (int i = 0; i < outputData[0].Count; i++)
            {
                outputimg[o++] = (byte)(outputData[0][i] * 255.0f);
                outputimg[o++] = (byte)(outputData[0][i] * 255.0f);
                outputimg[o++] = (byte)(outputData[0][i] * 255.0f);
            }
            Bitmap m_currBitmap2 = new Bitmap(256, 4800, PixelFormat.Format24bppRgb);
            Rectangle m_rect2 = new Rectangle(0, 0, 256, 4800);
            var m_bitmapData2 = m_currBitmap2.LockBits(m_rect2, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
            IntPtr iptr2 = m_bitmapData2.Scan0;   
            System.Runtime.InteropServices.Marshal.Copy(outputimg, 0, iptr2, 256* 4800 * 3);
            m_currBitmap2.UnlockBits(m_bitmapData2);
            m_currBitmap2.Save("C:\\Users\\18367\\Desktop\\corner_test\\cntk_prediction.jpg");
  

        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值