文章目录

  • 前言
  • 一、VS2022+CNTK环境搭建
  • 二、逻辑回归代码构建
    • 1.逻辑回归构建
    • 2.训练数据的生成
    • 3.模型训练
  • 三、效果展示

前言

本文基于CNTK实现逻辑回归二分类,并以之前的不同,本次使用C#实现,不适用python,python版的CNTK比较简单,而且python版的cntk个人感觉没什么必要,毕竟是微软的框架因此本人强迫症犯了,所以使用C#实现CNTK
环境版本:
Visualstudio 2022
C# .net4.6
cntk 2.7
cuda 10.1


一、VS2022+CNTK环境搭建

首先把CNTK的需要的dll解压出来,可直接从此处免费下载:
CNTK安装
然后再项目上引入dll,如图:


二、逻辑回归代码构建

1.逻辑回归构建


从网上对逻辑回归的图的解释,可以使用CNTK很容易就可以构建逻辑回归的结构

private static Function CreateLinearModel(Variable input, int outputDim, DeviceDescriptor device)
{int inputDim = input.Shape[0];var weightParam = new Parameter(new int[] { outputDim, inputDim }, DataType.Float, 1, device, "w");var biasParam = new Parameter(new int[] { outputDim }, DataType.Float, 0, device, "b");return CNTKLib.Times(weightParam, input) + biasParam;
}

这里的可以简单的理解为y=kx+b的结构。

2.训练数据的生成

这里主要是每次训练的时候会生成一批数据,首先对输入批次/输出批次构建数组,然后使用随机数种子,生成一批数据,服从高斯分布随机数,注意这里的mean和std

private static double GenerateGaussianNoise(double mean, double stdDev, Random random)
{double u1 = 1.0 - random.NextDouble();double u2 = 1.0 - random.NextDouble();double stdNormalRandomValue = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2);return mean + stdDev * stdNormalRandomValue;}private static void GenerateRawDataSamples(int sampleSize, int inputDim, int numOutputClasses, out float[] features, out float[] oneHotLabels){Random random = new Random(0);features = new float[sampleSize * inputDim];oneHotLabels = new float[sampleSize * numOutputClasses];for (int sample = 0; sample < sampleSize; sample++){int label = random.Next(numOutputClasses);for (int i = 0; i < numOutputClasses; i++){oneHotLabels[sample * numOutputClasses + i] = label == i ? 1 : 0;}for (int i = 0; i < inputDim; i++){features[sample * inputDim + i] = (float)GenerateGaussianNoise(3, 1, random) * (label + 1);}}}

3.模型训练

static void Main(string[] args)
{//设置逻辑回归的输入和输出的量,三入二出,因逻辑回归基本是二分类,因此这里输出的是2int inputDim = 3;int numOutputClasses = 2;//使用GPU模块var device = DeviceDescriptor.GPUDevice(0);//设置输入输出Variable featureVariable = Variable.InputVariable(new int[] { inputDim }, DataType.Float);Variable labelVariable = Variable.InputVariable(new int[] { numOutputClasses }, DataType.Float);//网络结构的构建及损失计算,这里使用CNTK的Softmaxvar classifierOutput = CreateLinearModel(featureVariable, numOutputClasses, device);var loss = CNTKLib.CrossEntropyWithSoftmax(classifierOutput, labelVariable);var evalError = CNTKLib.ClassificationError(classifierOutput, labelVariable);//学习率的设置TrainingParameterScheduleDouble learningRatePerSample = new TrainingParameterScheduleDouble(0.02, 1);IList<Learner> parameterLearners = new List<Learner>() { Learner.SGDLearner(classifierOutput.Parameters(), learningRatePerSample) };//构建训练迭代器var trainer = Trainer.CreateTrainer(classifierOutput, loss, evalError, parameterLearners);//训练批次int minibatchSize = 64;int numMinibatchesToTrain = 10000;int updatePerMinibatches = 10;// 循环训练for (int minibatchCount = 0; minibatchCount < numMinibatchesToTrain; minibatchCount++){Value features, labels;GenerateValueData(minibatchSize, inputDim, numOutputClasses, out features, out labels, device);trainer.TrainMinibatch(new Dictionary<Variable, Value>() { { featureVariable, features }, { labelVariable, labels } }, device);PrintTrainingProgress(trainer, minibatchCount, updatePerMinibatches);}Console.ReadLine();
}

三、效果展示

