1. 磐创AI首页
  2. Medium

KotlinDL 0.3

介绍我们的深度学习库KotlinDL的0.3版。KotlinDL

KotlinDL 0.3现已在Maven Central上提供,其中包含各种新功能–请查看新版本即将进行的所有更改!我们目前在ModelHub中引入了许多新模型(包括第一个对象检测和人脸对齐模型),能够微调Kera和PyTorch以ONNX格式保存的图像识别模型,用于图像识别的实验性高级Kotlin API,许多由社区成员贡献的新层,以及许多其他变化。Maven Central changes

在这篇文章中,我们将带您了解0.3版中对Kotlin Deep Learning库的更改:

ONNX集成

在过去的一年里,图书馆用户一直要求我们增加对使用以ONNX格式保存的模型的支持。

开放神经网络交换(ONNX)是AI模型的开源格式。它定义了一个可扩展的计算图模型,并定义了内置运算符和标准数据类型。它与当今最流行的两个框架TensorFlow和PyTorch都能很好地协同工作。

我们使用ONNX Runtime Java API来解析和执行以`.onnx`文件格式保存的模型。您可以在项目文档中阅读有关此API的更多信息。ONNX Runtime Java API documentation

KotlinDL有一个单独的`onnx`模块,提供ONNX集成支持。若要在项目中使用它,应添加不同的依赖项。dependency

有两种方法可以在ONNX模型上运行预测。如果您想使用我们的ModelHub模型之一LeNet-5,您可以通过以下方式加载它:

要加载ONNX格式的模型,请实例化OnnxInferenceModel并运行预测。

如果模型具有非常复杂的输出,例如,像YOLOv4或SSD(也可以从ModelHub加载)这样的几个张量,您可能需要调用recrectRaw方法:

访问所有输出并手动解析输出。

在ONNXModelHub中找到合适的模型很容易:只需从顶级对象ONNXModels开始搜索,然后深入到CV或ObjectDetection。使用此内部对象链(如唯一的模型标识符)来获取模型本身或其预处理方法。例如,可以通过以下ONNXModels.CV.EfficientNet4Lite找到2020年图像识别任务的SOTA模型,称为EfficientNet。

ONNX模型的微调

当然,在现成的模型上运行预测是很好的,但是针对我们的任务稍微微调一下怎么样?

遗憾的是,ONNX Java API不支持模型的培训模式,但我们不需要将整个模型作为一个整体进行培训来执行迁移学习任务。

传输学习任务的经典方法是冻结除最后几层之外的所有层,然后根据新数据训练最上面的几层(网络顶部的完全连接层),通常会改变模型输出的数量。

这些顶层可以看作是一个小的神经网络,其输入是由冻结层组成的模型的输出。这些冻结层可以看作是一个小顶层模型的预处理。

我们已经在我们的图书馆中实现了这种方法,其中ONNX模型作为预处理阶段,顶层模型作为一个小的KotlinDL神经网络。

假设您在Kera或PyTorch中有一个要在KotlinDL中微调的大型模型:从其中剪切最后一层,导出为ONNX格式,通过ONNXModelPreProcessor将其作为附加预处理层加载到KotlinDL中,使用KotlinDL API描述缺少的层,然后对其进行训练。

在下面的示例中,我们从ONNXModelHub加载ResNet50模型,并对其进行微调以对猫和狗进行分类(使用嵌入的Dog-VS-Cats数据集):

TOPMODEL是最简单的神经网络,参数少,训练速度快。

完整的示例可以在这里找到。here

ModelHub:支持DenseNet、Inception和Nasnet模型系列

在0.2版本中,KotlinDL增加了模型存储,这些模型可以从JetBrains S3存储中加载并缓存到磁盘上。我们最初将其命名为ModelZoo,后来将其重命名为ModelHub。

ModelHub包含深度学习模型的集合,这些模型在像ImageNet或CoCo这样的大型数据集上经过预先训练。ImageNet COCO

