exponenta event banner

Преобразование нейронной сети распознавания цифр в фиксированную точку и генерация кода C

В этом примере показано, как преобразовать модель классификации нейронной сети в Simulink™ в фиксированную точку с помощью инструмента Fixed-Point Tool и оптимизатора таблицы подстановки. После преобразования можно создать код C с помощью Simulink Coder.

Обзор

С помощью инструмента «Фиксированная точка» можно преобразовать конструкцию из плавающей точки в фиксированную. Используйте оптимизатор таблиц подстановки для создания заменяющих таблиц подстановки с эффективным использованием памяти для неограниченных функций, таких как exp и log2. С помощью этих инструментов в этом примере показано, как преобразовать обученную модель классификации нейронных сетей с плавающей запятой для использования встроенных типов данных с фиксированной запятой.

Классификация цифр и набор данных MNIST

Набор данных из рукописных цифр MNIST является часто используемым набором данных в области нейронных сетей. Пример простого способа создания двухуровневой нейронной сети с использованием этого набора данных см. в разделе https://blogs.mathworks.com/loren/2015/08/04/artificial-neural-networks-for-beginners/

Обучение работе с данными и нейронной сетью

Загрузите данные и обучите сеть.

%Load Data
tr = csvread('train.csv', 1, 0);                  % read train.csv
sub = csvread('test.csv', 1, 0);                  % read test.csv

% Prepare Data
n = size(tr, 1);                    % number of samples in the dataset
targets  = tr(:,1);                 % 1st column is |label|
targets(targets == 0) = 10;         % use '10' to present '0'
targetsd = dummyvar(targets);       % convert label into a dummy variable
inputs = tr(:,2:end);               % the rest of columns are predictors

inputs = inputs';                   % transpose input
targets = targets';                 % transpose target
targetsd = targetsd';               % transpose dummy variable

rng(1);                             % for reproducibility
c = cvpartition(n,'Holdout',n/3);   % hold out 1/3 of the dataset

Xtrain = inputs(:, training(c));    % 2/3 of the input for training
Ytrain = targetsd(:, training(c));  % 2/3 of the target for training
Xtest = inputs(:, test(c));         % 1/3 of the input for testing
Ytest = targets(test(c));           % 1/3 of the target for testing
Ytestd = targetsd(:, test(c));      % 1/3 of the dummy variable for testing

% Train Network
hiddenLayerSize = 100;
net = patternnet(hiddenLayerSize);

[net, tr] = train(net, Xtrain, Ytrain);
view(net);

outputs = net(Xtest);
errors = gsubtract(Ytest, outputs);
performance = perform(net, Ytest, outputs);

figure, plotperform(tr);

Закройте все окна обучающего инструмента и просмотра сети

nnet.guis.closeAllViews();
nntraintool('close');

Подготовка модели для преобразования с фиксированной точкой

После обучения сети используйте gensim функция из Toolbox™ глубокого обучения для создания модели Simulink.

sys_name = gensim(net, 'Name', 'mTrainedNN');

Модель, сгенерированная gensim функция содержит нейронную сеть с обученными весами и отклонениями. Подготовьте обученную нейронную сеть к преобразованию в фиксированную точку путем включения регистрации сигналов на выходе сети и добавления входных стимулов и блоков проверки. Измененная модель: fxpdemo_mnist_classification.

Откройте и проверьте модель.

model = 'fxpdemo_mnist_classification';
system_under_design = [model '/Pattern Recognition Neural Network'];
baseline_output = [model '/yarr'];
open_system(model);

Чтобы открыть инструмент Fixed-Point, щелкните правой кнопкой мыши подсистему нейронной сети Function Fitting и выберите Fixed-Point Tool. Также можно использовать интерфейс командной строки инструмента «Фиксированная точка». Инструмент «Фиксированная точка» и его интерфейс командной строки помогают подготовить модель к преобразованию и преобразовать систему в фиксированную точку. Инструмент «Фиксированная точка» (Fixed-Point) можно использовать для сбора измерений диапазона и переполнения объектов в модели с помощью моделирования и анализа диапазона. В этом примере используйте интерфейс командной строки инструмента Fixed-Point Tool для преобразования нейронной сети в фиксированную точку.

converter = DataTypeWorkflow.Converter(system_under_design);

Выполнить моделирование для сбора диапазонов

Моделирование модели с помощью инструментов для сбора диапазонов. Включить инструментарий с помощью 'Range collection using double override' ярлык. Сохраните имя прогона моделирования для использования в последующих шагах.

