最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

使用 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:412615

评论

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

怎么建立无法删除的文件夹?

InfoQ IT百科

加盟自助洗车需要符合什么条件

共享电单车厂家

加盟自助洗车 自助洗车加盟条件

24小时自助洗车加盟怎么收费?

共享电单车厂家

自助洗车加盟 24小时自助洗车

截图快捷键是什么?

InfoQ IT百科

post接口请求测试,通俗易懂!

Liam

测试 Postman swagger 测试工具 jmetere

如何用Excel画图?

InfoQ IT百科

TASKCTL 用户权限操作设置

TASKCTL

DevOps 分布式 敏捷开发 ETL系统 自动化运维

java高级用法之:绑定CPU的线程Thread-Affinity

程序那些事

Java Netty 程序那些事 4月月更

6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈

MASA技术团队

C# .net 测试 压测 测试工具

浅析mysql性能优化

乌龟哥哥

4月月更

24小时自助洗车设备厂家哪家好?

共享电单车厂家

自助洗车机厂家 24小时自助洗车 自助洗车机设备

电脑上微信聊天记录的默认保存路径是在哪里?

InfoQ IT百科

自助洗车加盟!自助洗车品牌大全

共享电单车厂家

自助洗车加盟 自助洗车品牌

怎么转换视频的格式?

InfoQ IT百科

深入浅出 Zookeeper 中的 ZAB 协议

悟空聊架构

zookeeper ZAB 4月日更 悟空聊架构 4月月更

自助洗车机加盟项目要怎么加盟

共享电单车厂家

自助洗车加盟 自助洗车机项目

TASKCTL 调度平台服务节点管理

TASKCTL

DevOps 分布式 自动化部署 Kafka ETL TASKCTL

百万奖金,首届船海数据智能应用创新大赛正式开赛

科技热闻

活动报名 | 如何基于开源项目 Tapdata PDK,快速完成数据源和目标的开发?

tapdata

数据库

限时好礼 | MongoDB又有新书籍出炉啦!

MongoDB中文社区

mongodb

png、jpg这两种图片格式有什么不同?

InfoQ IT百科

如何使用hardhat进行合约uups模式升级

BSN研习社

区块链

如何发起 MQTT 亿级连接和千万消息吞吐性能测试

阿里巴巴云原生

常见的杀毒软件有哪些?

InfoQ IT百科

在 Amazon QuickSight 中使用 Athena 数据连接器可视化 DynamoDB 数据

亚马逊云科技 (Amazon Web Services)

DevOps 亚马逊云科技 career tutorial

将node项目部署到云服务器详细教程

CRMEB

怎么添加或删除电脑上的应用软件呢?

InfoQ IT百科

深挖房地产行业数智化转型升级价值,推动地产管理革新

数商云

产业互联网 数字化转型 企业数字化

百万奖金,首届船海数据智能应用创新大赛正式开赛

科技热闻

淘宝小程序体验优化:数据分析和优化实践

阿里巴巴终端技术

小程序 数据分析 体验优化 性能模型

如何将PDF转换成Word?

InfoQ IT百科

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