目前有两个ModelHub:一个是基本的TFModelHub,位于`api`模块中;另一个是ONNXModelHub,位于`onnx`模块中。

TFModelHub目前支持以下型号:

  • VGG‘16
  • VGG‘19
  • ResNet18
  • ResNet34
  • ResNet50
  • ResNet101
  • ResNet152
  • ResNet50v2
  • ResNet152v2
  • 移动网络
  • MobileNetv2
  • 开始
  • 例外情况
  • DenseNet121
  • DenseNet169
  • DenseNet201
  • NASNetMobile
  • NASNetLarge

CV

  • 列奈
  • ResNet18
  • ResNet34
  • ResNet50
  • ResNet152v2
  • 高效Net4Lite

对象检测

  • 固态硬盘

面对齐

  • 风扇2d106

TFModelHub中的所有模型都包括模型配置和模型权重的特殊加载器,以及在ImageNet数据集上训练模型时应用的特殊数据预处理功能。ImageNet dataset

下面是一个如何使用其中一个模型ResNet50进行预测的示例:

现在您已经有了一个模型和权重,您可以在KotlinDL中使用它们。

在本教程中可以找到一个完整的示例,说明如何使用ResNet‘50进行预测和转移学习,并对自定义数据集进行额外的训练。this tutorial

使用SSD模型的目标检测

在0.3版之前,我们的ModelHub包含适合解决图像识别问题的模型。但是从这个版本开始,我们正在逐步扩展该库处理图像的功能。我们向您介绍一种能够解决目标检测问题的单镜头多盒探测器(SSD)模型。Single Shot MultiBox Detector (SSD)

目标检测是检测图像中某类目标的实例的任务。

SSD模型在COCO数据集上进行训练,该数据集由328,000幅图像组成,每幅图像都有80个对象类别的边界框和每个实例的分割掩码。该模型可用于实时预测检测目标。COCO dataset

我们设计了一个用于目标检测的API,它隐藏了图像后处理和预处理的细节。

目标检测的结果绘制在Swing面板上;图像经过预处理以用于SSD输入。

著名的YOLOv4模型也可以在ONNXModelHub中使用。但是,我们没有添加YOLOv4输出的后处理,因为Multik库(NumPy的Kotlin模拟)中缺少一些操作。我们正在寻求来自社区的贡献,所以请不要犹豫加入我们的努力!postprocessing of YOLOv4 output Multik

用于图像识别的实验性高级API

通过ObjectDetection任务,我们提供了一个简化的预测API。同样,通过图像识别任务,我们可以通过对用户隐藏图像预处理、编译和模型初始化来简化与从ModelHub加载的模型的交互。

为了说明这是如何工作的,让我们在磁盘上加载并存储特定类型ImageRecognitionModel的预先训练的模型。这种类型的模型不能进行额外的训练-它们只能做出预测。另一方面,他们非常容易合作。

使用预先训练的模型的语法使用方括号,这很好。

ImageRecognitionModel具有立即返回人类可读标签并接受图像文件作为输入的方法。

这是一个针对核心后端工程师的实验性API,对他们来说,模型是一个有入口和出口的黑匣子。我们很想听听您使用此方法的经验和想法。

使用SoundNet架构进行声音分类

KotlinDL库正在音频域迈出第一步。此版本添加了构建SoundNet模型所需的几个层,如Conv1D、MaxPooling1D、Cropping1D、UpSsaming1D和其他带有“1D”后缀的层。

让我们根据SoundNet模型的体系结构构建一个玩具神经网络:

这是一个CNN,它只使用一维部件来卷积和最大限度地合并输入的声音数据。对于FSDD的测试数据,该网络在10个历元之后能够达到大约55%的准确率,在100个历元之后能够达到大约85%的准确率。

SoundBlock由两个Conv1D层和一个MaxPool1D层组成,非常简单:

当模型准备好时,我们可以加载自由说话数字数据集(FSDD)并训练模型。FSDD数据集是一个简单的音频/语音数据集,由8 kHz的.wav文件中的语音数字录音组成。Free Spoken Digits Dataset

