基于定点量化受限玻尔兹曼机算法的图像去噪

这个示例强调了两个工作流,它们可以帮助您实现完全嵌入式高效的定点设计。这个例子展示了如何:

  • 在数据类型优化中使用多个模拟场景。

  • 使用从设计范围派生的范围进行数据类型优化。

  • 使用来自模型验证库的块,为每个场景使用不同的数值行为基准。

  • 用高效的查找表替换不支持定点数据类型的数学操作。金宝app

转换模型以使用最优定点数据类型

本例中的模型使用受限玻尔兹曼机(RBM)算法去噪图像。加载图像数据和RBM算法权重。原始和扭曲的图像存储在imgOriginal而且imgDistorted变量。每个矩阵的每一行都是来自MNIST数据集的测试图像。

负载RBMData

打开并查看第一组测试图像。

singleimgdistortion = imgdistortion (1,:);singleImgOriginal = imgOriginal(1,:);imgSize = length(singleImgOriginal);subplot(1,2,1) imshow(重塑(singleImgOriginal,[28,28])') title(原始图像的);subplot(1,2,2) imshow(重塑(singleimgdistortion,[28,28])') title(“扭曲的形象”

打开模型。该模型加载失真的测试图像,使用RBM算法对图像进行去噪,然后将去噪后的图像与不添加噪声的原始图像进行比较。为了提高模拟速度,在这个模型中关闭了视频显示。若要打开视频显示,请设置DISPLAY_VIEWER变量为1。

模型=“ex_rbmDenoiser001”;open_system(模型);Display_viewer = 0;

当将模型转换为使用定点数据类型时,在整个操作范围内执行模型时收集范围是很重要的。您可以通过定义多个模拟场景来实现这一点。在本例中,五个模拟场景中的每一个都定义了一组新的测试图像来去噪并与原始图像进行比较。

Imgn = 5;si = 金宝appSimulink.SimulationInput。空(0,IMGN);indx = 1:IMGN si(indx) = 金宝appSimulink.SimulationInput(model);si(index) = si(index).setVariable(“singleImgDistorted”imgDistorted (indx:));si(index) = si(index).setVariable(“singleImgOriginal”imgOriginal (indx:));结束

在每个模拟场景中,验证原始图像和去噪图像之间的均方误差小于0.02。

si(1) = si(1).setBlockParameter([模型“CompareToOriginal /检查”),“马克斯”“0.02”);si(2) = si(2).setBlockParameter([模型“CompareToOriginal /检查”),“马克斯”“0.02”);si(3) = si(3).setBlockParameter([模型“CompareToOriginal /检查”),“马克斯”“0.02”);si(4) = si(4).setBlockParameter([模型“CompareToOriginal /检查”),“马克斯”“0.02”);si(5) = si(5).setBlockParameter([模型“CompareToOriginal /检查”),“马克斯”“0.03”);

定义优化期间要使用的选项。对于本例,将转换模型中的字长度限制在8到16位之间。还可以限制优化算法执行的迭代次数。

选项= fxpOptimizationOptions(...“AllowableWordLengths”, [8 16],...“MaxIterations”, 50岁,...“耐心”, 50);

若要在模型中收集派生范围,以及使用模拟场景收集模拟范围,请设置UseDerivedRangeAnalysis选项真正的.衍生极差分析通常返回的系统动态范围的估计比通过模拟收集的范围更保守。

options.AdvancedOptions.UseDerivedRangeAnalysis = true;

指定优化期间要使用的模拟场景。

options. advancedoptions . simulationscenario = si;

使用fxpopt函数来优化RBM降噪器子系统中的数据类型fxpOptimizationOptions对象,选项

结果= fxpopt(模型,[模型' /遏制降噪的),选择);
+预处理+优化问题建模-构建决策变量+运行优化求解器-评估新解:成本656,满足公差。-更新的最佳解决方案,成本:656 -评估新的解决方案:成本640,符合公差。-更新的最佳解决方案,成本:640 -评估新的解决方案:成本632,符合公差。-更新的最佳解决方案,成本:632 -评估新的解决方案:成本608,满足公差。-更新的最佳解决方案,成本:608 -评估新的解决方案:成本600,满足公差。-更新的最佳解决方案,成本:600 -评估新的解决方案:成本592,符合公差。-更新的最佳解决方案,成本:592 -评估新的解决方案:成本568,符合公差。-更新的最佳解决方案,成本:568 -评估新的解决方案:成本560,满足公差。-更新的最佳解决方案,成本:560 -评估新的解决方案:成本544,满足公差。-更新的最佳解决方案,成本:544 -评估新的解决方案:成本504,符合公差。 - Updated best found solution, cost: 504 - Evaluating new solution: cost 440, meets the tolerances. - Updated best found solution, cost: 440 - Evaluating new solution: cost 432, meets the tolerances. - Updated best found solution, cost: 432 - Evaluating new solution: cost 424, meets the tolerances. - Updated best found solution, cost: 424 - Evaluating new solution: cost 408, meets the tolerances. - Updated best found solution, cost: 408 - Evaluating new solution: cost 400, meets the tolerances. - Updated best found solution, cost: 400 - Evaluating new solution: cost 392, meets the tolerances. - Updated best found solution, cost: 392 - Evaluating new solution: cost 376, meets the tolerances. - Updated best found solution, cost: 376 - Evaluating new solution: cost 384, meets the tolerances. - Evaluating new solution: cost 392, meets the tolerances. - Evaluating new solution: cost 424, meets the tolerances. - Evaluating new solution: cost 448, meets the tolerances. - Evaluating new solution: cost 456, meets the tolerances. - Evaluating new solution: cost 448, meets the tolerances. + Optimization has finished. - Neighborhood search complete. - Maximum number of iterations completed. + Fixed-point implementation that met the tolerances found. - Total cost: 376 - Maximum absolute difference: 0.000000 - Use the explore method of the result to explore the implementation.

要比较双精度基线模型与使用定点数据类型的模型的行为,请使用新名称保存优化的定点模型。

modelAfterFxpopt =“ex_rbmDenoiser002”;save_system(模型、modelAfterFxpopt);

用查找表代替逻辑回归

LogisticExpression子系统包含不支持定点数据类型的操作。金宝app用接近原始行为的查找表替换这些子系统。

functionToApproximate = [modelAfterFxpopt .' /遏制降噪/物流/ LogisticExpression”];问题=函数近似。问题(函数近似);problem.Options.AbsTol = 2^-6;problem.Options.RelTol = 2^-7;解决(问题);replaceWithApproximate(解决方案);
| | ID内存(位)| |可行的表大小|断点WLs | TableData西城| BreakpointSpecification |错误(Max、电流)| | 0 | 32 | 0 | 2 | 8 | 8 | EvenSpacing e-02 | 1.562500, 5.000000 e-01 | | 160 | | 0 | | 18 8 | 8 | EvenSpacing e-02 | 1.562500, 1.562500 e-01 | | 312 | | 0 | | 37 8 | 8 | EvenSpacing e-02 | 1.562500, 9.375000 e-02 | | 3 | 704 | 0 | 86 | 8 | 8 | EvenSpacing e-02 | 1.562500, 3.125000 e-02 | | 4 | 2064 | 1 | 256 | 8 | 8 | EvenSpacing e-02 | 1.562500,0.000000 e + 00 | | 128 | | 0 | | 14 8 | 8 | EvenSpacing e-02 | 1.562500, 3.593750 e-01 | | 6 | 120 | 0 | 13 | 8 | 8 | EvenSpacing e-02 | 1.562500, 4.218750 e-01 | | 248 | | 0 | | 29日8 | 8 | EvenSpacing e-02 | 1.562500, 1.718750 e-01 | | 224 | | 0 | | 26日8 | 8 | EvenSpacing e-02 | 1.562500, 1.875000 e-01 | | 528 | | 0 | 64 | 8 | 8 | EvenSpacing e-02 | 1.562500, 3.125000 e-02 | | 432 | | 0 | | 52 8 | 8 | EvenSpacing e-02 | 1.562500,6.250000 e-02 | | 1040 | | 128 | | 8 | 8 | EvenSpacing e-02 | 1.562500, 1.562500 e-02 | | 96 | | 0 | | 10 8 | 8 | EvenSpacing e-02 | 1.562500, 3.125000 e-01 | | 88 | | 0 | | 9 8 | 8 | EvenSpacing e-02 | 1.562500, 5.625000 e-01 | | 168 | | 0 | | 19日8 | 8 | EvenSpacing e-02 | 1.562500, 3.125000 e-01 | | 128 | | 1 | 8 8 8 | | | ExplicitValues e-02 | 1.562500, 1.562500 e-02 | | 16 | 128 | 1 | 8 8 8 | | | ExplicitValues e-02 | 1.562500,1.562500 e-02 | | 2064 | | 256 | | 8 | 8 | EvenPow2Spacing e-02 | 1.562500, 0.000000 e + 00 | | 1040 | | 128 | | 8 | 8 | EvenPow2Spacing e-02 | 1.562500, 1.562500 e-02 |最佳解决方案| | ID内存(位)| |可行的表大小|断点WLs | TableData西城| BreakpointSpecification |错误(Max、电流)| | 128 | | 1 | 8 8 8 | | | ExplicitValues e-02 | 1.562500, 1.562500 e-02 |

因为两个LogisticExpression子系统都实现了相同的算法,所以可以用上一步中创建的相同查找表替换第二个LogisticExpression子系统。

lutBlockPath = functionToApproximate;subsystemToReplace = [modelAfterFxpopt .' /遏制降噪/ Logistic1 LogisticExpression”];pos = get_param(subsystemToReplace,“位置”);delete_block (subsystemToReplace);add_block (lutBlockPath subsystemToReplace,“位置”、pos);set_param (subsystemToReplace“评论”“关闭”);

比较原始模型与嵌入式高效模型的行为

将定点模型的模拟行为与查找表近似与原始双精度基线版本进行比较。为更新的模型定义相同的模拟场景。

siFA = 金宝appSimulink.SimulationInput。空(0,IMGN);indx = 1:IMGN siFA(indx) = 金宝appSimulink.SimulationInput(modelAfterFxpopt);siFA(index) = siFA(index).setVariable(“singleImgDistorted”imgDistorted (indx:));siFA(index) = siFA(index).setVariable(“singleImgOriginal”imgOriginal (indx:));结束siFA(1) = siFA(1).setBlockParameter([modelAfterFxpopt .“CompareToOriginal /检查”),“马克斯”“0.02”);siFA(2) = siFA(2).setBlockParameter([modelAfterFxpopt .“CompareToOriginal /检查”),“马克斯”“0.02”);siFA(3) = siFA(3).setBlockParameter([modelAfterFxpopt .“CompareToOriginal /检查”),“马克斯”“0.02”);siFA(4) = siFA(4).setBlockParameter([modelAfterFxpopt .“CompareToOriginal /检查”),“马克斯”“0.02”);siFA(5) = siFA(5).setBlockParameter([modelAfterFxpopt .“CompareToOriginal /检查”),“马克斯”“0.03”);

模拟并观察包含查找表替换的模型的模拟行为。如果原始图像与去噪图像之间的均方误差大于0.02,则模型抛出错误。

simOutAfterFA = sim(siFA);断言(所有(arrayfun (@ (x) (isempty (x.ErrorMessage)), simOutAfterFA)),“最终模型不符合行为约束”);
[10-Jan-2020 17:16:59]运行模拟…[10-Jan-2020 17:17:01]完成5次模拟运行中的1次[10-Jan-2020 17:17:03]完成5次模拟运行中的3次[10-Jan-2020 17:17:04]完成5次模拟运行中的4次[10-Jan-2020 17:17:06]完成5次模拟运行中的5次

保存模型

在用查找表近似替换不支持的子系统之后保存模型。金宝app

modelAfterFunctionApproximation =“ex_rbmDenoiser003”;save_system (modelAfterFxpopt modelAfterFunctionApproximation);

另请参阅

功能

相关的话题