数据科学

KotlinDL 0.3是与ONNX集成,对象检测API, ModelHub 20+新模型,和许多新层

引入0.3版的深度学习库,科特林德尔

KotlinDL 0.3现在可在Maven Central具有多种新功能–查看新版本中的所有更改!我们目前在ModelHub中引入了很多新模型(包括第一个目标检测和面部对齐模型),从Keras和PyTorch以ONNX格式保存的图像识别模型的微调能力,用于图像识别的实验性高级Kotlin API,社区成员贡献了许多新层和许多其他变化。

GitHub上的KotlinDL

在这篇文章中,我们将带你了解Kotlin深度学习库在0.3版本中的变化:

  1. ONNX集成
  2. ONNX模型的微调
  3. ModelHub:支持DenseNet、Inception和NasNet模型族
  4. 基于SSD模型的目标检测
  5. 使用SoundNet架构进行声音分类
  6. 用于图像识别的实验性高级API
  7. 23个新的层,6个新的激活函数,和2个新的初始化器
  8. 如何添加KotlinDL到您的项目
  9. 了解更多并分享你的反馈

ONNX集成

在过去的一年中,库用户一直要求我们添加对使用以ONNX格式保存的模型的支持。

Open Neural Network Exchange (ONNX)是一种用于人工智能模型的开源格式。它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型的定义。它与当今最流行的两个框架TensorFlow和PyTorch都能很好地工作。

我们使用ONNX运行时javaapi解析和执行以“.onnx”文件格式保存的模型。您可以在文档的项目。

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

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

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

如果模型有非常复杂的输出,例如一些张量,如YOLOv4或SSD(也可以从ModelHub加载),您可能想调用预测图方法:

以获得对所有输出的访问并手动解析输出。

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

ONNX模型的微调

当然,在现成的模型上进行预测是很好的,但如果为我们的任务稍微调整一下它们呢?

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

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

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

我们已经在我们的库中实现了这种方法,它有一个ONNX模型作为预处理阶段,一个顶级模型作为一个小型KotlinDL神经网络。

假设你在Keras或PyTorch中有一个巨大的模型,你想在KotlinDL中进行微调:截断它的最后一层,导出到ONNX格式,通过以下方式加载到KotlinDL作为额外的预处理层ONNXModelPreprocessor,使用KotlinDL API描述缺失的层,并对其进行训练。

图1所示。ONNX模型的微调。

在下面的示例中,我们从ONNXModelHub并微调它来分类猫和狗(使用嵌入式的dogs -vs- cats数据集):

顶级模特它是最简单的神经网络,由于参数少,可以快速训练。

可以找到完整的例子在这里

注意:由于没有用于从以ONNX格式保存的模型中剪切层和权重的API,因此在导出到ONNX格式之前,您需要自己执行这些操作。我们将向ModelHub添加许多Pyrotch和Keras在0.4版本中以这种方式准备的模型。

ModelHub:支持DenseNet、Inception和NasNet模型族

在0.2版本中,KotlinDL添加了模型存储,可以从JetBrains S3存储加载并缓存在磁盘上。我们首先将其命名为ModelZoo,并将其重命名为ModelHub。

