飞天发布时刻:2024年 Forrester 公有云平台Wave™评估报告解读 了解详情
写点什么

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

2022-08-05 09:412854

评论

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

Louvain算法在反作弊上的应用

百度Geek说

大数据 算法

小企业自动化运维管理用什么软件好?有便宜的吗?

行云管家

IT运维 行云管家 自动化运维 小企业

重磅发布!阿里云全链路数据湖开发治理解决方案

阿里云大数据AI技术

大数据 阿里云 数据湖 数据分析

秒验丨使用简介与应用创建

MobTech袤博科技

android iOS SDK 秒验

MySql主从同步介绍

京东科技开发者

MySQL 数据库 主从同步

干货!XDR产品安全检测体系如何更好的落地?

极盾科技

网络安全 安全 信息安全 数据安全 xdr

跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算

华为云开发者联盟

人工智能 图像处理 图像 三维

教你如何轻松实现多队伍排队管理【必看】

天天预约

微信小程序 排队 排队工具 #SaaS应用

程序员常用的IDE工具,你了解哪些?

Speedoooo

小程序 ide 开发者工具 前端开发工具

极盾·析策,XDR的正确打开方式

极盾科技

网络安全 安全 数据安全 xdr

传媒数字化转型思考:小程序是音视频内容的更优载体技术

Speedoooo

小程序 数字化转型 小程序生态 传媒

张宏江谈AI创业:人工智能亟需工程化,创业者大有可为

硬科技星球

用小程序打造超级App,助力社交电商扩大“留量池”

Speedoooo

小程序 社交电商 超级app 用户留存

什么是IP 欺骗以及如何防范?

郑州埃文科技

网络安全 IP

基于DevCloud进行黑白棋实时对战游戏开发实践

科技怪咖

Android进阶(十七)Android 布局

No Silver Bullet

android android布局 8月月更

带你玩转“超大杯”ECS特性及实验踩坑

科技怪咖

火热与争议并行,XDR路在何方?

极盾科技

网络安全 安全 信息安全 数据安全 xdr

企业实践|基于软件研运一体化DevOps平台的应用解析

云智慧AIOps社区

DevOps 自动化 敏捷开发 研发管理 代码托管

SpringBoot进阶(叁):Spring Boot启动过程分析

No Silver Bullet

spring-boot 8月月更

推荐 | 移动开发主流热更新技术

Speedoooo

小程序 APP开发 热更新

让GitHub炸锅的深入理解MySQL实战手册,竟出自阿里云“藏经阁”

冉然学Java

Java MySQL 高可用 阿里 构架

CSDN 加入星策开源社区,携手推动企业智能化转型建设

星策开源社区

企业转型 智能化 CSDN

湖南省株洲市有等保测评机构吗?咨询电话多少?

行云管家

网络安全 等保测评 等级测评 株洲

数字人民币如何影响传统支付?支付厂商数字人民币应用案例征集

易观分析

金融 数字人民币 传统支付

ARMS助力羽如贸易打造全链路可观测最佳实践

阿里巴巴中间件

阿里云 云原生 可观测 Arms 客户案例

技术分享| 应急指挥调度平台需要这些技术支撑

anyRTC开发者

音视频 快对讲 语音对讲 调度系统 视频对讲

使用 HTML、CSS 和 JavaScript 的简单模拟时钟

海拥(haiyong.site)

开源 8月月更

直播系统源码——重视哪些功能的开发?

开源直播系统源码

软件开发 直播系统源码 直播功能

汉诺塔(递归+ 非递归版)

Five

算法题 8月月更

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