经过训练的模型将正确识别录制为.wav文件的声音中的数字。欢迎使用我们的玩具SoundNet模型来训练您的发音!

示例的完整代码可以在此处找到。here

23个新的层、6个新的激活函数和2个新的初始值设定项

此版本的许多贡献者都在Kotlin中添加了用于执行重要逻辑的层。有了这些添加的层,您可以开始使用神经网络,这些神经网络不仅可以处理照片,还可以处理声音、视频和3D图像:

  • Softmax激活层(D.Lowl)
  • LeakyReLU激活层(Masoud Kazemi著)
  • PReLU激活层(Masoud Kazemi著)
  • ELU激活层(Maciej Procyk著)
  • ThresholdedReLU激活层(Masoud Kazemi著)
  • Conv1D Layer(Maciej Procyk著)
  • MaxPooling1D图层(Masoud Kazemi著)
  • GlobalAveragePooling1D层(Ansh Tyagi著)
  • Conv3D Layer(Maciej Procyk著)
  • MaxPooling3D图层(作者:Ansh Tyagi)
  • AveragePooling3D图层(Masoud Kazemi著)
  • GlobalAveragePooling3D图层(作者:Ansh Tyagi)
  • GlobalMaxPool3D图层(Masoud Kazemi著)
  • 裁剪一维和三维图层(Masoud Kazemi著)
  • 置换层(Ansh Tyagi著)
  • RepeatVector Layer(斯坦·范德本德著)
  • UpSsaming1D、UpSsaming2D和UpSsaming3D图层(Masoud Kazemi著)
  • 身份初始值设定项(Hauke Brammer著)
  • 正交初始化器(Ansh Tyagi著)

和六个新的激活功能:

  • Gelu激活函数(Ansh Tyagi编写)
  • HardShrink激活功能(Ansh Tyagi编写)
  • Lisht激活功能(Veniamin Viflyantsev)
  • MISH激活功能(由Xa9aXツ提供)
  • 蛇激活函数(CagriyildirimR)
  • TanhShrink激活功能(由Femi Alaka提供)

这些激活函数在TensorFlow核心包中不可用,但是我们决定添加它们,看看它们是如何在最近的文章中被广泛使用的。

在下一个版本中,我们将实现与Kera中当前层集合的层奇偶校验,并可能进一步添加最近型号的SOTA实现中尚未包含在主Kera发行版中的几个受欢迎的层。current set of layers in Keras

如果您想从最近的论文中贡献一个层、激活函数、回调或初始化式,我们将很高兴看到您的Pull请求!

如何将KotlinDL添加到项目中

要在您的工程中使用KotlinDL的全部功能(包括`onnx`和`visual alization`模块),请在build.gradle文件中添加以下依赖项:

或者,如果您不需要ONNX和可视化,请仅添加一个依赖项:

您还可以在任何现有的Java项目中利用KotlinDL的功能,即使其中还没有任何其他Kotlin代码。下面是一个完全用Java编写的LeNet-5模型示例。Here

了解更多信息并分享您的反馈

我们希望您喜欢这篇关于KotlinDL 0.3中新功能的简要概述!有关更多信息,包括最新的自述文件,请访问GitHub上的项目主页。请务必查看KotlinDL指南,其中包含有关库的基本和高级功能的详细信息,并更详细地涵盖了本文中提到的许多主题。Readme file GitHub guide

如果您以前使用过KotlinDL,请使用ChangeLog找出发生了哪些更改,以及如何将您的项目升级到稳定版本。changelog

如果您能将您发现的任何错误报告给我们的问题跟踪器,我们将非常感激。我们将尝试修复0.3.1版本中的所有关键问题。

我们也欢迎您加入科特林松弛的#kotlindl频道(在这里获得邀请)。在此频道中,您可以在ModelHub中提出问题、参与讨论并获得有关新的预览版本和模型的通知。#kotlindl channel here

我们走吧,科特林!

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/09/28/kotlindl-0-3/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息