主要内容

加载预训练网络以用于代码生成

您可以将预训练的深度学习网络加载到 MATLAB® 和 Simulink® 中以进行代码生成。要从预训练网络生成代码,您可以使用以下函数加载该网络:

您还可以通过以下方式传递 dlnetwork 对象:

  • 直接传递给入口函数。

  • 将其以常量对象的形式传递给入口函数作为参量,方法是使用 coder.Constant 进行包装将。

加载预训练网络

您可以通过几种不同方式加载预训练网络。

使用 coder.loadDeepLearningNetwork 加载保存在 MAT 文件中的网络

您可以从任何 MAT 文件加载 dlnetwork 对象以进行代码生成。将 dlnetwork 保存到一个 MAT 文件中,并在 coder.loadDeepLearningNetwork 中指定此 MAT 文件以加载网络。该 MAT 文件只能包含您要加载的网络。

例如,以下命令加载名为 myNet 的 MAT 文件。

net = coder.loadDeepLearningNetwork('myNet.mat');

将函数名称传递给 coder.loadDeepLearningNetwork 以加载网络

您可以使用 coder.loadDeepLearningNetwork 通过传递返回 dlnetwork 或目标检测器的函数名称来加载预训练网络。有关支持的类的详细信息,请参阅支持的类

例如,编写函数 getNetwork,它使用 imagePretrainedNetwork 加载 Squeeze 网络。

function dlnet = getNetwork()

dlnet = imagePretrainedNetwork("squeezenet");

end

您可以使用以下代码加载网络对象:

net = coder.loadDeepLearningNetwork('getNetwork');

使用 imagePretrainedNetwork 加载预训练网络

您可以使用 imagePretrainedNetwork (Deep Learning Toolbox) 函数加载 Deep Learning Toolbox™ 中提供的预训练网络以进行代码生成。

net = imagePretrainedNetwork("googlenet")

您必须下载并安装预训练神经网络(如 googlenet)所需的支持包。imagePretrainedNetwork 函数提供下载链接。有关详细信息,请参阅预训练的深度神经网络 (Deep Learning Toolbox)

使用 coder.load 函数加载预训练网络

如果您的预训练网络是 dlnetwork 对象,您可以在入口函数中使用 coder.load 函数加载该网络。您只能使用此方法生成泛型 C/C++ 或纯 CUDA 代码。 (自 R2025a 起)

例如,此函数将 MAT 文件作为包含网络的结构体加载:

function out = myNet_predict(matfile, varName, in)

S = coder.load(matfile);
dlnet = S.(varName);
out = predict(dlnet, in);

end

使用 codegen 函数为入口函数生成代码。

cfg = coder.config('mex');

dlnet = imagePretrainedNetwork('squeezenet');
save('myNet.mat','dlnet');

args = {coder.Constant('dlnet.mat'),coder.Constant('dlnet'), dlarray(ones(224,224,3,'single'), 'SSC')};

codegen -args args -config cfg myNet_predict

从编译时外部函数加载预训练网络

您可以通过将 getNetwork 函数声明为外部函数并使用 coder.const 函数将预训练网络加载为编译时常量来加载该网络。您只能使用此方法生成泛型 C/C++ 或纯 CUDA 代码。 (自 R2025a 起)

例如,编写函数 getNetwork,它使用 imagePretrainedNetwork 加载 Squeeze 网络。

function dlnet = getNetwork()

dlnet = imagePretrainedNetwork("squeezenet");

end

然后使用 coder.extrinsicgetNetwork 声明为外部函数,并在 coder.const 语句中调用 getNetwork

function out = myNet_predict(in)

coder.extrinsic('getNetwork');
dlnet = coder.const(getNetwork());
out = predict(dlnet, in);

end

使用 codegen 函数为入口函数生成代码。

cfg = coder.config('mex');

codegen -args {dlarray(ones(224,224,3,'single'), 'SSC')} -config cfg myNet_predict

将预训练网络传递给入口函数

如果您的预训练网络是 dlnetwork 对象,您可以通过将该对象直接传递给入口函数来加载网络。您只能使用此方法生成泛型 C/C++ 或纯 CUDA 代码。 (自 R2025a 起)

将预训练网络直接传递给入口函数对于原型构建很方便,但不推荐用于生成独立可执行文件。

例如,以下代码将 dlnetwork 对象作为输入传递给入口函数:

function out = myNet_predict(dlnet,in)

out = predict(dlnet, in);

end

使用 codegen 函数为入口函数生成代码。

cfg = coder.config('mex');
dlnet = imagePretrainedNetwork('squeezenet');

codegen -args {dlnet, dlarray(ones(224,224,3,'single'), 'SSC')} -config cfg myNet_predict

限制

  • coder.loadDeepLearningNetwork 不支持加载包含多个网络或多个目标检测器的 MAT 文件。

  • 区域设置确定代码生成器用于表示字符的 8 位 ASCII 代码集。因此,在文件、文件夹或网络名称中使用非 ASCII 字符会导致错误。有关详细信息,请参阅代码生成中的字符编码

另请参阅

函数

对象

主题