ModelHub包含一组深度学习模型,这些模型在大型数据集(如ImageNet可可

目前有两个ModelHubs:基本的TFModelHub,可在`原料药`模块,以及附加的ONNXModelHub,可在“onnx”模块。

图2。ModelHub类的层次结构。

TFModelHub目前支持以下型号:

  • VGG'16
  • VGG'19
  • ResNet18
  • ResNet34
  • ResNet50
  • ResNet101
  • ResNet152
  • ResNet50v2
  • ResNet101v2
  • ResNet152v2
  • 美孚利
  • MobileNetv2
  • 开端
  • Xception
  • 登塞内特121
  • DenseNet169
  • DenseNet201
  • NASNetMobile
  • NASNetLarge

ONNXModelHub目前支持以下型号:

  • 个人简历
    • Lenet
    • ResNet18
    • ResNet34
    • ResNet50
    • ResNet101
    • ResNet152
    • ResNet50v2
    • ResNet101v2
    • ResNet152v2
  • ObjectDetection
    • 固态硬盘
  • 面对齐
    • Fan2d106

所有型号都在TFModelHub包括模型配置和模型权重的特殊加载程序,以及在计算机上训练模型时应用的特殊数据预处理功能ImageNet数据集

下面是一个例子,你可以使用其中一个模型,ResNet50,进行预测:

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

笔记:不要忘记对新数据应用特定于模型的预处理。所有预处理函数都包含在ModelHub中,可以通过预处理输入功能:

一个完整的例子,如何使用ResNet ' 50进行预测和迁移学习与自定义数据集的额外训练,可以在本教程

注意:当使用ONNX模型时,您不必单独加载权重(参见上面的ONNX集成部分)。

基于SSD模型的目标检测

在v0.3之前,我们的ModelHub包含适合解决图像识别问题的模型。但是从这个版本开始,我们逐渐扩展了库处理图像的能力。我们想向您介绍单激发多盒探测器(SSD)模型,能够解决目标检测问题。

图3.带SSD检测器的卷积神经网络结构(从…起

对象检测是检测图像中特定类的对象实例的任务。

SSD模型训练在可可数据集,它由328000张图像组成,每个图像都有边界框和80个对象类别的每个实例分割遮罩。该模型可用于目标检测的实时预测。

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

目标检测结果绘制在一个摆动面板上;图像预处理用于SSD输入。

图4。目标检测通过ObjectDetection API。

著名的YOLOv4型号也在ONNXModelHub.但是,我们还没有添加YOLOv4输出的后处理因为有些操作在多克库(类似于NumPy的Kotlin)。我们正在寻找来自社区的贡献,所以请不要犹豫加入我们的努力!

注意:当然,您可以加载标准API来加载模型,并调用predictRaw方法来手动处理结果,但我们建议避免这些困难

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

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

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

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

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

这是面向核心后端工程师的实验性API,对于他们来说,模型就是一个带有入口和出口的黑盒。我们很想听听你的经验和想法。

使用SoundNet架构进行声音分类

KotlinDL库在音频领域迈出了第一步。此版本添加了构建类似于SoundNet的模型所需的几个层,如Conv1D、maxpoolg1d、croping1d、UpSampling1D以及其他带有“1D”后缀的层。

受SoundNet模型架构的启发,让我们构建一个玩具神经网络:

这是一个CNN,只使用1D部分的卷积和最大池的输入声音数据。该网络对FSDD的测试数据在10个纪元后的准确率约为55%,在100个纪元后的准确率约为85%。

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

当模型准备好了,我们可以加载自由语音数字数据集(FSDD)和训练模型。FSDD数据集是一个简单的音频/语音数据集,由8khz .wav文件中的语音数字录音组成。

图5。WavFile可视化(从FSDD随机采样)。

经过训练的模型将正确地从录音为。wav文件的声音中识别出数字。用我们的玩具SoundNet模型来训练你的发音吧!

可以找到示例的完整代码在这里

23个新的层,6个新的激活函数,和2个新的初始化器

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

两个新的初始值设定项:

以及六个新的激活功能:

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

在下一个版本中,我们将使用克拉斯目前的岩层此外,也许还可以进一步添加几个最新模型的SOTA实现中的流行层,这些模型尚未包含在主要的Keras发行版中。

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

如何添加KotlinDL到您的项目

要在项目中使用KotlinDL的全部功能(包括' onnx '和' visualization '模块),请将以下依赖项添加到您的build.gradle文件:

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

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

了解更多并分享你的反馈

我们希望你喜欢这篇简短的KotlinDL 0.3新特性概述!查阅更多资料,包括最新资料自述文件,参观该项目的家GitHub.一定要看看KotlinDL指南,其中包含了关于库的基本和高级特性的详细信息,并更详细地涵盖了这篇博客文章中提到的许多主题。

如果您以前使用过KotlinDL,请使用更新日志了解什么发生了变化以及如何将您的项目升级到稳定版本。

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

我们也欢迎您的加入#科特林德尔海峡在Kotlin Slack(获得邀请在这里).在此频道中,您可以提问、参与讨论,并在ModelHub中获得关于新的预览版本和模型的通知。

芬兰湾的科特林吧!

发现更多