基于CNTK/C#实现逻辑回归【附源码】相关推荐

  1. 基于Simulink雷达系统建模仿真(附源码)

    目录 一.系统架构 二.运行结果 2.1示例模拟 2.2 天线增益/方向的影响 2.3 接收器 LO 上的相位噪声使能 2.4 相位噪声的影响 三.源码 此示例显示如何设置由发射器.带目标的信道和接收 ...

  2. 基于Simulink宽带单基地雷达系统仿真(附源码)

    目录 一.探索示例 1.1 收发器 1.2 信号处理子系统 1.3 渠道 1.4 目标子系统 二.结果和显示 三.总结 四.程序 本示例演示如何仿真宽带雷达系统.当雷达系统的带宽超过系统中心频率的5% ...

  3. 源码系列:基于FPGA的PS2通信电路设计(附源码)

    今天给大侠带来基于FPGA的PS2通信电路设计,附源码,获取源码,请在"FPGA技术江湖"公众号内回复"PS2源码",可获取源码文件.话不多说,上货. 设计背景 ...

  4. 基于SpringBoot的健身房管理系统【附源码】

    基于SSM的校园点餐外卖配送系统(点餐系统.外卖系统.配送系统) 开发语言:Java 数据库:MySQL 技术:Spring+SpringMVC+MyBatis+ElementUI 工具:IDEA/E ...

  5. 基于Java的学籍管理系统(附 源码 论文 课件)

    项目背景: 随着计算机产业的迅速发展,电子计算机已广泛的应用于信息管理.文字处理.辅助设计.辅助教学及人们的日常生活中.基于WEB的学生学籍管理系统主要是针对高校中涉及高校学生学籍管理的一系列相关工作 ...

  6. 基于Matlab的磁力计校准(附源码)

    目录 一.理想磁力计 二.硬铁效应 三.软铁效应 四.校正技术 五.使用函数magcal 5.1 仅偏移计算 ​编辑5.2 硬铁补偿和轴缩放计算 5.3 全硬铁和软铁补偿 5.4 自动拟合 六. 结论 ...

  7. 基于JavaWeb学生成绩信息管理系统(附源码资料)-毕业设计

    1. 适用人群 本课程主要是针对计算机专业相关正在做毕业设计.或者是需要实战项目的Java开发学习者. 2. 你将收获 提供:项目源码.项目文档.数据库脚本.软件工具等所有资料(在平台的课程附件中进行 ...

  8. 基于FPGA 以太网gmii_to_rgmii模块编写 附源码

    笔者使用的开发板是米联客zynq UitraScale+ xczu4ev-sfvc784-2-i开发板进行测试 由于米联客协议族源码不开源,自己写了一个简易的以太网接口转换模块只支持1000M速率. ...

  9. 基于LSTM的股票价格预测模型【附源码】

    导语:本文介绍了LSTM的相关内容和在股票价格预测上的应用. LSTM(Long Short Term Memory)是一种 特殊的RNN类型,同其他的RNNs相比可以更加方便地学习长期依赖关系,因此 ...

最新文章

  1. 线程组多次调用_详细分析 Java 中启动线程的正确和错误方式
  2. 多个Finder方法的外部内容类型
  3. iphone 常用预编译代码
  4. 现在的计算机专业(比如机器学习)已经沦为调包专业了吗?
  5. 电子计算机系统可以分为几类,电子计算机分为两大类.doc
  6. 五边形lisp程序_CAD LISP 程序
  7. web.xml配置解释
  8. CSS3混合模式mix-blend-mode/background-blend-mode简介 ,PS中叠加效果
  9. usb audio知识点
  10. 微软超融合私有云测试02-测试架构描述
  11. 本地方法接口和本地方法栈总结
  12. 用小乌龟git解决冲突之后,再提交,出现自己没用动过的文件
  13. MATLAB符号运算——极限
  14. SQL Server 2000/2005/2008 系列产品下载地址
  15. SSM项目实战 —— 物流管理系统的实现
  16. 十进制转十二进制-复试练习
  17. [RK3399][Android7.1] DDR动态频率调节驱动小结
  18. OpenGL FBO学习
  19. 鹅长微服务发现与治理巨作PolarisMesh实践-上
  20. 基于高通SNPE推理引擎的yolov5目标检测算法

热门文章

  1. java中dateFormat是什么_Java中的DateFormat用法举例
  2. 05-SHELL-25道面试题总结
  3. 中闽在线:以“积分”为纽带 共享线上渠道资源
  4. 靠Play Pass反击Apple Arcade,谷歌有胜算吗?
  5. Android高德地图隐藏Logo(7.4以后)
  6. java如何去除噪点,消除黑白图像中的噪点
  7. ORACLE12C 创建表空间的方法
  8. 我的世界服务器死亡信息汉化,我的世界1.5.2-1.8.8尸体插件
  9. 【进阶二】Python实现VRPTW常见求解算法——差分进化算法(DE)
  10. 余额宝 资产证明步骤