深度学习

理解和使用深度学习网络

从TensorFlow, PyTorch和ONNX导入模型

以下文章来自Sivylla Paraskevopoulou、高级技术作家和大卫·威林汉,深度学习工具箱的产品经理。
如何导入在TensorFlow™或PyTorch™中创建的模型并将其转换为MATLAB代码?

首先,请记住,在MATLAB中使用深度学习模型有不同的选项。
  1. 使用MATLAB深度学习工具箱创建的模型
  2. 从其他框架转换到MATLAB
  3. 与MATLAB共同执行来自其他框架的模型
这篇博文的重点是选项2,但您可以看到在这3个选项之间进行选择的好处这个对照表,并查看所有可用的模型,直接导入到MATLAB中使用MATLAB深度学习模型枢纽
转换一个模型有多复杂?在许多情况下,这是相当直接的。在其他情况下,在成功地将第三方模型转换为MATLAB之前,可能还需要一些额外的步骤。这篇博客的目的是为如何操作这些步骤提供指导。
以下是我们今天要讲的内容:
按照这篇文章的步骤,并在这里下载代码:https://github.com/matlab-deep-learning/Image-Classification-in-MATLAB-Using-Converted-TensorFlow-Model

导入TensorFlow模型

需要注意的是,有两个不同版本的TensorFlow模型可以导入:
  • TensorFlow 2.0,其中使用SavedModel格式
  • TensorFlow 1.0,其中使用HDF5格式
(TensorFlow 2.0同金宝app时支持HDF5和SavedModel格式,但推荐使用SavedModel格式。)
你在MATLAB中的工作流程将依赖于保存模型的TensorFlow版本。

使用SavedModel格式导入TensorFlow模型
当TensorFlow 2.0可用时(2019年9月)SavedModel格式被引入,现在是保存预训练模型的首选方法。下面是导入模型格式的代码。
使用tf.keras.applications.resnet_v2.ResNet50V2实例化ResNet50V2模型。
ResNet50V2模型使用来自ImageNet数据库的图像进行训练。从SqueezeNet获取类名,它也是用ImageNet图像训练的。
挤压板=挤压板;ClassNames = squeezeNet.Layers(end).Classes;
方法导入SavedModel格式的ResNet50V2importTensorFlowNetwork函数。
net = importTensorFlowNetwork("ResNet50V2",…OutputLayerType =“分类”,…类=类名)
方法导入TensorFlow模型 HDF5 (Keras)格式
导入HDF5格式的ResNet50V2importKerasNetwork函数。
net = importKerasNetwork("ResNet50V2.h5",…OutputLayerType =“分类”,…类=类名)
该软件抛出一个关于导入模型的Keras版本的警告。在每个导入和导出函数的文档页中,都有一个限制部分,其中描述了所支持的TensorFlow或ONNX™版本。金宝app例如,请参见importTensorFlowNetwork的限制
提示:即使你可以成功导入ResNet50V2importKerasNetwork而且importTensorFlowNetwork,我建议使用importTensorFlowNetwork.当试图导入一个更复杂的模型,其中的层不支持转换为内置的MATLAB层时,出现这种情况的原因就很明显了,如下一节所示。金宝app

导入更复杂的TensorFlow模型

本节将展示如何导入TensorFlow模型PNASNetLargeV4与ResNet50V2不同,它包含一个复杂的特征向量层。此层不能直接转换为内置的MATLAB层,因此需要一个自定义层。好消息是MATLAB将为您自动生成自定义层
要获得PNASNetLargeV4模型,请在Python®中运行此代码。您可以在这里找到代码https://tfhub.dev/google/imagenet/pnasnet_large/feature_vector/4
导入tensorflow作为tf导入tensorflow_hub作为hub model = tf.keras。Sequential([hub.KerasLayer("https://tfhub.dev/google/imagenet/pnasnet_large/feature_vector/4", trainable=True), tf.keras.layers。稠密(1000,激活='softmax')])模型。build([None, 331, 331, 3])
PNASNetLargeV4模型使用ImageNet数据库中的图像进行训练。
使用 HDF5 (Keras)格式(不推荐)
当您导入PNASNetLargeV4时,该软件无法将一些TensorFlow层转换为等效的内置MATLAB层。
方法导入HDF5格式的模型importKerasNetwork函数。
net = importKerasNetwork("PNASNetLargeV4.h5",…OutputLayerType =“分类”,…类=类名)
错误消息建议使用importKerasLayers导入网络架构。importKerasLayers将模型导入为带有占位符层的层图。您必须手动替换占位符层以使用网络进行预测或重新训练网络。可以将占位符层替换为手写层(文档示例:从预训练的Keras层组装网络)或函数层(文档示例:将不支持的Keras层替换为功能层金宝app).

