Параметры импортированной сети ONNX для глубокого обучения
ONNXParameters содержит параметры (такие как вес и смещение) импортированной сети ONNX™ (Open Neural Network Exchange). Использовать ONNXParameters для выполнения таких задач, как обучение переносу.
Создание ONNXParameters объект с помощью importONNXFunction.
Learnables - Параметры обновлены во время обучения сетиПараметры, обновляемые во время обучения сети, указываются как структура. Например, веса свёртки и полностью соединенных слоев являются параметрами, которые сеть изучает во время обучения. Предотвратить Learnables параметры, обновляемые во время обучения, преобразуйте их в Nonlearnables с помощью freezeParameters. Преобразовать замороженные параметры обратно в Learnables с помощью unfreezeParameters.
Добавление нового параметра в params.Learnables с помощью addParameter. Удалить параметр из params.Learnables с помощью removeParameter.
Доступ к полям структуры Learnables используя точечную нотацию. Например, params.Learnables.conv1_W может отображать веса первого слоя свертки. Инициализация весов для обучения переносу путем ввода params.Learnables.conv1_W = rand([1000,4096]). Дополнительные сведения о назначении нового значения и именовании параметров см. в разделе Советы.
Nonlearnables - Параметры при обучении сети не изменилисьПараметры не изменяются во время обучения сети, указанные как структура. Например, заполнение и шаг - это параметры, которые остаются постоянными во время обучения.
Добавление нового параметра в params.Nonlearnables с помощью addParameter. Удалить параметр из params.Nonlearnables с помощью removeParameter.
Доступ к полям структуры Nonlearnables используя точечную нотацию. Например, params.Nonlearnables.conv1_Padding может отображать заполнение первого слоя свертки. Дополнительные сведения об именовании параметров см. в разделе Советы.
State - Состояние сети Состояние сети, указанное как структура. Сеть State содержит информацию, запоминаемую сетью между итерациями и обновляемую в нескольких пакетах обучения. Например, состояния уровней LSTM и пакетной нормализации: State параметры.
Добавление нового параметра в params.State с помощью addParameter. Удалить параметр из params.State с помощью removeParameter.
Доступ к полям структуры State используя точечную нотацию. Например, params.State.bn1_var может отображать дисперсию первого уровня нормализации партии. Дополнительные сведения об именовании параметров см. в разделе Советы.
NumDimensions - Количество размеров для каждого параметраЭто свойство доступно только для чтения.
Количество размеров для каждого параметра, указанного как структура. NumDimensions включает в себя конечные одиночные размеры.
Доступ к полям структуры NumDimensions используя точечную нотацию. Например, params.NumDimensions.conv1_W может отображать количество размеров для параметра весов первого слоя свертки.
NetworkFunctionName - Наименование функции моделиЭто свойство доступно только для чтения.
Имя функции модели, указанное как вектор символа или скаляр строки. Собственность NetworkFunctionName содержит имя функции NetworkFunctionName, которые указаны в importONNXFunction. Функция NetworkFunctionName содержит архитектуру импортированной сети ONNX.
Пример: 'shufflenetFcn'
addParameter | Добавить параметр в ONNXParameters объект |
freezeParameters | Преобразовать доступные для изучения сетевые параметры в ONNXParameters к nonlearnable |
removeParameter | Удалить параметр из ONNXParameters объект |
unfreezeParameters | Преобразование неочищаемых параметров сети в ONNXParameters к learnable |
Импорт squeezenet нейронная сеть свертки как функция и точная настройка предварительно обученной сети с обучением передаче для выполнения классификации по новой коллекции изображений.
В этом примере используется несколько вспомогательных функций. Для просмотра кода этих функций см. раздел Вспомогательные функции.
Распакуйте и загрузите новые образы как хранилище данных образов. imageDatastore автоматически помечает изображения на основе имен папок и сохраняет данные в виде ImageDatastore объект. Хранилище данных изображения позволяет хранить большие данные изображения, включая данные, которые не помещаются в память, и эффективно считывать партии изображений во время обучения сверточной нейронной сети. Укажите размер мини-партии.
unzip('MerchData.zip'); miniBatchSize = 8; imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames',... 'ReadSize', miniBatchSize);
Этот набор данных невелик и содержит 75 тренировочных изображений. Отображение некоторых образцов изображений.
numImages = numel(imds.Labels); idx = randperm(numImages,16); figure for i = 1:16 subplot(4,4,i) I = readimage(imds,idx(i)); imshow(I) end

