NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

使用 TensorFlow.NET 构建神经网络

作者:Robert Krzaczyński

  • 2022-08-05
  • 本文字数:3684 字

    阅读完需:约 12 分钟

使用TensorFlow.NET构建神经网络

构建和创建神经网络主要是和 Python、R、Matlab 等联系在一起。不过,在过去几年中,我们多了一些选择。其中就包括.NET 技术。当然,你可以使用所有可能的语言从头开始创建神经网络,但这超出了本文的范围,我们关注可以提供更多选择的库,接下来本文将重点介绍其中之一:TensorFlow.NET 的库。

神经网络

先解释下神经网络的基本概念。这里围绕前馈神经网络(FNN)展开,这是神经网络的基本类型之一。这种类型的神经网络也称为多层感知机(MLP)。


前馈神经网络的目标是对某个函数 f*做近似计算。神经网络使用了分类器,它会将输入数据映射到一个特定的类别。


例如,分类器 y = f*(x)将输入 x 映射到类别 y。MLP 准确计算出映射 y=f(x;α) 并习得参数值α——这些参数值提供了函数的最佳近似。


注意看下面的图。它展示了一个 MLP 感知机。其中包含一个输入层、至少一个隐藏层和一个输出层。


这称为前馈网络,因为信息总是向一个方向传递,永远不会向回传递。值得一提的是,如果一个神经网络有两个或多个隐藏层,我们就将之称为深度神经网络(DNN)。

神经网络的主要应用

人工神经网络是深度学习的基础组成部分。它们是基于人工神经元概念的生物神经网络的数学模型。在人工神经网络中,一个人工神经元被视为一个计算单元,基于一个特定的激活函数,根据加权输入数据在输出端计算生成一个特定的值。与其他机器学习算法相比,它们更综合,更可扩展,非常适合复杂的大型机器学习任务。由于具有独特的特性和优势,神经网络的应用领域非常广泛。


我们可以将神经网络用于任何需要定性(而非定量)答案的地方。定量数据和可以计数或测量的信息有关,可以给出数字值。相反,定量答案本质上是描述性的,通过语言而不是数字值来表示。因此,神经网络的应用场景包括:


  • 价格预测

  • 生物实验解释

  • 产品问题分析

  • 医学研究

  • 电子电路诊断


销售预测为了加深理解,下面介绍一个真实世界的例子。某公司在中欧和东欧市场的 20 个国家开展业务,分销液压和温度控制系统部件。有个问题是要确定每个分销点的可用库存量。多年来,行政管理人员通过某类产品的需求和供应量报告来收集详细数据。这些数据显示,有时候库存太高,有时候又供应不足。他们决定使用人工神经网络来解决这个问题。


为了创建神经网络的输入,他们使用了记录仓库近 5 年来繁荣状况的报告。办公室工作人员整理出了 206 个案例,其中 60%用作学习集,20%用作验证集,剩余的 20%作为测试集。每个案例都包含特定的特征,如坐落于特定区域或地理位置(即它们是在城区还是在郊区)的仓库的天气条件。


他们创建的算法还不足以用于库存管理,因为结果不够有说服力(有效性低于 65%),但这个结果已经比基于基本计算的“传统方法”好了 3 倍,更接近事实了。我们可以得出结论,为了获得更可靠的解决方案,算法创建者会继续尝试,创建一个考虑了更多因素的系统。


人工神经网络被应用于科学、经济和工业的各个领域。越来越多的企业家和科学家认识到了它们的有效性,在商业系统中创建和实现它们的技术也在增加。我之前提到的许多库都实现了这些技术。我接下来将要介绍的 TensorFlow.NET 就是其中之一。

TensorFlow.NET

TensorFlow.NET这个库为TensorFlow提供了.NET Standard 绑定。它让.NET 开发人员可以设计、训练和实现机器学习算法,包括神经网络。此外,Tensorflow.NET 让我们可以利用 TensorFlow 提供的各种机器学习模型和编程资源。

TensorFlow

TensorFlow 是一个由谷歌科学家和工程师开发用来进行数值计算的开源框架。它提供了一系列用于神经网络设计、训练和优化的工具。TensorFlow 架构灵活,可以将计算调度到个人计算机、服务器上的一个或多个处理器(CPU)或显卡上,而且不用重写代码。

Keras

Keras是另一个可以用于创建神经网络的开源库。它后台使用 TensorFlow 或Theano执行操作。Keras 旨在简化这两个框架的使用,算法执行和结果返回都是由这两个框架完成的。在接下来的例子中,我们将使用 Keras。

