首先来看一下什么是机器学习,这个之前已经看过很多概念上的了.
因为之前我们已经说过很多机器学习的概念了。
现在说的这个是使用Java来进行机器学习模型训练的一个框架。
上面有个网址,这个网址就是这个机器学习框架的网址的文档。这个机器学习框架的名字叫DJL
可以看到上面是关于DJL的介绍。
Deep Java Libray
然后来看一看什么是深度学习。
这个之前的博文也介绍了很多了。
然后再来看一看深度学习使用的神经网络是如何运作的?
可以看到它就是由输入层,还有中间的隐藏层以及输出层组成。
输入层就是将数据输入隐藏层,就是有隐藏的很多神经网络的算法层。输出层就是输出结果。
然后我们来看一下深度学习模型的训练的生命周期。
可以看到首先要获取数据,然后清洗并准备数据,然后再生成模型,然后再来评估模型,然后部署模型,然后就可以从模型中获得预测或者推理了。
这个是模型的训练过程。
我们要使用DJL进行训练模型,也需要经历这样的一个过程。
可以看到经历这个过程以后最终会我们得到一个经过训练的模型,也就是机器学习的模型,拿到这个模型我们就可以在输入数据以后会得到预测值。
这些模型我们就可以用来处理分类问题,以线性问题和非线性问题。
比如说我们要做一个以图搜物的功能。
1.这样的话首先我们要去网站或者找到商品的图片以及每个图片,它的标签是什么,也就是准备数据的过程,
2.然后我们就开始去定义神经网络,定义多层神经网络来进行训练,
3.然后我们就可以把训练后的这个模型进行部署,
4.最后我们就可以输入一堆的数据,这个里面就是输入n维的向量,这个其实就是对已有的数据进行编码以后的数字表示,
比如我们可以将图片视频音频文本进行编码生成向量。
上面的图片就是这个模型的工作过程可以看到,假如我们输入一张图片,经过了这个模型以后,就会产生一个预测值。
然后我们再来看一看神经网络的结构,所谓的神经网络也叫做多层感知机m2p。它是一种前向型的人工神经网络。
MLP主要用于解决分类和回归问题。
MLP就包含输入层隐藏层以及输出层。
1.可以看到这里对于分类任务来说,输出层的神经元数量通常等于类别的数量。就是有几个类别,输出层的神经元就有几个,这里使用的激活函数是soft max。
2.对于回归任务来说,输出层的神经元数量通常为1,也就是使用线性激活函数。用来解决回归问题。
我们再来看mlp的工作原理,可以分为前向传播和反向传播。
1.前向传播就是输入数据,从输入层传递到输出层。
2.反向传播就是输入数据,从输出存在传递到输入层,其实就是通过计算出损失,然后将损失传导到输入层。
给我们的模型去进行自我调整以调整我们的模型参数使得模型在进行预测的时候可以减小损失。
将损失变得更小。也就是提高我们模型的精度。这个就是反向传播的作用。
然后我们再来理解一下MLP多层感知机。如果简单的理解,可以把它理解成一种线性的模型。
1.其实每一个神经元就相当于一个线性函数,然后。多个线性函数组成了一个隐藏层,当然这种隐藏层可以有多层
2.每个隐藏层每一个线性函数都有自己的权重。所谓的反向前传播,就是将得到的损失传播到输入层,然后根据计算出来的损失,
根据损失,一步步去调整函数中的权重。从而让损失变得更小。通过这种反向传播的方式来一步步提高模型的精度。
上面写了其实就是对应了这个线性函数的公式。
这个其实就是深度学习神经网络的公式,然后不同的深度学习。算法有自己的激活函数,以用来调整,模型预测的结果.
对于每种激活函数都是有什么作用以及它具体的原理之前我们的波纹中有详细的说明。
然后再来看一下上面这个图。就是把我们的神经网络算法和人类的真实神经网络进行对比。
看到上面这个结构。
上面是DJL的简单介绍。
可以看到DJL它的架构,
1.图最底层是硬件层使用cpu或者是gpu来进行运算训练模型,
2.然后中间是平台层是这个平台层就是帮我们把神经网络算法,以及深度学习算法,机器学习各个算法导入进来,
比如这里的MXNet以及其他的比如PyTroch等等。
3.在往上就是DJL层就是。使用Java来进行深度学习训练的这样一层,
4.再往上就是Java应用层,用于来调用DJL以实现模型训练.。
嗯
以上的基础内容说完了以后,我们开始来创建一个项目来实际的进行开发一下。
可以看到上面我们新创建的一个项目,里面用了jdk17。
然后我们选中LomBok和spring web这两个选项。把这两个插件导入进来。
我们再来去看一下,需要导入的依赖。
首先我们看一下这里我们要引入DJL的版本是0.26.0。
可以看到上面是需要引入的一些依赖。
然后在这个依赖管理这个部分需要引入DJL的bom。
其实对于具体可以引入哪一些依赖,
可以在这个地方按着ctrl键,然后点击进去查看。
点击进去查看以后可以看到这里面有很多的djl的依赖可以引入,
但是这里我们只需要引入我们现在需要的就可以了,也就是上面列出的那些依赖。
然后我们再来看一下这里需要导入的DJL的一些依赖包。
比如上面有api这个包。
还有各种模型model-zoo这个包。等等。
还有MXNet深度学习算法包
还有opencv视觉识别包等.
然后让我们首先来认识一下DJL中的数据类型,
DJL中定义了NDArray这个数据类型来定义多维的向量。
我们可以去新建一个DJLTest的类,
然后建一个test01方法,然后在这个方法中我们使用 NDManager来进行创建一个NDArray变量。
这里要注意在DJL中。内存管理等等都需要自己来做,所以这里创建数据类型也需要使用
NDManager来进行创建。
比如这里的NDArray就不受JVM的堆内存管理,所以这里需要使用NDManager自己管理