报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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

评论

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

2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠, 一位需要 付费 的油漆匠

福大大架构师每日一题

福大大架构师每日一题

为何 DevOps 会给开发人员带来压力和倦怠?

不在线第一只蜗牛

架构 DevOps 开发

在智能制造中使用数字孪生的优势

3D建模设计

3D数字孪生 3D数字孪生场景编辑器 3D场布工具 3D场景搭建

使用 Parallels Desktop 彻底改变您的开发和测试工作流程

南屿

Mac虚拟机 Parallels Desktop 18破解 Parallels Desktop 19

JAVA开发工具Eclipse和MyEclipse

小魏写代码

【介绍篇】Supabase与Firebase的关系和区别

张文平

数据库 云服务 Baas Supabase firebase

好用的视频下载和转换器:YT Saver 中文直装版

胖墩儿不胖y

视频处理 Mac软件 视频处理工具

京东商品评论数据接口(JD.item_review)丨京东API接口

tbapi

京东商品评论数据接口 京东商品评价接口 京东商品评论API 京东商品评价API 京东评论API

营销创意素材如何秒级智能生成?即时创意白皮书来了!

京东科技开发者

程序员会不会被人工智能取代?

ZA技术社区

程序员 #人工智能

商智C店H5性能优化实战

京东科技开发者

前端

数字孪生开发:基础知识、类型、优势和成本

3D建模设计

3D数字孪生场景编辑器 3D场布工具 3D场景搭建

Microsoft 365 (原office365) Mac版 v16.80正式破解版下载

南屿

Office Microsoft 365 office许可证 office365破解版

支持M/Intel mac的Netflix 奈飞客户端 v2.13.0激活版

南屿

Netflix Mac激活版 macOS 播放客户端 网飞

强大的数据库管理工具:DBeaver破解版

南屿

数据库 DBeaverEE 破解软件

智能工厂:为制造业的数字化转型奠定基础

3D建模设计

3D场景建模 3D数字孪生场景编辑器 3D场布工具

详述 IntelliJ IDEA 遇到 java -source 1.3 中不支持某某操作的解决方法

南屿

IntelliJ IDEA IntelliJ IDEA 2023最新 IntelliJ IDEA密钥

什么是制造业中的数字孪生?

3D建模设计

3D场景应用 3D场景建模 3D数字孪生场景编辑器 3D场布工具

【原理篇】Supabase应用开发为什么要配置RLS

张文平

权限 PgSQL Supabase 访问权限 Postgrest

【原理篇】Supabase关联查询:内联、外联及外键约束

张文平

外键 Function 关联查询 Supabase Postgrest

Beyond Compare4 for Mac怎么使用?Beyond Compare功能特点详解

南屿

Mac软件 Beyond Compare 4 注册版 Beyond Compare注册码 文件夹比较工具

iOS应用如何签名?使用xcode签名的办法和工具 附xcode14下载安装包

南屿

Xcode Mac版 应用签名 Xcode签名

简单两步,轻松卸载AlDente Pro,来围观~~

南屿

AlDente Pro破解版 AlDente Pro mac mac电池保护 AlDente Pro卸载 苹果电池助手

SD-WAN组网方式详解

Ogcloud

网络 SD-WAN 组网 组网网络

数字孪生技术详解

3D建模设计

3D数字孪生场景编辑器 3D场布工具

SVN客户端 smartsvn mac破解版 附许可文件 兼容M/intel

南屿

svn Mac软件 SmartSVN mac破解版 SmartSVN下载

macOS 14 Sonoma(最新MacOS系统) pkg完整安装包 14.2正式版

南屿

苹果系统下载 macOS 14 Sonoma

技术文档指南:版本说明、网站文案、FAQ、案例研究与内容优化

小万哥

程序人生 软件工程 后端开发 技术写作 文档指南

2024你好!

鲸品堂

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