converter.applySettingsFromShortcut('Range collection using double override');
collect_ranges = converter.CurrentRunName;
sim_out = converter.simulateSystem();

Постройте график правильной степени классификации перед преобразованием, чтобы установить поведение базовой линии.

plotConfusionMatrix(sim_out, baseline_output, system_under_design, 'Classification rate before conversion');

Предложение типов данных с фиксированной точкой

Инструмент Fixed-Point Tool использует информацию о диапазоне, полученную при моделировании, для предложения типов данных с фиксированной точкой для блоков в проектируемой системе. В этом примере, чтобы убедиться, что инструменты предлагают подписанные типы данных для всех блоков в подсистеме, отключите ProposeSignedness опции в ProposalSettings объект.

ps = DataTypeWorkflow.ProposalSettings;
converter.proposeDataTypes(collect_ranges, ps);

Применение предлагаемых типов данных

По умолчанию инструмент «Фиксированная точка» применяет все предлагаемые типы данных. Используйте applyDataTypes для применения типов данных. Если требуется применить только подмножество предложений, в инструменте «Фиксированная точка» установите флажок «Принять», чтобы указать предложения, которые требуется применить.

converter.applyDataTypes(collect_ranges);

Проверка типов данных

Предлагаемые типы должны правильно обрабатывать все возможные входные данные. Задайте модель для моделирования с использованием вновь примененных типов, смоделируйте модель и убедитесь, что точность регрессии нейронной сети остается прежней после преобразования.

converter.applySettingsFromShortcut('Range collection with specified data types');
sim_out = converter.simulateSystem();

Постройте график правильной степени классификации модели с фиксированной точкой.

plotConfusionMatrix(sim_out, baseline_output, system_under_design, 'Classification rate after fixed-point conversion');

Заменить функции активации оптимизированной таблицей поиска

Для повышения эффективности кода замените функцию Tanh Activation на первом уровне либо таблицей поиска, либо реализацией CORDIC. В этом примере используйте оптимизатор таблицы подстановки, чтобы получить таблицу подстановки для замены tanh. В этом примере укажите EvenPow2Spacing для интервала точек останова для более высокой скорости выполнения.

block_path = [system_under_design '/Layer 1/tansig'];
p = FunctionApproximation.Problem(block_path);
p.Options.WordLengths = 16;
p.Options.BreakpointSpecification = 'EvenPow2Spacing';
solution  = p.solve;
solution.replaceWithApproximate;
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |             64 |        0 |          2 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |
|   1 |             96 |        0 |          4 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 8.392944e-01 |
|   2 |            160 |        0 |          8 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 7.229614e-01 |
|   3 |            288 |        0 |         16 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 5.369873e-01 |
|   4 |            544 |        0 |         32 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 2.825317e-01 |
|   5 |           1056 |        0 |         64 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 8.178711e-02 |
|   6 |           2080 |        0 |        128 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 2.331543e-02 |
|   7 |           4128 |        1 |        256 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 5.981445e-03 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|   7 |           4128 |        1 |        256 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 5.981445e-03 |

Выполните те же действия, чтобы заменить exp функция в реализации softmax на втором уровне с таблицей поиска.

block_path = [system_under_design '/Layer 2/softmax/Exp'];
p = FunctionApproximation.Problem(block_path);
p.Options.WordLengths = 16;
p.Options.BreakpointSpecification = 'EvenPow2Spacing';

Чтобы получить оптимизированную таблицу поиска, определите конечные нижние и верхние границы для входных данных.

p.InputLowerBounds = -40;
p.InputUpperBounds = 0;
solution  = p.solve;
solution.replaceWithApproximate;
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |             64 |        0 |          2 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 9.996643e-01 |
|   1 |            128 |        0 |          6 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 6.151613e-01 |
|   2 |            208 |        0 |         11 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 4.098255e-01 |
|   3 |            368 |        0 |         21 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 2.051429e-01 |
|   4 |            688 |        0 |         41 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 7.796005e-02 |
|   5 |           1328 |        0 |         81 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 2.451896e-02 |
|   6 |           2608 |        1 |        161 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 6.907394e-03 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|   6 |           2608 |        1 |        161 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 6.907394e-03 |

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

converter.applySettingsFromShortcut(converter.ShortcutsForSelectedSystem{2});
sim_out = converter.simulateSystem;

plotConfusionMatrix(sim_out, baseline_output, system_under_design, 'Classification rate after function replacement');

Создать код C

Для генерации кода C щелкните правой кнопкой мыши подсистему нейронной сети Function Fitting, выберите C/C++ Code > Build Subsystem. При запросе настраиваемых параметров нажмите кнопку «Построить».