.NET Core 的应用场景越来越广,开源社区也不断壮大, .NET Core在机器学习领域不断发展ML.NET外,也通过结合Tensorflow.NET去完善ML.NET在深度学习领域的功能,在ML.NET 1.3开始迈出了非常重要的一步。这不仅是微软拥抱开源的策略,也是对SciSharp社区的认可。SciSharp社区不仅有Tensorlow.NET优秀的产品,也有很多对基于Python机器学习/深度学习库的封装,这补充了现阶段ML.NET在发展阶段功能不全的缺陷,也让更成熟的机器学习/深度学习方案应用在.NET Core的生产环境中。今天我会介绍一下Keras.NET并通过Keras.NET做一个图像识别的深度学习训练。
01
PART
什么是Keras?
Keras是一个用Python编写通过Tensorflow、PlaidML以及CNTK作为后端的高层神经网络API。Keras让你用最简单的方式快速完成深度学习(https://keras-cn.readthedocs.io/en/latest/) 。不少人喜欢用Keras进行模型训练。ScipySharp社区也对 Keras通过pythonnet进行了封装(https://github.com/SciSharp/Keras.NET) 。
02
PART
如何用Keras.NET
pythonnet是一个运行基础,它作为一个Python和.NET Core的桥接存在, ScipySharp社区对pythonnet进行了封装和修改。由于开发环境各异,对于pythonnet的引用都略有不同,Windows下使用Python.Runtime.NETStandard / Linux下使用Python.Runtime.Mono / macOS下使用 Python.Runtime.OSX 。补充一点记得设置好Python的环境变量,否则你调用就会出现一堆问题。对于Keras.NET的封装,也依赖于Numpy.NET
(https://github.com/SciSharp/Numpy.NET)。这里有个比较特别的地方,需要下载源码,把Keras.NET/Numpy.NET基于不同平台对应的Python.Runtime版本的包添加重新设置编译,并在本地通过dll直接引用。还有Numpy.NET有两个版本,一个是支持Windows的Numpy , 一个是支持Linux/macOS的Numpy.Bare 使用时候不要搞混了。
03
PART
一个经典的例子
这里做一个猫狗分类的图像分类的示例,这个示例比较经典,也算是一个Keras上的HelloWorld .让我们来看看如何通过Keras.NET来完成。
01
环境
环境,我还是依赖于 JupyterNotebook (如何用JupyterNotebook 支持C#环境, 可以看我之前的文章
(https://blog.csdn.net/kinfey/article/details/96095690),这里提醒需要把Keras.NET, Numpy.NET添加到ICSharpCore项目当中,否则没法使用Keras.NET.
02
创建JupyterNotebook
创建JupyterNotebook , 把项目必要的库进行引用.注意因为我是Linux环境,在Linux环境下是Python 3.6.8,所以我这里对应的是Python.Runtime.Mono 3.6.0(如果你是其他平台其他版本记得要切换好,否则是不能使用的), 还有通过Rosyln把本地编译好的Keras.dll,Numpy.Bare.dll引入。
03
CNN算法定义
CNN算法定义,这个就是佛系了,毕竟这是深度学习的一部分,。CNN, 全名卷积神经网络(Convolutional Neural Network,简称CNN), 是一种前馈神经网络,人工神经元可以相应周围单元,可以进行大型图像处理。
(http://cs231n.github.io/convolutional-networks/)。CNN网络层级由输入层,卷积层,激活层,池化层,全连接FC层共5个部分组成,通过Keras可以很容易完成这5个部分的层级操作。具体看以下代码。
04
数据整理
数据整理,数据分为训练数据,和测试数据,Keras有对图像分类支持的接口ImageDataGenerator。
05
训练和保存模型
训练和保存模型,通过FitGenerator对图像数据进行训练,这里你可以根据实际情况调整训练参数,训练完后可以保存以h5为后续的模型。注意,训练需要时间,如果你有GPU是最好的,否则CPU会花不少时间。
这里要提醒一点,因为ICSharpCore还在改进,训练时产生的状态只能通过去命令行中查阅,所以要看训练效果可以通过命令行看。
06
测试模型
最后展示一个完整的Jupyter Notebook
转型到机器学习/深度学习对不少人来说都需要花很多的时间,但在自己熟悉的环境下学习是提升学习效率的方法。希望SciSharp社区能帮到.NETer。