Извлеките обучающий набор и одноконтактно закодируйте классификационные метки категорий.
XTrain = readall(imds);
XTrain = single(cat(4,XTrain{:}));
YTrain_categ = categorical(imds.Labels);
YTrain = onehotencode(YTrain_categ,2)';Определите количество классов в данных.
classes = categories(YTrain_categ); numClasses = numel(classes)
numClasses = 5
squeezenet является сверточной нейронной сетью, которая обучена на более чем миллионе изображений из базы данных ImageNet. В результате сеть получила богатые представления элементов для широкого спектра изображений. Сеть может классифицировать изображения на 1000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные.
Импорт предварительно подготовленных squeezenet сеть как функция.
squeezenetONNX() params = importONNXFunction('squeezenet.onnx','squeezenetFcn')
A function containing the imported ONNX network has been saved to the file squeezenetFcn.m. To learn how to use this function, type: help squeezenetFcn.
params =
ONNXParameters with properties:
Learnables: [1×1 struct]
Nonlearnables: [1×1 struct]
State: [1×1 struct]
NumDimensions: [1×1 struct]
NetworkFunctionName: 'squeezenetFcn'
params является ONNXParameters объект, содержащий параметры сети. squeezenetFcn - функция модели, содержащая сетевую архитектуру. importONNXFunction экономит squeezenetFcn в текущей папке.
Рассчитайте точность классификации предварительно обученной сети на новом обучающем наборе.
accuracyBeforeTraining = getNetworkAccuracy(XTrain,YTrain,params);
fprintf('%.2f accuracy before transfer learning\n',accuracyBeforeTraining);0.01 accuracy before transfer learning
Точность очень низкая.
Отображение обучаемых параметров сети путем ввода params.Learnables. Эти параметры, такие как веса (W) и предвзятость (B) свёртки и полностью соединенных слоев, обновляются сетью во время обучения. Нечеткие параметры остаются постоянными во время обучения.
Последние два обучаемых параметра предварительно обученной сети сконфигурированы для 1000 классов.
conv10_W: [1×1×512×1000 dlarray]
conv10_B: [1000×1 dlarray]
Параметры conv10_W и conv10_B необходимо выполнить точную настройку для новой проблемы классификации. Передайте параметры для классификации пяти классов путем инициализации параметров.
params.Learnables.conv10_W = rand(1,1,512,5); params.Learnables.conv10_B = rand(5,1);
Заморозите все параметры сети, чтобы преобразовать их в неочищаемые параметры. Поскольку не нужно вычислять градиенты замороженных слоев, замораживание весов многих начальных слоев может значительно ускорить обучение сети.
params = freezeParameters(params,'all');Разморозите последние два параметра сети, чтобы преобразовать их в обучаемые параметры.
params = unfreezeParameters(params,'conv10_W'); params = unfreezeParameters(params,'conv10_B');
Сейчас сеть готова к тренировкам. Инициализируйте график хода обучения.
plots = "training-progress"; if plots == "training-progress" figure lineLossTrain = animatedline; xlabel("Iteration") ylabel("Loss") end
Укажите параметры обучения.
velocity = []; numEpochs = 5; miniBatchSize = 16; numObservations = size(YTrain,2); numIterationsPerEpoch = floor(numObservations./miniBatchSize); initialLearnRate = 0.01; momentum = 0.9; decay = 0.01;
Обучение сети.
iteration = 0; start = tic; executionEnvironment = "cpu"; % Change to "gpu" to train on a GPU. % Loop over epochs. for epoch = 1:numEpochs % Shuffle data. idx = randperm(numObservations); XTrain = XTrain(:,:,:,idx); YTrain = YTrain(:,idx); % Loop over mini-batches. for i = 1:numIterationsPerEpoch iteration = iteration + 1; % Read mini-batch of data. idx = (i-1)*miniBatchSize+1:i*miniBatchSize; X = XTrain(:,:,:,idx); Y = YTrain(:,idx); % If training on a GPU, then convert data to gpuArray. if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu" X = gpuArray(X); end % Evaluate the model gradients and loss using dlfeval and the % modelGradients function. [gradients,loss,state] = dlfeval(@modelGradients,X,Y,params); params.State = state; % Determine the learning rate for the time-based decay learning rate schedule. learnRate = initialLearnRate/(1 + decay*iteration); % Update the network parameters using the SGDM optimizer. [params.Learnables,velocity] = sgdmupdate(params.Learnables,gradients,velocity); % Display the training progress. if plots == "training-progress" D = duration(0,0,toc(start),'Format','hh:mm:ss'); addpoints(lineLossTrain,iteration,double(gather(extractdata(loss)))) title("Epoch: " + epoch + ", Elapsed: " + string(D)) drawnow end end end