TensorFlow.NET 使用示例

在这个例子中,我们将创建 FNN,并且会用到一些与神经网络相关的术语,如层、损失函数等。我建议你读下 Matthew Stewart 写的这篇文章,了解下这些术语。


首先需要创建一个控制台应用程序项目 (1) ,并用 NuGet 包管理器下载所需的库 (2)。

(1)


(2)

至此,可以开始实现和创建模型了。第一步是为神经网络创建一个对应的类。它的字段应该包括模型、学习集和测试集。Model 类来自 TensorFlow.Keras.Engine,NDArray 是 NumSharp 的一部分。NumSharp 相当于 Python 世界的 NumPy 库。


using NumSharp;using Tensorflow.Keras.Engine;using Tensorflow.Keras.Layers;using static Tensorflow.KerasApi;
namespace NeuralNetworkExample{
public class Fnn { Model model; NDArray x_train, y_train, x_test, y_test; ..... }}
复制代码


第二步是生成测试集和训练集,我们将在 Keras 中使用 MNIST 数据集。MNIST 是一个大型的数字数据库,用于训练各种图像处理算法。数据集从 Keras 库加载。训练图片的大小为 2828 像素,总共 60000 张。我们需要将图片改造成 1 行 784(2828)个像素,并将像素值的范围从 0-255 缩小为 0-1,因为我们需要将神经网络的输入规格化。测试图片也基本一样,只不过测试图片是 10000 张。


public class Fnn{    ....
public void PrepareData() { (x_train, y_train, x_test, y_test) = keras.datasets.mnist.load_data(); x_train = x_train.reshape(60000, 784) / 255f; x_test = x_test.reshape(10000, 784) / 255f; }}
复制代码


现在,我们可以聚焦负责构建模型和配置神经网络选项的代码了。其中包括定义层及其激活函数、优化器、损失函数和评价指标。神经网络的一般概念并不难理解,下文会简单说明。以下是我们实现的神经网络。


 public class Fnn  {    ....        public void BuildModel()    {        var inputs = keras.Input(shape: 784);
var layers = new LayersApi();
var outputs = layers.Dense(64, activation: keras.activations.Relu).Apply(inputs);
outputs = layers.Dense(10).Apply(outputs);
model = keras.Model(inputs, outputs, name: "mnist_model"); model.summary();
model.compile(loss: keras.losses.SparseCategoricalCrossentropy(from_logits: true), optimizer: keras.optimizers.Adam(), metrics: new[] { "accuracy" }); }}
复制代码


在这个例子中,我们将 shape 设置为 784(因为一行有 784 个像素),输入层的输出空间维数为 64,一个输出层有 10 个单元(这里可以设置不同的层数,可以通过试验根据误差做出选择)。激活函数使用了ReLU,优化器使用了Adam的算法。一般来说,那就是专门设计用来训练深度神经网络的。此外,我们将使用准确率作为检验学习质量的指标。我觉得,现在是时候解释下准确率和损失函数的含义了。神经网络里的损失函数定义了预期结果和机器学习模型所产生的结果之间的差异。我们可以从损失函数得出梯度,用于更新权重。所有损失的均值代表成本。


准确率是正确预测数和总测试实例数的比值,用于确定有多少实例分类正确。我们应尽可能地提高准确率得分。在这个例子里,准确率超过 90%。一般而言,这样的结果相当不错了,但我们的分析也不复杂,还需要进行更多专门的研究。完成上述步骤后,现在可以开始训练和测试模型了:


public class Fnn{  ....
public void Train() { model.fit(x_train, y_train, batch_size: 10, epochs: 2); model.evaluate(x_test, y_test); }}
复制代码


设置批次大小(表示训练样本子集的大小),比如 8,并将 epochs 设置为 2。在这里,我们也是通过试验过程来选择这些值。然后,终于到了最后一步,创建 Fnn 类的一个实例并执行代码。


class Program{    static void Main(string[] args)    {        Fnn fnn = new Fnn();        fnn.PrepareData();        fnn.BuildModel();        fnn.Train();    }}
复制代码


启动应用程序训练阶段开始。在控制台中,应该可以看到类似下面这样的输出:

一段时间后(时长取决于数据集大小),进入测试阶段:


如你所见,每个迭代都会返回一个损失函数和准确率。上述参数的计算结果表明,本文所建立的神经网络具有良好的效果。

