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

    Примеры

    свернуть все

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

    Введенный в R2020b