使用SavedModel格式导入(推荐)

或者,您可以使用importTensorFlowNetwork函数。它不同于它的Keras等价物,因为它有一个独特的功能;它可以自动生成自定义层.在导入期间,importTensorFlowNetwork生成自定义层,以取代不支持转换为内置MATLAB层的TensorFlow层。金宝app
net = importTensorFlowNetwork("PNASNetLargeV4",…OutputLayerType =“分类”,…类=类名)
提示:检查是否为您生成了自定义层的一个快速方法是检查在导入过程中创建的包。例如,对于PNASNetLargeV4,导入函数生成一个大的自定义层(kKerasLayer2Layer29666.m):

如果没有SavedModel版本的模型,只有HDF5会怎样?

在这种情况下,我建议尝试将TensorFlow模型从HDF5转换为保存的模型格式。在大多数情况下,这是在TensorFlow内部执行转换的方法:
然而,您可能会遇到需要“模型手术”的用例。例如,如果在旧版本中编写了一个不受支持的层金宝app,并且您试图将其保存在新的SavedModel版本中,TensorFlow可能会抛出一个错误,说明它不知道如何转换模型。在这种情况下,你必须做以下其中之一:
  1. 在将模型导入MATLAB之前,手动以更新的TensorFlow SavedModel格式重新编码该层。
  2. 将旧模型导入MATLAB使用importKerasLayers.它将在软件无法导入的自定义层中创建一个占位符层。然后,从MATLAB中手动重新编码该层。
这两个选项都要求你在TensorFlow(选项1)或MATLAB(选项2)中编写层。

导入PyTorch模型

目前,深度学习工具箱不支持直接从PyTorch导入模型;金宝app但是,您可以通过ONNX导入模型。

首先,您需要按照中的说明将PyTorch模型转换为ONNX模型格式从PyTorch导出模型到ONNX.然后,使用将ONNX模型导入到MATLAB中importONNXNetwork.在这里,我们向您展示如何导入挤压板。onnx模型,你也可以在PyTorch模型动物园中找到它。
net = importONNXNetwork("squeezeNet.onnx");
importONNXNetwork函数还可以在软件无法将ONNX操作符转换为等效的内置MATLAB层时生成自定义层。导入shufflenet-9。Onnx模型与自动生成的自定义层。默认情况下,importONNXNetwork返回一个DAGNetwork对象,可以用于预测。
net = importONNXNetwork(" shuffleNet -9.onnx",PackageName="shuffleNet");
importONNXNetwork将自定义图层保存在package +shuffleNet中,在当前文件夹中,类似于importTensorFlowNetwork
方法将训练好的深度学习工具箱网络导出为ONNX模型格式exportONNXNetwork函数。
exportONNXNetwork(净,“myNet.onnx”)

示例:导入用于图像分类的复杂TensorFlow模型

这个例子展示了如何导入预先训练好的SavedModel格式的TensorFlow模型,并使用导入的网络对图像进行分类。TensorFlow模型包含不支持转换为内置MATLAB层的层。金宝app当您导入这些层时,软件会自动生成自定义层。

导入预训练的TensorFlow模型

