Параметры импортированной сети 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
свертка нейронной сети как функции и подстройте предварительно обученную сеть с передачей обучения, чтобы выполнить классификацию на новом наборе изображений.
Этот пример использует несколько вспомогательных функций. Чтобы просмотреть код для этих функций, смотрите Вспомогательные функции.
Разархивируйте и загружайте новые изображения как image datastore. imageDatastore
автоматически помечает изображения на основе имен папок и сохраняет данные как ImageDatastore
объект. image datastore позволяет вам хранить большие данные изображения, включая данные, которые не помещаются в памяти, и эффективно считывать пакеты изображений во время обучения сверточной нейронной сети. Укажите размер мини-пакета.
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
Вспомогательные функции
В этом разделе представлен код вспомогательных функций, используемых в этом примере.
The 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
The 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
The 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
к параметру, не поддающемуся интерполяции. The freezeParameters
функция удаляет параметр imageinput_Mean
от param.Learnables
и добавляет его к params.Nonlearnables
последовательно.
params = freezeParameters(params,'imageinput_Mean');
Отобразите обновленные параметры learnable и nonlearnable.
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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.