Отобразите шумоподавление Используя фиксированную точку квантованный ограниченный алгоритм машины Больцмана

Этот пример подсвечивает два рабочих процесса, которые могут помочь вам прибыть в полностью встроено-эффективный проект фиксированной точки. В этом примере показано, как к:

  • Используйте несколько сценариев симуляции в оптимизации типа данных.

  • Используйте области значений, выведенные из областей значений проекта для оптимизации типа данных.

  • Используйте различные сравнительные тесты числового поведения для каждого использования сценария блоки из библиотеки 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_rbmDenoiser001';
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);
	+ Preprocessing
	+ Modeling the optimization problem
		- Constructing decision variables
	+ Running the optimization solver
		- Evaluating new solution: cost 656, meets the tolerances.
		- Updated best found solution, cost: 656
		- Evaluating new solution: cost 640, meets the tolerances.
		- Updated best found solution, cost: 640
		- Evaluating new solution: cost 632, meets the tolerances.
		- Updated best found solution, cost: 632
		- Evaluating new solution: cost 608, meets the tolerances.
		- Updated best found solution, cost: 608
		- Evaluating new solution: cost 600, meets the tolerances.
		- Updated best found solution, cost: 600
		- Evaluating new solution: cost 592, meets the tolerances.
		- Updated best found solution, cost: 592
		- Evaluating new solution: cost 568, meets the tolerances.
		- Updated best found solution, cost: 568
		- Evaluating new solution: cost 560, meets the tolerances.
		- Updated best found solution, cost: 560
		- Evaluating new solution: cost 544, meets the tolerances.
		- Updated best found solution, cost: 544
		- Evaluating new solution: cost 504, meets the tolerances.
		- 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(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');
[10-Jan-2020 17:16:59] Running simulations...
[10-Jan-2020 17:17:01] Completed 1 of 5 simulation runs
[10-Jan-2020 17:17:02] Completed 2 of 5 simulation runs
[10-Jan-2020 17:17:03] Completed 3 of 5 simulation runs
[10-Jan-2020 17:17:04] Completed 4 of 5 simulation runs
[10-Jan-2020 17:17:06] Completed 5 of 5 simulation runs

Сохраните модель

Сохраните модель после заменяющий неподдерживаемые подсистемы на приближения интерполяционной таблицы.

modelAfterFunctionApproximation = 'ex_rbmDenoiser003';
save_system(modelAfterFxpopt, modelAfterFunctionApproximation);

Смотрите также

Классы

Функции

Похожие темы