加载预训练网络以用于代码生成
您可以将预训练的深度学习网络加载到 MATLAB® 和 Simulink® 中以进行代码生成。要从预训练网络生成代码,您可以使用以下函数加载该网络:
imagePretrainedNetwork(Deep Learning Toolbox)
您还可以通过以下方式传递 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.extrinsic 将 getNetwork 声明为外部函数,并在 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 字符会导致错误。有关详细信息,请参阅代码生成中的字符编码。
另请参阅
函数
codegen|coder.loadDeepLearningNetwork|imagePretrainedNetwork(Deep Learning Toolbox) |coder.load|coder.Constant