在这里,我们介绍了上一篇文章中介绍的体系结构的代码,并且我们将研究另一种体系结构,该体系结构需要比普通的CPU更多的知识来进行准确的训练。

  • 下载源1.5 MB

首先,让我们从Nuget软件包管理器下载Keras.NET软件包。我们可以在工具Nuget软件包管理器中找到Nuget软件包管理。Keras.NET依赖于Numpy.NET和pythonnet_netstandard软件包。如果未安装它们,让我们继续安装它们。

在这里必须指出,Keras.NET需要在您的操作系统中安装Python 2.7-3.7版本。它还需要安装Python库Numpy和TensorFlow。在此示例中,我们使用了Python 3.7 64位。

如果在执行本文中的代码时遇到任何问题,请尝试在ConsoleApplication中执行main方法的开始时一次运行以下代码。这段代码将设置您需要的环境变量,以便找到所有DLL:

private static void SetupPyEnv(){string envPythonHome = @"C:\Users\arnal\AppData\Local\Programs\Python\Python37\";string envPythonLib = envPythonHome + "Lib\\;" + envPythonHome + @"Lib\site-packages\";Environment.SetEnvironmentVariable("PYTHONHOME", envPythonHome, EnvironmentVariableTarget.Process);Environment.SetEnvironmentVariable("PATH", envPythonHome + ";" + envPythonLib + ";" + Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine), EnvironmentVariableTarget.Process);Environment.SetEnvironmentVariable("PYTHONPATH", envPythonLib, EnvironmentVariableTarget.User);PythonEngine.PythonHome = envPythonHome;PythonEngine.PythonPath = Environment.GetEnvironmentVariable("PYTHONPATH");}

现在,我们将看到使用Keras.NET创建用于硬币识别的CNN多么容易和透明。以下类显示了包含模型所有逻辑的Cnn类。

public class Cnn{private DataSet _dataset;private Sequential _model;public Cnn(DataSet dataset){_dataset = dataset;_model = new Sequential();}public void Train(){// Build CNN model_model.Add(new Conv2D(32, kernel_size: (3, 3).ToTuple(),padding: Settings.PaddingMode,input_shape: new Shape(Settings.ImgWidth, Settings.ImgHeight, Settings.Channels)));_model.Add(new Activation(Settings.ActivationFunction));_model.Add(new Conv2D(32, (3, 3).ToTuple()));_model.Add(new Activation(Settings.ActivationFunction));_model.Add(new MaxPooling2D(pool_size: (2, 2).ToTuple()));_model.Add(new Dropout(0.25));_model.Add(new Conv2D(64, kernel_size: (3, 3).ToTuple(),padding: Settings.PaddingMode));_model.Add(new Activation(Settings.ActivationFunction));_model.Add(new Conv2D(64, (3, 3).ToTuple()));_model.Add(new Activation(Settings.ActivationFunction));_model.Add(new MaxPooling2D(pool_size: (2, 2).ToTuple()));_model.Add(new Dropout(0.25));_model.Add(new Flatten());_model.Add(new Dense(Settings.FullyConnectedNodes));_model.Add(new Activation(Settings.ActivationFunction));_model.Add(new Dropout(0.5));_model.Add(new Dense(_dataset.NumberClasses));_model.Add(new Softmax());_model.Compile(loss: Settings.LossFunction,optimizer: Settings.Optimizer, metrics: new string[] { Settings.Accuracy });_model.Fit(_dataset.TrainX, _dataset.TrainY,batch_size: Settings.BatchSize,epochs: Settings.Epochs,validation_data: new NDarray[] { _dataset.ValidationX, _dataset.ValidationY });var score = _model.Evaluate(_dataset.ValidationX, _dataset.ValidationY, verbose: 0);Console.WriteLine("Test loss:" + score[0]);Console.WriteLine("Test accuracy:" + score[1]);}public NDarray Predict(string imgPath){NDarray x = Utils.Normalize(imgPath);x = x.reshape(1, x.shape[0], x.shape[1], x.shape[2]);return _model.Predict(x);}}

如我们所见,我们首先有一个构造函数,用于接收数据集(在本系列的第二篇文章中导入和处理),并创建存储在private变量中的Sequential类的新实例_model。什么Sequential? 它是一个空模型,使我们有可能堆叠图层,而这正是我们所需要的。

然后,在Train方法中,我们首先按照上一篇文章中介绍的体系结构中的描述创建层堆栈,然后编译模型并调用fit方法以开始训练。使用的损失函数为categorical_crossentropy。什么是损失函数?它是我们用来优化学习过程的函数,也就是说,我们将其最小化或最大化。最小化损失函数的负责人是优化器,它是一种算法,它可以改变网络的权重和学习率,以最大程度地减少损失。

最后,使用验证数据集评估模型。另一个方法是Predict,顾名思义,它可以预测新传入数据的标签。培训结束后应调用此方法。开始训练短语就像运行以下命令一样简单:

var cnn = new Cnn(dataSet);
cnn.Train();

让我们看看在本系列中我们要解决的硬币识别问题的训练过程中获得的结果:

我们可以看到我们在训练过程中能够达到100%的准确性。

在预测方法的情况下,其输出将是NDarray,其包含对象或图像属于用于训练CNN的类别之一的概率。

那么,什么样的架构会需要GPU而不是CPU?例如,AlexNet体系结构包括五个卷积层和三个完全连接的层,以及池化和激活层。由于其复杂性,这种类型的深度CNN在GPU上的性能更好。一般规则是,添加的图层越多,权重的计算就越复杂。

在了解了如何编码自己的CNN之后,我们将转到预先训练的模型领域。在下一篇文章中将对此进行更多介绍!

C#中的深度学习:Keras.NET中的硬币识别,第二部分相关推荐

  1. C#中的深度学习:使用OpenCV进行硬币检测

    在本文中,我们将介绍一个OpenCV应用程序,它将检测图像中的硬币.硬币检测是完整硬币识别之前的常见阶段.它包括检测和提取给定图像中的硬币. 下载源1.5 MB 本系列附带的代码将使用Keras.NE ...

  2. 我的机器学习入门之路(中)——深度学习(自然语言处理)

    继上一篇<我的机器学习入门之路(上)--传统机器学习>,这一篇博客主要记录深度学习(主要是自然语言处理)这一块内容的学习过程.以下均将自然语言处理简称NLP. 这一块内容的学习路线分为三部 ...

  3. 如何在TensorFlow中通过深度学习构建年龄和性别的多任务预测器

    by Cole Murray 通过科尔·默里(Cole Murray) In my last tutorial, you learned about how to combine a convolut ...

  4. 精准医学中的深度学习和影像组学

    影像科正在经历一种范式转变,即使用人工智能与机器集成以及深度学习与影像组学更好地定义组织特征,从而实现计算机科学与影像学的共生关系.研究的目标是使用集成的深度学习和具有影像学参数的影像组学来为患者进行 ...

  5. 浏览器中实现深度学习?有人分析了7个基于JS语言的DL框架

    作者:仵冀颖 编辑:H4O 本文中,作者基于WWW'19 论文提供的线索,详细解读了在浏览器中实现深度学习的可能性.可行性和性能现状.具体而言,作者重点分析了 7 个最近出现的基于JavaScript ...

  6. 饮水思源--浅析深度学习框架设计中的关键技术

    点击上方"深度学习大讲堂"可订阅哦! 编者按:如果把深度学习比作一座城,框架则是这座城中的水路系统,而基于拓扑图的计算恰似城中水的流动,这种流动赋予了这座城以生命.一个优雅的框架在 ...

  7. 基因组学中的深度学习

    全文6,743字,阅读30分钟. 这一篇文章的主题是深度学习在基因组学中的应用情况的.文章较长,读完要花些时间,不过我的建议是通读第一部分--关于如何进行模型训练的内容,读完后你应该可以理解机器学习模 ...

  8. 基因组学中的深度学习 (转载)

    转载说明:本文转载至 '碱基矿工' 公众号 这一篇文章的主题是深度学习在基因组学中的应用情况的.文章较长,读完要花些时间,不过我的建议是通读第一部分--关于如何进行模型训练的内容,读完后你应该可以理解 ...

  9. 在Tensorflow中使用深度学习构建图像标题生成器

    by Cole Murray 通过科尔·默里(Cole Murray) 在Tensorflow中使用深度学习构建图像标题生成器 (Building an image caption generator ...

  10. 「构建企业级推荐系统系列」深度学习在推荐系统中的应用

    点击上方"数据与智能","星标或置顶公众号" 第一时间获取好内容 作者 | gongyouliu 编辑 | auroral-L 2016年DeepMind开发的 ...

最新文章

  1. 转:iPhone之后,思考下一个科技突破
  2. 数据库系统概念总结:第一章 引言
  3. 学习:ups电池放电时间是怎么计算的?
  4. Python(6):工程组织结构
  5. 信息学奥赛一本通(1190:上台阶)
  6. 七牛底层架构再完善 让服务从单一走向多元
  7. 在Linux下禁用IPv6的方法小结
  8. MySQL error(2014) Commands out of sync; you can't run this command now(情形1)
  9. JVM监控及诊断工具命令行篇之jcmd
  10. 使用hightopo完成基本图元旋转和闪烁
  11. 货币php是什么,php是什么【货币问答】- php是什么所有答案 - 联合货币
  12. CentOS装docker
  13. 小记(1)偷影子的人
  14. 一分钟快速理解:模拟信号和数字信号!
  15. 农村市场谋定中国农民丰收节交易会 消费潜力持续正释放
  16. windows操作系统---1
  17. 115道Java面试题及答案分享,java程序员赶紧收好
  18. 云脉智慧门禁搭载社区O2O服务,将服务深入到住户
  19. Barcode Producer for Mac(创建条形码软件)
  20. 【电路】电容(二)——滤波电容

热门文章

  1. visual studio installer可以卸载吗_技术帖 | 这些宝藏软件你安装了吗?
  2. app嵌入jsp页面的项目工作量_好程序员Java学习路线分享jsp为什么用的不多了
  3. 女生做产品经理好吗_谁说女生不适合做产品经理?
  4. oracle查询最近十条数据_Oracle-查询最近更新的前10条数据
  5. mysql索引的概念和作用_索引的基本概念及作用
  6. 三八妇女节PSD分层海报,来啦!
  7. 高品质餐饮相关场景模型素材,开始独特的场景来展示设计。
  8. Linux内核:了解Linux内核抢占
  9. FD.io VPP的C语言接口如何使用:FD.io VPP: How To Use The C API
  10. C语言控制台窗口界面编程:printf格式化显示-修改字符字体、颜色和背景