小结

本文重点介绍了如何设计一个神经网络。当然,如果只是为了在 TensorFlow.NET 中使用基于神经网络的算法,那么你可以不知道背后的理论。尽管如此,熟悉这些基本知识有助于更好地理解问题和得到的结果。直到几年之前,机器学习也还只是和像 Python 或 R 这样的编程语言有关。感谢像 TensorFlow.NET 这样的库,C#也开始在机器学习中发挥重要作用了。我希望事情会继续朝着这个方向发展。


作者简介


Robert Krzaczyński 是一名专注于微软技术的软件工程师。在日常工作中,他主要基于.NET 开发软件,但他的兴趣要广泛得多。此外,他还对机器学习和人工智能有深入的研究。在业余时间,Robert 还通过博客分享知识(bush-dev.com)。他拥有控制工程和机器人专业学士学位和计算机科学工程硕士学位。


原文链接:


Building Neural Networks With TensorFlow.NET

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2022-08-05 09:412617

评论

发布
暂无评论
发现更多内容

魔电熊户外电源体验|让户外露营实现用电自由!

科技热闻

低代码音视频开发训练营正在火热报名中!

阿里云视频云

阿里云 低代码 低代码平台 媒体处理 视频云

利用Graviton2和CloudFront为S3对象存储动态生成缩略图

亚马逊云科技 (Amazon Web Services)

存储

有道围棋 AI:智能匹配儿童棋力的良师益友

有道技术团队

网易有道 围棋

优化服务器存储架构——Amazon EBS io2 Block Express正式推出!

亚马逊云科技 (Amazon Web Services)

存储

Linux之chown命令

入门小站

Linux

专家带你吃透 Flink 架构:一个新版 Connector 的实现

腾讯云大数据

flink 流计算 Oceanus

十三部门修订发布《网络安全审查办法》,企业数据安全合规应尽早

行云管家

云计算 互联网 网络安全 数据安全

开源堡垒机可以一直免费使用吗?为什么?

行云管家

开源 网络安全 堡垒机

iOS开发-数据结构与算法学习之排序篇

iOSer

ios 算法 数据结构与算法 ios开发 iOS 知识体系

阿里副总裁浅雪对话VMware全球副总裁原欣:阿里云携手VMware,助力企业数字化转型

大咖说

云计算 阿里云 数字化转型 阿里巴巴‘

大数据开发之Hive表数据同步至HBase

@零度

大数据 hive HBase

网络安全好学吗?手把手教你学利用漏洞渗透 网络安全工程师学习资料汇总

学神来啦

教程直播第6期 | OceanBase 如何进行 Benchmark 测试及调优

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 社区版

Apache Flink 不止于计算,数仓架构或兴起新一轮变革

Apache Flink

大数据 flink 编程 实时计算 流式数仓

图形测试分析毫无头绪?HarmonyOS图形栈测试技术帮你解决|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

手把手教你使用 Timestream 实现物联网时序数据存储和分析!

亚马逊云科技 (Amazon Web Services)

存储

Tableau Day2: 可视化入门图形制作

贾献华

1月月更

TDengine助力京东云IoT数据统计改造

TDengine

数据库 tdengine OpenTSDB

二哥的小破站终于上线了,颜值贼高!

沉默王二

Java 分布式

【工具推荐】Github国内访问速度太慢?一招教你轻松搞定

恒生LIGHT云社区

GitHub

java开发框架Redis之sentinel和集群

@零度

redis JAVA开发

快来一起玩转LiteOS组件:RHas

华为云开发者联盟

C语言 LiteOS 组件 RHas 哈希函数库

前端开发之CSS样式——自定义滚动条

@零度

CSS 前端开发

SAP HANA Delivery Unit概念简述

Jerry Wang

数据库 内存数据库 1月月更

设计是表达的艺术,不是艺术的表达

Yisen玩设计

EventBridge 最佳实践场景:流计算 Oceanus 告警消息实时推送

腾讯云大数据

flink 流计算 Oceanus

有了这个新特性,一扫实例存储数据丢失风险!

亚马逊云科技 (Amazon Web Services)

存储

谁说count(*) 性能最差,我需要跟你聊聊

华为云开发者联盟

函数 count 字符 数据表

kafka的优缺点都有那些

编程江湖

kafka

在线CSS代码压缩美化工具

入门小站

工具

使用TensorFlow.NET构建神经网络_大数据_InfoQ精选文章