使用tf.keras.applications.efficientnet_v2.EfficientNetV2L来实例化EfficientV2L模型。
使用来自ImageNet数据库的图像来训练EfficientNetV2L模型。从SqueezeNet获取类名,它也是用ImageNet图像训练的。
挤压板=挤压板;ClassNames = squeezeNet.Layers(end).Classes;
导入SavedModel格式的TensorFlow模型EfficientNetV2LimportTensorFlowNetwork函数。指定图像分类问题的输出层类型。
net = importTensorFlowNetwork("EfficientNetV2L",…OutputLayerType =“分类”,…类=类名);
找到自动生成的自定义层。
PackageName = '+EfficientNetV2L';S = what(['.]\ ' PackageName]);%’Ind = 0(1,长度(s.m));for i = 1:length(net.Layers) for j = 1:length(s.m) if strcmpi(class(net.Layers(i)),[PackageName(2:end)]”。' s.m{j(1:end-2)]) ind(j) = i;结束结束显示(ind)
Ind = 2
显示器(net.Layers(印第安纳州))
分析导入的网络。
analyzeNetwork(净)

正如预期的那样,导入的网络(其中包含自动生成的自定义层)在网络分析器中没有显示警告或错误。这意味着导入的网络可以用于预测。

读取和预处理输入图像

TensorFlow提供了tf.keras.applications.efficientnet_v2.preprocess_input方法预处理图像输入数据的EfficientNetV2L模型。在这里,我们通过调整输入图像的大小、缩放和标准化来复制输入预处理。
读取要分类的图像并显示图像的大小。图像是792 × 1056像素,有三个颜色通道(RGB)。
Im = imread("peacock.jpg");大小(Im)
将图像大小调整为网络的输入大小。
InputSize = net.Layers(1).InputSize;Im = imresize(Im,InputSize(1:2));
对EfficientNetV2L的输入需要进一步的预处理。重新缩放图像。通过减去训练图像的均值,再除以训练图像的标准差,对图像进行归一化。要查找应该使用的值,请参见https://github.com/keras-team/keras-applications/blob/master/keras_applications/imagenet_utils.py
ImProcessed = rescale(Im,0,1);meanIm = [0.485 0.456 0.406];stdIm = [0.229 0.224 0.225];ImProcessed = (ImProcessed-重塑(meanIm,[1 1 3]))。/重塑(stdIm,[1 1 3]);

利用导入的网络对图像进行分类

使用导入的网络对图像进行分类。显示带有分类标签的图像。
标签=分类(net,Im);imshow(Im) title(strcat(“预测标签:”,字符串(标签)))

您还可以使用导入的网络和深度学习工具箱的预测块,在Simulink中对图像进行分类。金宝app举个例子,请看之前的文章:将TensorFlow模型引入MATLAB.导入的网络包含自动生成的自定义层这一事实并不妨碍在Simulink中建模。金宝app

总结

与深度学习框架(如TensorFlow和PyTorch)的互操作性,使您能够在MATLAB和Simulink中做更多的事情。金宝app它提供了充分利用MATLAB生态系统并将其与开源社区开发的资源集成的灵活性。它还使您能够组合工作流,包括以数据为中心的预处理、模型调优、模型压缩、模型集成和在MATLAB之外开发的模型的自动代码生成。
在MATLAB中使用深度学习模型的能力比较
能力 使用深度学习工具箱 模型转换来自其他框架 Co-Execution
在MATLAB中集成了前后处理
只需要安装产品下载188bet金宝搏
金宝app支持从MATLAB调试
MATLAB和Simulink中的推理性能金宝app
可用的MATLAB应用实例
不需要数据类型转换和数据重新格式化
用于嵌入式代码生成的覆盖范围MATLAB编码器GPU编码器深度学习HDL工具箱
不需要用于独立部署的其他库MATLAB编译器
在一行代码中访问流行的模型
从TensorFlow和PyTorch获取开源模型
大部分支持金宝app
有限的支持金宝app
不支持金宝app

更多关于支持包金宝app

您必须有支持包才能运行深度学金宝app习工具箱中的导入和导出函数。如果没有安装支金宝app持包,每个功能都会在Add-On资源管理器中提供相应支持包的下载链接。推荐的做法是将支持包下载到您正在运行的MATLAB版本的默认位置。金宝app您也可以直接从File Exchange下载支持包。金宝app
表:支持运行导金宝app入和导出函数所需的包。
金宝app支持包 功能
TensorFlow模型的深度学习工具箱转换器 importTensorFlowNetworkimportTensorFlowLayersimportKerasNetworkimportKerasLayers
ONNX模型格式的深度学习工具箱转换器 importONNXNetworkimportONNXLayersimportONNXFunctionexportONNXNetwork
表:可以导入深度学习网络的三种功能的高级特性比较
importTensorFlowNetwork importKerasNetwork importONNXNetwork
金宝app支持TensorFlow ✅* ✅* *
金宝app对PyTorch的支持
金宝app支持自定义层的自动生成
*目前支持TensorF金宝applow 2.0-2.6版本(经过全面测试)。在大多数情况下,保存在较新的TensorFlow版本中的模型也是可以导入的。需要TensorFlow模型的深度学习工具箱转换器
**支金宝app持TensorFlow-Keras最高2.2.4版本,有限支持2.2.5到2.4.0版本。需要TensorFlow模型的深度学习工具箱转换器
支持包中的软件每月更新一次。金宝app这些每月更新可以包括导入和导出的新层支持,更新的TensorFlow和ONNX版本支持,金宝app以及错误修复。主要特性随通用版本一起发布。




发布与MATLAB®R2020b

|
  • 打印
  • 发送电子邮件

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그하거나계정을새로만드십시오。