Вычислите точность классификации сети после точной настройки.
accuracyAfterTraining = getNetworkAccuracy(XTrain,YTrain,params);
fprintf('%.2f accuracy after transfer learning\n',accuracyAfterTraining);1.00 accuracy after transfer learning
Вспомогательные функции
В этом разделе представлен код вспомогательных функций, используемых в данном примере.
getNetworkAccuracy функция оценивает производительность сети, вычисляя точность классификации.
function accuracy = getNetworkAccuracy(X,Y,onnxParams) N = size(X,4); Ypred = squeezenetFcn(X,onnxParams,'Training',false); [~,YIdx] = max(Y,[],1); [~,YpredIdx] = max(Ypred,[],1); numIncorrect = sum(abs(YIdx-YpredIdx) > 0); accuracy = 1 - numIncorrect/N; end
modelGradients функция вычисляет потери и градиенты.
function [grad, loss, state] = modelGradients(X,Y,onnxParams) [y,state] = squeezenetFcn(X,onnxParams,'Training',true); loss = crossentropy(y,Y,'DataFormat','CB'); grad = dlgradient(loss,onnxParams.Learnables); end
squeezenetONNX генерирует модель ONNX squeezenet сеть.
function squeezenetONNX() exportONNXNetwork(squeezenet,'squeezenet.onnx'); end
Импортируйте сеть, сохраненную в формате ONNX, как функцию и перемещайте неправильно помеченные параметры с помощью freeze или unfreeze.
Импорт предварительно подготовленных simplenet.onnx сеть как функция. simplenet представляет собой простую сверточную нейронную сеть, обученную на данных цифрового изображения. Дополнительные сведения о создании simplenet, см. раздел Создание простой сети классификации изображений.
Импорт simplenet.onnx использование importONNXFunction, который возвращает ONNXParameters объект, содержащий параметры сети. Функция также создает новую функцию модели в текущей папке, которая содержит сетевую архитектуру. Укажите имя функции модели как simplenetFcn.
params = importONNXFunction('simplenet.onnx','simplenetFcn');
A function containing the imported ONNX network has been saved to the file simplenetFcn.m. To learn how to use this function, type: help simplenetFcn.
importONNXFunction маркирует параметры импортированной сети как Learnables (параметры, которые обновляются во время обучения) или Nonlearnables (параметры, которые остаются неизменными во время обучения). Маркировка не всегда точна. Рекомендуется проверить, присвоены ли параметры правильной структуре. params.Learnables или params.Nonlearnables. Отображение обучаемых и неузнаваемых параметров импортированной сети.
params.Learnables
ans = struct with fields:
imageinput_Mean: [1×1 dlarray]
conv_W: [5×5×1×20 dlarray]
conv_B: [20×1 dlarray]
batchnorm_scale: [20×1 dlarray]
batchnorm_B: [20×1 dlarray]
fc_W: [24×24×20×10 dlarray]
fc_B: [10×1 dlarray]
params.Nonlearnables
ans = struct with fields:
ConvStride1004: [2×1 dlarray]
ConvDilationFactor1005: [2×1 dlarray]
ConvPadding1006: [4×1 dlarray]
ConvStride1007: [2×1 dlarray]
ConvDilationFactor1008: [2×1 dlarray]
ConvPadding1009: [4×1 dlarray]
Обратите внимание, что params.Learnables содержит параметр imageinput_Mean, который должен оставаться неизменным во время обучения (см. Mean имущество imageInputLayer). Новообращенный imageinput_Mean к непрозрачному параметру. freezeParameters функция удаляет параметр imageinput_Mean от param.Learnables и добавляет его в params.Nonlearnables последовательно.
params = freezeParameters(params,'imageinput_Mean');Отображение обновленных обучаемых и неузнаваемых параметров.
params.Learnables
ans = struct with fields:
conv_W: [5×5×1×20 dlarray]
conv_B: [20×1 dlarray]
batchnorm_scale: [20×1 dlarray]
batchnorm_B: [20×1 dlarray]
fc_W: [24×24×20×10 dlarray]
fc_B: [10×1 dlarray]
params.Nonlearnables
ans = struct with fields:
ConvStride1004: [2×1 dlarray]
ConvDilationFactor1005: [2×1 dlarray]
ConvPadding1006: [4×1 dlarray]
ConvStride1007: [2×1 dlarray]
ConvDilationFactor1008: [2×1 dlarray]
ConvPadding1009: [4×1 dlarray]
imageinput_Mean: [1×1 dlarray]
Следующие правила применяются при назначении нового значения params.Learnables параметр:
Программа автоматически преобразует новое значение в dlarray.
Новое значение должно быть совместимо с существующим значением params.NumDimensions.
importONNXFunction извлекает имена полей структур Learnables, Nonlearnables, и State из имен в импортированном файле модели ONNX. Имена полей могут отличаться между импортированными сетями.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.