ONNXParameters

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

    Описание

    ONNXParameters содержит параметры (такие как веса и смещение) импортированной сети ONNX™ (Open Neural Network Exchange). Используйте ONNXParameters выполнять задачи, такие как передача обучения.

    Создание

    Создайте ONNXParameters объект при помощи importONNXFunction.

    Свойства

    развернуть все

    Параметры, обновленные во время сетевого обучения в виде структуры. Например, веса свертки и полносвязных слоев являются параметрами, которые сеть изучает во время обучения. Предотвратить Learnables параметры от того, чтобы быть обновленным во время обучения, преобразуйте их в Nonlearnables при помощи freezeParameters. Преобразуйте замороженные параметры назад в Learnables при помощи unfreezeParameters.

    Добавьте новый параметр в params.Learnables при помощи addParameter. Удалите параметр из params.Learnables при помощи removeParameter.

    Доступ к полям структуры Learnables при помощи записи через точку. Например, params.Learnables.conv1_W мог отобразить веса первого слоя свертки. Инициализируйте веса для передачи обучения путем ввода params.Learnables.conv1_W = rand([1000,4096]). Для получения дополнительной информации о присвоении нового значения и именовании параметра, смотрите Советы.

    Параметры, неизменные во время сетевого обучения в виде структуры. Например, дополнение и шаг является параметрами, которые останавливаются постоянными во время обучения.

    Добавьте новый параметр в params.Nonlearnables при помощи addParameter. Удалите параметр из params.Nonlearnables при помощи removeParameter.

    Доступ к полям структуры Nonlearnables при помощи записи через точку. Например, params.Nonlearnables.conv1_Padding мог отобразить дополнение первого слоя свертки. Для получения дополнительной информации об именовании параметра, смотрите Советы.

    Сетевое состояние в виде структуры. Сеть State содержит информацию, которую помнит сеть между итерациями и обновленную через несколько учебных пакетов. Например, состояниями LSTM и слоев нормализации партии. является State параметры.

    Добавьте новый параметр в params.State при помощи addParameter. Удалите параметр из params.State при помощи removeParameter.

    Доступ к полям структуры State при помощи записи через точку. Например, params.State.bn1_var мог отобразить отклонение первого слоя нормализации партии. Для получения дополнительной информации об именовании параметра, смотрите Советы.

    Это свойство доступно только для чтения.

    Количество размерностей для каждого параметра в виде структуры. NumDimensions включает запаздывание одноэлементных размерностей.

    Доступ к полям структуры NumDimensions при помощи записи через точку. Например, params.NumDimensions.conv1_W мог отобразить количество размерностей для параметра весов первого слоя свертки.

    Это свойство доступно только для чтения.

    Имя функции модели в виде вектора символов или строкового скаляра. Свойство NetworkFunctionName содержит имя функционального NetworkFunctionName, в котором вы задаете importONNXFunction. Функциональный NetworkFunctionName содержит архитектуру импортированной сети ONNX.

    Пример: 'shufflenetFcn'

    Функции объекта

    addParameterДобавьте параметр в ONNXParameters объект
    freezeParametersПреобразуйте learnable сетевые параметры в ONNXParameters к nonlearnable
    removeParameterУдалите параметр из ONNXParameters объект
    unfreezeParametersПреобразуйте nonlearnable сетевые параметры в ONNXParameters к learnable

    Примеры

    свернуть все

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

    Этот пример использует несколько функций помощника. Чтобы просмотреть код для этих функций, смотрите Функции Помощника.

    Разархивируйте и загрузите новые изображения как 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
    

    squeezenet сверточная нейронная сеть, которая обучена больше чем на миллионе изображений от базы данных ImageNet. В результате сеть изучила богатые представления функции для широкого спектра изображений. Сеть может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные.

    Импортируйте предварительно обученный 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) из свертки и полносвязных слоев, обновляются сетью во время обучения. Параметры Nonlearnable остаются постоянными во время обучения.

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

    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);

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

    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 как функция, и переместите mislabeled параметры при помощи 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. Отобразите learnable и nonlearnable параметры импортированной сети.

    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 к nonlearnable параметру. 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. Имена полей могут отличаться между импортированными сетями.

    Введенный в R2020b