Этот пример подсвечивает два рабочих процесса, которые могут помочь вам прибыть в полностью встроено-эффективный проект фиксированной точки. В этом примере показано, как к:
Используйте несколько сценариев симуляции в оптимизации типа данных.
Используйте области значений, выведенные из областей значений проекта для оптимизации типа данных.
Используйте различные сравнительные тесты числового поведения для каждого использования сценария блоки из библиотеки Model Verification.
Замените математические операции, которые не поддерживают типы данных с фиксированной точкой с эффективными интерполяционными таблицами.
Модель в этом примере использует алгоритм Ограниченной машины Больцмана (RBM) для изображений denoise. Загрузите данные изображения и веса алгоритма RBM. Оригинальные и искаженные изображения хранятся в imgOriginal
и imgDistorted
переменные. Каждая строка каждой матрицы является тестовым изображением от набора данных MNIST.
load RBMData;
Откройте и просмотрите первый набор тестовых изображений.
singleImgDistorted = imgDistorted(1,:); singleImgOriginal = imgOriginal(1,:); imgSize = length(singleImgOriginal); subplot(1,2,1) imshow(reshape(singleImgOriginal,[28,28])') title('Original Image'); subplot(1,2,2) imshow(reshape(singleImgDistorted,[28,28])') title('Distorted Image')
Откройте модель. Модель загружает искаженное тестовое изображение, использует алгоритм RBM для denoise изображение, и затем сравнивает изображение denoised с оригинальным изображением без добавленного шума. Чтобы улучшить скорость симуляции, видеодисплей выключен в этой модели. Чтобы включить видеодисплей, установите DISPLAY_VIEWER
переменная к 1.
model = 'ex_rbmDenoiser01';
open_system(model);
DISPLAY_VIEWER = 0;
При преобразовании модели, чтобы использовать типы данных с фиксированной точкой, важно собрать области значений при осуществлении модели в ее полном рабочем диапазоне. Можно сделать это путем определения нескольких сценариев симуляции. В этом примере каждый из пяти сценариев симуляции задает новый набор тестовых изображений к denoise, и сравните с оригинальным изображением.
IMGN = 5; si = Simulink.SimulationInput.empty(0, IMGN); for indx = 1:IMGN si(indx) = Simulink.SimulationInput(model); si(indx) = si(indx).setVariable('singleImgDistorted', imgDistorted(indx,:)); si(indx) = si(indx).setVariable('singleImgOriginal', imgOriginal(indx,:)); end
В каждом сценарии симуляции проверьте, что среднеквадратическая ошибка между оригинальным изображением и изображением denoised меньше 0.02.
si(1) = si(1).setBlockParameter([model '/CompareToOriginal/check'], 'max', '0.02'); si(2) = si(2).setBlockParameter([model '/CompareToOriginal/check'], 'max', '0.02'); si(3) = si(3).setBlockParameter([model '/CompareToOriginal/check'], 'max', '0.02'); si(4) = si(4).setBlockParameter([model '/CompareToOriginal/check'], 'max', '0.02'); si(5) = si(5).setBlockParameter([model '/CompareToOriginal/check'], 'max', '0.03');
Задайте опции, чтобы использовать во время оптимизации. В данном примере ограничьте размеры слова в конвертированной модели, чтобы быть между 8 и 16 битами. Можно также ограничить количество итераций, которые выполняет алгоритм оптимизации.
options = fxpOptimizationOptions(... 'AllowableWordLengths', [8 16], ... 'MaxIterations', 50, ... 'Patience', 50);
Чтобы собрать выведенные области значений в модели в дополнение к использованию сценариев симуляции, чтобы собрать области значений симуляции, установите UseDerivedRangeAnalysis
опция к true
. Выведенный анализ области значений часто возвращает более осторожную оценку динамических диапазонов в системе, чем области значений, собранные посредством симуляций.
options.AdvancedOptions.UseDerivedRangeAnalysis = true;
Задайте сценарии симуляции, чтобы использовать во время оптимизации.
options.AdvancedOptions.SimulationScenarios = si;
Используйте fxpopt
функция, чтобы оптимизировать типы данных в RBM Denoiser подсистема согласно опциям, заданным в fxpOptimizationOptions
объект, options
result = fxpopt(model, [model '/RBM Denoiser'], options);
+ Starting data type optimization... + Checking for unsupported constructs. + Preprocessing + Modeling the optimization problem - Constructing decision variables + Running the optimization solver - Evaluating new solution: cost 344, does not meet the behavioral constraints. - Evaluating new solution: cost 656, meets the behavioral constraints. - Updated best found solution, cost: 656 - Evaluating new solution: cost 640, meets the behavioral constraints. - Updated best found solution, cost: 640 - Evaluating new solution: cost 624, does not meet the behavioral constraints. - Evaluating new solution: cost 632, meets the behavioral constraints. - Updated best found solution, cost: 632 - Evaluating new solution: cost 608, meets the behavioral constraints. - Updated best found solution, cost: 608 - Evaluating new solution: cost 600, meets the behavioral constraints. - Updated best found solution, cost: 600 - Evaluating new solution: cost 584, does not meet the behavioral constraints. - Evaluating new solution: cost 592, meets the behavioral constraints. - Updated best found solution, cost: 592 - Evaluating new solution: cost 568, meets the behavioral constraints. - Updated best found solution, cost: 568 - Evaluating new solution: cost 560, meets the behavioral constraints. - Updated best found solution, cost: 560 - Evaluating new solution: cost 544, meets the behavioral constraints. - Updated best found solution, cost: 544 - Evaluating new solution: cost 504, meets the behavioral constraints. - Updated best found solution, cost: 504 - Evaluating new solution: cost 440, meets the behavioral constraints. - Updated best found solution, cost: 440 - Evaluating new solution: cost 432, meets the behavioral constraints. - Updated best found solution, cost: 432 - Evaluating new solution: cost 424, meets the behavioral constraints. - Updated best found solution, cost: 424 - Evaluating new solution: cost 408, meets the behavioral constraints. - Updated best found solution, cost: 408 - Evaluating new solution: cost 400, meets the behavioral constraints. - Updated best found solution, cost: 400 - Evaluating new solution: cost 392, meets the behavioral constraints. - Updated best found solution, cost: 392 - Evaluating new solution: cost 376, meets the behavioral constraints. - Updated best found solution, cost: 376 - Evaluating new solution: cost 360, does not meet the behavioral constraints. - Evaluating new solution: cost 360, does not meet the behavioral constraints. - Evaluating new solution: cost 392, meets the behavioral constraints. - Evaluating new solution: cost 416, meets the behavioral constraints. - Evaluating new solution: cost 424, meets the behavioral constraints. - Evaluating new solution: cost 480, meets the behavioral constraints. - Evaluating new solution: cost 472, meets the behavioral constraints. - Evaluating new solution: cost 512, meets the behavioral constraints. + Optimization has finished. - Neighborhood search complete. - Maximum number of iterations completed. + Fixed-point implementation that satisfies the behavioral constraints found. The best found solution is applied on the model. - Total cost: 376 - Use the explore method of the result to explore the implementation.
Чтобы сравнить поведение базовой модели с двойной точностью против модели, которая использует типы данных с фиксированной точкой, сохраните оптимизированную модель фиксированной точки с новым именем.
modelAfterFxpopt = 'ex_rbmDenoiser02';
save_system(model, modelAfterFxpopt);
Подсистемы LogisticExpression содержат операции, которые не поддерживают типы данных с фиксированной точкой. Замените эти подсистемы на интерполяционные таблицы, которые тесно аппроксимируют исходное поведение.
functionToApproximate = [modelAfterFxpopt '/RBM Denoiser/Logistic/LogisticExpression'];
problem = FunctionApproximation.Problem(functionToApproximate);
problem.Options.AbsTol = 2^-6;
problem.Options.RelTol = 2^-7;
solution = solve(problem);
replaceWithApproximate(solution);
| ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 0 | 32 | 0 | 2 | 8 | 8 | EvenSpacing | 1.562500e-02, 5.000000e-01 | | 1 | 160 | 0 | 18 | 8 | 8 | EvenSpacing | 1.562500e-02, 1.562500e-01 | | 2 | 312 | 0 | 37 | 8 | 8 | EvenSpacing | 1.562500e-02, 9.375000e-02 | | 3 | 704 | 0 | 86 | 8 | 8 | EvenSpacing | 1.562500e-02, 3.125000e-02 | | 4 | 2064 | 1 | 256 | 8 | 8 | EvenSpacing | 1.562500e-02, 0.000000e+00 | | 5 | 128 | 0 | 14 | 8 | 8 | EvenSpacing | 1.562500e-02, 3.593750e-01 | | 6 | 120 | 0 | 13 | 8 | 8 | EvenSpacing | 1.562500e-02, 4.218750e-01 | | 7 | 248 | 0 | 29 | 8 | 8 | EvenSpacing | 1.562500e-02, 1.718750e-01 | | 8 | 224 | 0 | 26 | 8 | 8 | EvenSpacing | 1.562500e-02, 1.875000e-01 | | 9 | 528 | 0 | 64 | 8 | 8 | EvenSpacing | 1.562500e-02, 3.125000e-02 | | 10 | 432 | 0 | 52 | 8 | 8 | EvenSpacing | 1.562500e-02, 6.250000e-02 | | 11 | 1040 | 1 | 128 | 8 | 8 | EvenSpacing | 1.562500e-02, 1.562500e-02 | | 12 | 96 | 0 | 10 | 8 | 8 | EvenSpacing | 1.562500e-02, 3.125000e-01 | | 13 | 88 | 0 | 9 | 8 | 8 | EvenSpacing | 1.562500e-02, 5.625000e-01 | | 14 | 168 | 0 | 19 | 8 | 8 | EvenSpacing | 1.562500e-02, 3.125000e-01 | | 15 | 128 | 1 | 8 | 8 | 8 | ExplicitValues | 1.562500e-02, 1.562500e-02 | | 16 | 128 | 1 | 8 | 8 | 8 | ExplicitValues | 1.562500e-02, 1.562500e-02 | | 17 | 2064 | 1 | 256 | 8 | 8 | EvenPow2Spacing | 1.562500e-02, 0.000000e+00 | | 18 | 1040 | 1 | 128 | 8 | 8 | EvenPow2Spacing | 1.562500e-02, 1.562500e-02 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 15 | 128 | 1 | 8 | 8 | 8 | ExplicitValues | 1.562500e-02, 1.562500e-02 |
Поскольку обе из подсистем LogisticExpression реализуют тот же алгоритм, можно заменить вторую подсистему LogisticExpression на ту же интерполяционную таблицу, созданную на предыдущем шаге.
lutBlockPath = functionToApproximate; subsystemToReplace = [modelAfterFxpopt '/RBM Denoiser/Logistic1/LogisticExpression']; pos = get_param(subsystemToReplace, 'Position'); delete_block(subsystemToReplace); add_block(lutBlockPath, subsystemToReplace,'Position',pos); set_param(subsystemToReplace, 'Commented', 'off');
Сравните поведение симуляции модели фиксированной точки приближениями интерполяционной таблицы против исходной базовой версии с двойной точностью. Задайте те же сценарии симуляции для обновленной модели.
siFA = Simulink.SimulationInput.empty(0, IMGN); for indx = 1:IMGN siFA(indx) = Simulink.SimulationInput(modelAfterFxpopt); siFA(indx) = siFA(indx).setVariable('singleImgDistorted', imgDistorted(indx,:)); siFA(indx) = siFA(indx).setVariable('singleImgOriginal', imgOriginal(indx,:)); end siFA(1) = siFA(1).setBlockParameter([modelAfterFxpopt '/CompareToOriginal/check'], 'max', '0.02'); siFA(2) = siFA(2).setBlockParameter([modelAfterFxpopt '/CompareToOriginal/check'], 'max', '0.02'); siFA(3) = siFA(3).setBlockParameter([modelAfterFxpopt '/CompareToOriginal/check'], 'max', '0.02'); siFA(4) = siFA(4).setBlockParameter([modelAfterFxpopt '/CompareToOriginal/check'], 'max', '0.02'); siFA(5) = siFA(5).setBlockParameter([modelAfterFxpopt '/CompareToOriginal/check'], 'max', '0.03');
Симулируйте и наблюдайте поведение симуляции модели, которая содержит замены интерполяционной таблицы. Модель выдает ошибку, если среднеквадратичная погрешность между оригинальным изображением и изображением denoised больше 0.02.
simOutAfterFA = sim(siFA);
assert(all(arrayfun(@(x)(isempty(x.ErrorMessage)), simOutAfterFA)), 'Final model does not meet the behavioral constraints');
[01-Oct-2020 10:50:29] Running simulations... [01-Oct-2020 10:50:30] Completed 1 of 5 simulation runs [01-Oct-2020 10:50:31] Completed 2 of 5 simulation runs [01-Oct-2020 10:50:32] Completed 3 of 5 simulation runs [01-Oct-2020 10:50:32] Completed 4 of 5 simulation runs [01-Oct-2020 10:50:33] Completed 5 of 5 simulation runs
Сохраните модель после заменяющий неподдерживаемые подсистемы на приближения интерполяционной таблицы.
modelAfterFunctionApproximation = 'ex_rbmDenoiser03';
save_system(modelAfterFxpopt, modelAfterFunctionApproximation);