Параметры импортированной сети 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 | Преобразуйте learnable сетевые параметры в ONNXParameters к nonlearnable |
removeParameter | Удалите параметр из ONNXParameters объект |
unfreezeParameters | Преобразуйте nonlearnable сетевые параметры в ONNXParameters к learnable |
Импортируйте alexnet
нейронная сеть свертки как функция и подстройка предварительно обученная сеть с передачей обучения, чтобы выполнить классификацию на новом наборе изображений.
Этот пример использует несколько функций помощника. Чтобы просмотреть код для этих функций, смотрите Функции Помощника.
Разархивируйте и загрузите новые изображения как datastore изображений. imageDatastore
автоматически помечает изображения на основе имен папок и хранит данные как ImageDatastore
объект. 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
AlexNet является сверточной нейронной сетью, которая обучена больше чем на миллионе изображений от базы данных ImageNet. В результате сеть изучила богатые представления функции для широкого спектра изображений. Сеть может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные.
Импортируйте предварительно обученный alexnet
сеть как функция.
alexnetONNX() params = importONNXFunction('alexnet.onnx','alexnetFcn')
A function containing the imported ONNX network has been saved to the file alexnetFcn.m. To learn how to use this function, type: help alexnetFcn.
params = ONNXParameters with properties: Learnables: [1×1 struct] Nonlearnables: [1×1 struct] State: [1×1 struct] NumDimensions: [1×1 struct] NetworkFunctionName: 'alexnetFcn'
params
ONNXParameters
объект, который содержит сетевые параметры. alexnetFcn
функция модели, которая содержит сетевую архитектуру. importONNXFunction
сохраняет alexnetFcn
в текущей папке.
Вычислите точность классификации предварительно обученной сети на новом наборе обучающих данных.
accuracyBeforeTraining = getNetworkAccuracy(XTrain,YTrain,params);
fprintf('%.2f accuracy before transfer learning\n',accuracyBeforeTraining);
0.01 accuracy before transfer learning
Точность является очень низкой.
Отобразите настраиваемые параметры сети. Эти параметры, например, веса (W
) и смещение (B
) из свертки и полносвязных слоев, обновляются сетью во время обучения. Параметры Nonlearnable остаются постоянными во время обучения.
params.Learnables
ans = struct with fields:
data_Mean: [227×227×3 dlarray]
conv1_W: [11×11×3×96 dlarray]
conv1_B: [96×1 dlarray]
conv2_W: [5×5×48×256 dlarray]
conv2_B: [256×1 dlarray]
conv3_W: [3×3×256×384 dlarray]
conv3_B: [384×1 dlarray]
conv4_W: [3×3×192×384 dlarray]
conv4_B: [384×1 dlarray]
conv5_W: [3×3×192×256 dlarray]
conv5_B: [256×1 dlarray]
fc6_W: [6×6×256×4096 dlarray]
fc6_B: [4096×1 dlarray]
fc7_W: [1×1×4096×4096 dlarray]
fc7_B: [4096×1 dlarray]
fc8_W: [1×1×4096×1000 dlarray]
fc8_B: [1000×1 dlarray]
Последние два настраиваемых параметра предварительно обученной сети сконфигурированы для 1 000 классов. Параметры fc8_W
и fc8_B
должен быть подстроен для новой проблемы классификации. Передайте параметры, чтобы классифицировать 5 классов путем инициализации их.
params.Learnables.fc8_B = rand(5,1); params.Learnables.fc8_W = rand(1,1,4096,5);
Заморозьте все параметры сети, чтобы преобразовать их в nonlearnable параметры. Поскольку вы не должны вычислять градиенты блокированных слоев, замораживание весов многих начальных слоев может значительно ускорить сетевое обучение.
params = freezeParameters(params,'all');
Разморозьте последние два параметра сети, чтобы преобразовать их в настраиваемые параметры.
params = unfreezeParameters(params,'fc8_W'); params = unfreezeParameters(params,'fc8_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 learning rate for 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);
0.99 accuracy after transfer learning
Функции помощника
Этот раздел предоставляет код функций помощника, используемых в этом примере.
getNetworkAccuracy
функция оценивает производительность сети путем вычисления точности классификации.
function accuracy = getNetworkAccuracy(X,Y,onnxParams) N = size(X,4); Ypred = alexnetFcn(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] = alexnetFcn(X,onnxParams,'Training',true); loss = crossentropy(y,Y,'DataFormat','CB'); grad = dlgradient(loss,onnxParams.Learnables); end
alexnetONNX
функция генерирует модель ONNX alexnet
сеть. Вам нужна Модель Deep Learning Toolbox для Сетевой поддержки AlexNet, чтобы получить доступ к этой модели.
function alexnetONNX() exportONNXNetwork(alexnet,'alexnet.onnx'); end
Импортируйте сеть, сохраненную в формате ONNX как функция, и переместите mislabeled параметры при помощи freeze
или unfreeze
.
Создайте модель ONNX из предварительно обученного alexnet
сеть. Затем импортируйте alexnet.onnx
как функция. Импортируйте предварительно обученную сеть ONNX с помощью importONNXFunction
, который возвращает ONNXParamaters
объект, который содержит сетевые параметры. Функция также создает новую функцию модели в текущей папке, которая содержит сетевую архитектуру. Задайте имя функции модели как alexnetFcn
.
net = alexnet; exportONNXNetwork(net,'alexnet.onnx'); params = importONNXFunction('alexnet.onnx','alexnetFcn');
A function containing the imported ONNX network has been saved to the file alexnetFcn.m. To learn how to use this function, type: help alexnetFcn.
importONNXFunction
помечает параметры импортированной сети как Learnables
(параметры, которые обновляются во время обучения), или Nonlearnables
(параметры, которые остаются неизменными во время обучения). Маркировка не всегда точна. Методические рекомендации должны проверять, присвоены ли параметры правильной структуре params.Learnables
или params.Nonlearnables
. Отобразите learnable и nonlearnable параметры импортированной сети.
params.Learnables
ans = struct with fields:
data_Mean: [227×227×3 dlarray]
conv1_W: [11×11×3×96 dlarray]
conv1_B: [96×1 dlarray]
conv2_W: [5×5×48×256 dlarray]
conv2_B: [256×1 dlarray]
conv3_W: [3×3×256×384 dlarray]
conv3_B: [384×1 dlarray]
conv4_W: [3×3×192×384 dlarray]
conv4_B: [384×1 dlarray]
conv5_W: [3×3×192×256 dlarray]
conv5_B: [256×1 dlarray]
fc6_W: [6×6×256×4096 dlarray]
fc6_B: [4096×1 dlarray]
fc7_W: [1×1×4096×4096 dlarray]
fc7_B: [4096×1 dlarray]
fc8_W: [1×1×4096×1000 dlarray]
fc8_B: [1000×1 dlarray]
params.Nonlearnables
ans = struct with fields:
conv1_Stride: [1×2 dlarray]
conv1_DilationFactor: [1×2 dlarray]
conv1_Padding: [1×1 dlarray]
pool1_PoolSize: [1×2 dlarray]
pool1_Stride: [1×2 dlarray]
pool1_Padding: [1×1 dlarray]
conv2_Stride: [1×2 dlarray]
conv2_DilationFactor: [1×2 dlarray]
conv2_Padding: [2×2 dlarray]
pool2_PoolSize: [1×2 dlarray]
pool2_Stride: [1×2 dlarray]
pool2_Padding: [1×1 dlarray]
conv3_Stride: [1×2 dlarray]
conv3_DilationFactor: [1×2 dlarray]
conv3_Padding: [2×2 dlarray]
conv4_Stride: [1×2 dlarray]
conv4_DilationFactor: [1×2 dlarray]
conv4_Padding: [2×2 dlarray]
conv5_Stride: [1×2 dlarray]
conv5_DilationFactor: [1×2 dlarray]
conv5_Padding: [2×2 dlarray]
pool5_PoolSize: [1×2 dlarray]
pool5_Stride: [1×2 dlarray]
pool5_Padding: [1×1 dlarray]
fc6_Stride: [1×2 dlarray]
fc6_DilationFactor: [1×2 dlarray]
fc6_Padding: [1×1 dlarray]
fc7_Stride: [1×2 dlarray]
fc7_DilationFactor: [1×2 dlarray]
fc7_Padding: [1×1 dlarray]
fc8_Stride: [1×2 dlarray]
fc8_DilationFactor: [1×2 dlarray]
fc8_Padding: [1×1 dlarray]
Обратите внимание на то, что params.Learnables
содержит параметр data_Mean
, который должен остаться неизменным во время обучения. Преобразуйте data_Mean
к nonlearnable параметру. freezeParameters
функция удаляет параметр data_Mean
от param.Learnables
и добавляет его в params.Nonlearnables
последовательно.
params = freezeParameters(params,'data_Mean');
Отобразите обновленные learnable и nonlearnable параметры.
params.Learnables
ans = struct with fields:
conv1_W: [11×11×3×96 dlarray]
conv1_B: [96×1 dlarray]
conv2_W: [5×5×48×256 dlarray]
conv2_B: [256×1 dlarray]
conv3_W: [3×3×256×384 dlarray]
conv3_B: [384×1 dlarray]
conv4_W: [3×3×192×384 dlarray]
conv4_B: [384×1 dlarray]
conv5_W: [3×3×192×256 dlarray]
conv5_B: [256×1 dlarray]
fc6_W: [6×6×256×4096 dlarray]
fc6_B: [4096×1 dlarray]
fc7_W: [1×1×4096×4096 dlarray]
fc7_B: [4096×1 dlarray]
fc8_W: [1×1×4096×1000 dlarray]
fc8_B: [1000×1 dlarray]
params.Nonlearnables
ans = struct with fields:
conv1_Stride: [1×2 dlarray]
conv1_DilationFactor: [1×2 dlarray]
conv1_Padding: [1×1 dlarray]
pool1_PoolSize: [1×2 dlarray]
pool1_Stride: [1×2 dlarray]
pool1_Padding: [1×1 dlarray]
conv2_Stride: [1×2 dlarray]
conv2_DilationFactor: [1×2 dlarray]
conv2_Padding: [2×2 dlarray]
pool2_PoolSize: [1×2 dlarray]
pool2_Stride: [1×2 dlarray]
pool2_Padding: [1×1 dlarray]
conv3_Stride: [1×2 dlarray]
conv3_DilationFactor: [1×2 dlarray]
conv3_Padding: [2×2 dlarray]
conv4_Stride: [1×2 dlarray]
conv4_DilationFactor: [1×2 dlarray]
conv4_Padding: [2×2 dlarray]
conv5_Stride: [1×2 dlarray]
conv5_DilationFactor: [1×2 dlarray]
conv5_Padding: [2×2 dlarray]
pool5_PoolSize: [1×2 dlarray]
pool5_Stride: [1×2 dlarray]
pool5_Padding: [1×1 dlarray]
fc6_Stride: [1×2 dlarray]
fc6_DilationFactor: [1×2 dlarray]
fc6_Padding: [1×1 dlarray]
fc7_Stride: [1×2 dlarray]
fc7_DilationFactor: [1×2 dlarray]
fc7_Padding: [1×1 dlarray]
fc8_Stride: [1×2 dlarray]
fc8_DilationFactor: [1×2 dlarray]
fc8_Padding: [1×1 dlarray]
data_Mean: [227×227×3 dlarray]
Следующие правила применяются, когда вы присваиваете новое значение params.Learnables
параметр:
Программное обеспечение автоматически преобразует новое значение в dlarray
.
Новое значение должно быть совместимо с существующим значением params.NumDimensions
.
importONNXFunction
выводит имена полей структур Learnables
, Nonlearnables
, и State
с имен в импортированном файле модели ONNX. Имена полей могут отличаться между импортированными сетями.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.