importTensorFlowLayers

Импорт слоев из сети TensorFlow

    Описание

    пример

    lgraph = importTensorFlowLayers(modelFolder) возвращает layers сети TensorFlow™ из папки modelFolder, которая содержит модель в сохраненном формате модели (совместима только с TensorFlow 2). Функция импортирует слои, определенные в saved_model.pb файл и выученные веса, содержащиеся в variables подпапка и возвраты lgraph как LayerGraph объект.

    importTensorFlowLayers требуется пакет поддержки Deep Learning Toolbox™ Converter для моделей TensorFlow. Если этот пакет поддержки не установлен, то importTensorFlowLayers содержит ссылку на загрузку.

    Примечание

    importTensorFlowLayers пытается сгенерировать пользовательский слой при импорте пользовательского слоя TensorFlow или когда программное обеспечение не может преобразовать слой TensorFlow в эквивалентный встроенный MATLAB® слой. Список слоев, для которых программное обеспечение поддерживает преобразование, см. в разделе Слои TensorFlow-Keras, поддерживаемые для преобразования во встроенные слои MATLAB.

    importTensorFlowLayers сохраняет сгенерированные пользовательские слои и связанные операторы TensorFlow в пакете + modelFolder.

    importTensorFlowLayers не генерирует автоматически пользовательский слой для каждого слоя TensorFlow, который не поддерживается для преобразования во встроенный слой MATLAB. Дополнительные сведения о том, как обрабатывать неподдерживаемые слои, см. в советах.

    пример

    lgraph = importTensorFlowLayers(modelFolder,Name,Value) импортирует слои и веса из сети TensorFlow с дополнительными опциями, заданными одним или несколькими аргументами имя-значение. Для примера, 'OutputLayerType','classification' добавляет выходной слой классификации в конец импортированной сетевой архитектуры.

    Примеры

    свернуть все

    Импортируйте предварительно обученную сеть TensorFlow в сохраненном формате модели как LayerGraph объект. Затем соберите импортированные слои в DAGNetwork объект и используйте собранную сеть для классификации изображения.

    Задайте папку модели.

    if ~exist('digitsDAGnet','dir')
        unzip('digitsDAGnet.zip')
    end
    modelFolder = './digitsDAGnet';

    Задайте имена классов.

    classNames = {'0','1','2','3','4','5','6','7','8','9'};

    Импортируйте слои и веса сети TensorFlow в сохраненном формате модели. По умолчанию importTensorFlowLayers импортирует сеть как LayerGraph объект, совместимый с DAGNetwork объект. Укажите тип выхода слоя для задачи классификации изображений.

    lgraph = importTensorFlowLayers(modelFolder,'OutputLayerType','classification')
    Importing the saved model...
    Translating the model, this may take a few minutes...
    Finished translation
    
    lgraph = 
      LayerGraph with properties:
    
             Layers: [13×1 nnet.cnn.layer.Layer]
        Connections: [13×2 table]
         InputNames: {'input_1'}
        OutputNames: {'ClassificationLayer_activation_1'}
    
    

    Отображение последнего слоя импортированной сети. Этот выход показывает, что importTensorFlowLayers добавляет ClassificationOutputLayer до конца сетевой архитектуры.

    lgraph.Layers(end)
    ans = 
      ClassificationOutputLayer with properties:
    
                Name: 'ClassificationLayer_activation_1'
             Classes: 'auto'
        ClassWeights: 'none'
          OutputSize: 'auto'
    
       Hyperparameters
        LossFunction: 'crossentropyex'
    
    

    Слой классификации не содержит классы, поэтому перед сборкой сети необходимо указать их. Если вы не задаете классы, то программное обеспечение автоматически устанавливает классы на 1, 2..., N, где N количество классов.

    Классификационный слой имеет имя 'ClassificationLayer_activation_1'. Установите классы равными classNames а затем замените импортированный слой классификации на новый.

    cLayer = lgraph.Layers(end);
    cLayer.Classes = classNames;
    lgraph = replaceLayer(lgraph,'ClassificationLayer_activation_1',cLayer);

    Собрать график слоев можно используя команду assembleNetwork для возврата DAGNetwork объект.

    net = assembleNetwork(lgraph)
    net = 
      DAGNetwork with properties:
    
             Layers: [13×1 nnet.cnn.layer.Layer]
        Connections: [13×2 table]
         InputNames: {'input_1'}
        OutputNames: {'ClassificationLayer_activation_1'}
    
    

    Считайте изображение, которое вы хотите классифицировать.

    digitDatasetPath = fullfile(toolboxdir('nnet'),'nndemos','nndatasets','DigitDataset');
    I = imread(fullfile(digitDatasetPath,'5','image4009.png'));

    Классификация изображения с помощью импортированной сети.

    label = classify(net,I);

    Отобразите изображение и результат классификации.

    imshow(I)
    title(['Classification result ' classNames{label}])

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

    Задайте папку модели.

    if ~exist('digitsDAGnet','dir')
        unzip('digitsDAGnet.zip')
    end
    modelFolder = './digitsDAGnet';

    Задайте имена классов.

    classNames = {'0','1','2','3','4','5','6','7','8','9'};

    Импортируйте сеть TensorFlow как слои, совместимые с dlnetwork объект.

    lgraph = importTensorFlowLayers(modelFolder,'TargetNetwork','dlnetwork')
    Importing the saved model...
    Translating the model, this may take a few minutes...
    Finished translation
    
    lgraph = 
      LayerGraph with properties:
    
             Layers: [12×1 nnet.cnn.layer.Layer]
        Connections: [12×2 table]
         InputNames: {'input_1'}
        OutputNames: {1×0 cell}
    
    

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

    digitDatasetPath = fullfile(toolboxdir('nnet'),'nndemos','nndatasets','DigitDataset');
    I = imread(fullfile(digitDatasetPath,'5','image4009.png'));
    size(I)
    ans = 1×2
    
        28    28
    
    

    Преобразуйте импортированный график слоев в dlnetwork объект.

    dlnet = dlnetwork(lgraph);

    Отображение входа размера сети. В этом случае размер изображения совпадает с размером входа сети. Если они не совпадают, необходимо изменить размер изображения при помощи imresize(I, netInputSize(1:2)).

    dlnet.Layers(1).InputSize
    ans = 1×3
    
        28    28     1
    
    

    Преобразуйте изображение в dlarray. Отформатируйте изображения с помощью размерностей 'SSCB' (пространственный, пространственный, канальный, пакетный). В этом примере размер партии равен 1, и его можно опустить ('SSC').

    I_dlarray = dlarray(single(I),'SSCB');

    Классифицируйте образец изображения и найдите предсказанную метку.

    prob = predict(dlnet,I_dlarray);
    [~,label] = max(prob);

    Отобразите изображение и результат классификации.

    imshow(I)
    title(['Classification result ' classNames{label}])

    Импортируйте предварительно обученную сеть TensorFlow в сохраненном формате модели как LayerGraph объект. Затем соберите импортированные слои в DAGNetwork объект. Импортированная сеть содержит слои, которые не поддерживаются для преобразования во встроенные слои MATLAB. Программа автоматически генерирует пользовательские слои при импорте этих слоев.

    Этот пример использует функцию helper findCustomLayers. Чтобы просмотреть код для этой функции, смотрите Helper Function.

    Задайте папку модели.

    if ~exist('digitsDAGnetwithnoise','dir')
        unzip('digitsDAGnetwithnoise.zip')
    end
    modelFolder = './digitsDAGnetwithnoise';

    Задайте имена классов.

    classNames = {'0','1','2','3','4','5','6','7','8','9'};

    Импортируйте слои и веса сети TensorFlow в сохраненном формате модели. По умолчанию importTensorFlowLayers импортирует сеть как LayerGraph объект, совместимый с DAGNetwork объект. Укажите тип выхода слоя для задачи классификации изображений.

    lgraph = importTensorFlowLayers(modelFolder,'OutputLayerType','classification');
    Importing the saved model...
    Translating the model, this may take a few minutes...
    Finished translation
    

    Если импортированная сеть содержит слои, не поддерживаемые для преобразования во встроенные слои MATLAB, то importTensorFlowLayers может автоматически сгенерировать пользовательские слои вместо этих слоев. importTensorFlowLayers сохраняет каждый сгенерированный пользовательский слой в отдельное .m файл в пакете +digitsDAGnetwithnoise в текущей папке.

    Найдите индексы автоматически сгенерированных пользовательских слоев, используя функцию helper findCustomLayers, и отобразить пользовательские слои.

    ind = findCustomLayers(lgraph.Layers,'+digitsDAGnetwithnoise');
    lgraph.Layers(ind)
    ans = 
      2×1 Layer array with layers:
    
         1   'gaussian_noise_1'   GaussianNoise   digitsDAGnetwithnoise.kGaussianNoise1Layer3766
         2   'gaussian_noise_2'   GaussianNoise   digitsDAGnetwithnoise.kGaussianNoise2Layer3791
    

    Слой классификации не содержит классы, поэтому перед сборкой сети необходимо указать их. Если вы не задаете классы, то программное обеспечение автоматически устанавливает классы на 1, 2..., N, где N количество классов.

    Классификационный слой имеет имя 'ClassificationLayer_activation_1'. Установите классы равными classNames а затем замените импортированный слой классификации на новый.

    cLayer = lgraph.Layers(end);
    cLayer.Classes = classNames;
    lgraph = replaceLayer(lgraph,'ClassificationLayer_activation_1',cLayer);

    Собрать график слоев можно используя команду assembleNetwork. Функция возвращает DAGNetwork объект, который готов к использованию для предсказания.

    net = assembleNetwork(lgraph)
    net = 
      DAGNetwork with properties:
    
             Layers: [15×1 nnet.cnn.layer.Layer]
        Connections: [15×2 table]
         InputNames: {'input_1'}
        OutputNames: {'ClassificationLayer_activation_1'}
    
    

    Функция помощника

    В этом разделе представлен код вспомогательной функции findCustomLayers используется в этом примере. findCustomLayers возвращает indices пользовательских слоев, которые importTensorFlowNetwork автоматически генерирует.

    function indices = findCustomLayers(layers,PackageName)
    
    s = what(['.\' PackageName]);
    
    indices = zeros(1,length(s.m));
    for i = 1:length(layers)
        for j = 1:length(s.m)
            if strcmpi(class(layers(i)),[PackageName(2:end) '.' s.m{j}(1:end-2)])
                indices(j) = i;
            end
        end
    end
    
    end

    Входные параметры

    свернуть все

    Имя папки, содержащей модель TensorFlow, заданное как вектор символов или строковый скаляр. modelFolder должен находиться в текущей папке, или необходимо указать полный или относительный путь к папке. modelFolder должен содержать файл saved_model.pbи подпапку variables. Он также может содержать подпапки assets и assets.extra.

    • Файл saved_model.pb содержит график слоев архитектуру и параметры обучения (для примера, оптимизатора, потерь и метрики).

    • Подпапка variables содержит веса, выученные предварительно обученной сетью TensorFlow. По умолчанию, importTensorFlowLayers импортирует веса.

    • Подпапка assets содержит дополнительные файлы (для примера, словарей), которые может использовать график слоев. importTensorFlowLayers не импортирует файлы в assets.

    • Подпапка assets.extra содержит дополнительные файлы (для примера, информацию для пользователей), которые сосуществуют с графиком слоев.

    Пример: 'MobileNet'

    Пример: './MobileNet'

    Аргументы в виде пар имя-значение

    Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

    Пример: importTensorFlowLayers(modelFolder,'TargetNetwork','dagnetwork','OutputLayerType','classification') импортирует слоев сети и веса из modelFolderсохраняет автоматически сгенерированные пользовательские слои в пакете +modelFolder в текущей папке указывает, что импортированные слои совместимы с DAGNetwork Объект и добавляет слой выхода классификации к концу импортированных слоев.

    Имя пакета, в котором importTensorFlowLayers сохраняет пользовательские слои, заданные как вектор символов или строковый скаляр. importTensorFlowLayers сохраняет пользовательский пакет слоев + PackageName в текущей папке. Если вы не задаете 'PackageName', затем importTensorFlowLayers сохраняет пользовательские слои в пакете с именем + modelFolder в текущей папке. Для получения дополнительной информации о пакетах см. Раздел «Пакеты создают пространства имен».

    importTensorFlowLayers пытается сгенерировать пользовательский слой при импорте пользовательского слоя TensorFlow или если программа не может преобразовать слой TensorFlow в эквивалентный встроенный слой MATLAB. importTensorFlowLayers сохраняет каждый сгенерированный пользовательский слой в отдельное .m файл в + PackageName. Чтобы просмотреть или изменить пользовательский слой, откройте связанную .m файл. Дополнительные сведения о пользовательских слоях см. в разделе «Глубокое обучение пользовательских слоёв».

    Пакет + PackageName может также содержать подпакет +ops, который содержит операторы TensorFlow, которые используются в автоматически сгенерированных пользовательских слоях. importTensorFlowLayers сохраняет связанную функцию MATLAB для каждого оператора в отдельном .m файл в подпакете +ops. Функции объекта dlnetwork, таких как predict function, используйте эти операторы при взаимодействии с пользовательскими слоями.

    Пример: 'PackageName','MobileNet'

    Пример: 'PackageName','CustomLayers'

    Целевой тип сети Deep Learning Toolbox для импортированной сетевой архитектуры, заданный как 'dagnetwork' или 'dlnetwork'.

    • Если вы задаете 'TargetNetwork' как 'dagnetwork'импортированная сетевая архитектура совместима со DAGNetwork объект. В этом случае импортированные lgraph должен включать выходной слой, заданный функцией сохраненной модели TensorFlow или аргументом имя-значение 'OutputLayerType'.

    • Если вы задаете 'TargetNetwork' как 'dlnetwork'импортированная сетевая архитектура совместима со dlnetwork объект. В этом случае импортированные lgraph не включает слой выхода.

    Пример: 'TargetNetwork','dlnetwork' импортирует LayerGraph объект, совместимый с dlnetwork объект.

    Тип выхода слоя, который importTensorFlowLayers добавляется в конец импортированной сетевой архитектуры, заданный как 'classification', 'regression', или 'pixelclassification'. Добавление pixelClassificationLayer Для объекта (Computer Vision Toolbox) требуется Computer Vision Toolbox™.

    • Если вы задаете 'TargetNetwork' как 'dagnetwork' и сохраненную модель в modelFolder не задает функцию потерь, вы должны назначить значение аргументу имя-значение 'OutputLayerType'. A DAGNetwork объект должен иметь слой выхода.

    • Если вы задаете 'TargetNetwork' как 'dlnetwork', importTensorFlowLayers игнорирует аргумент имя-значение 'OutputLayerType'. A dlnetwork объект не имеет слоя выхода.

    Пример: 'OutputLayerType','classification'

    Размер входных изображений для сети, заданный как вектор двух или трех числовых значений, соответствующих [height,width] для полутоновых изображений и [height,width,channels] для цветных изображений, соответственно. Сеть использует эту информацию, когда saved_model.pb файл в modelFolder не задает размер входа.

    Пример: 'ImageInputSize',[28 28]

    Индикатор для отображения информации о прогрессе импорта в командном окне, заданный в виде числа или логического 1 (true) или 0 (false).

    Пример: 'Verbose','true'

    Выходные аргументы

    свернуть все

    Сетевая архитектура, возвращенная как LayerGraph объект.

    Чтобы использовать импортированный график слоев для предсказания, необходимо преобразовать LayerGraph объект в DAGNetwork или dlnetwork объект. Задайте аргумент имя-значение 'TargetNetwork' как 'dagnetwork' или 'dlnetwork' в зависимости от предполагаемого рабочего процесса.

    • Преобразуйте LayerGraph в DAGNetwork при помощи assembleNetwork. На DAGNetwork объект, затем вы предсказываете метки классов используя classify функция.

    • Преобразуйте LayerGraph в dlnetwork при помощи dlnetwork. На dlnetwork объект, затем вы предсказываете метки классов используя predict функция. Задайте входные данные как dlarray использование правильного формата данных (для получения дополнительной информации см. fmt аргумент dlarray).

    Ограничения

    • importTensorFlowLayers поддерживает версии TensorFlow v2.0, v2.1, v.2.2 и v2.3.

    Подробнее о

    свернуть все

    Слои TensorFlow-Keras, поддерживаемые для преобразования во встроенные слои MATLAB

    importTensorFlowLayers поддерживает следующие типы слоев TensorFlow-Keras для преобразования во встроенные слои MATLAB с некоторыми ограничениями.

    Слой TensorFlow-KerasСоответствующий слой набора Deep Learning Toolbox
    AddadditionLayer

    Activation, с именами активации:

    • 'elu'

    • 'relu'

    • 'linear'

    • 'softmax'

    • 'sigmoid'

    • 'swish'

    • 'tanh'

    Слои:

    Расширенная активация:

    • ELU

    • Softmax

    • ReLU

    • LeakyReLU

    • PReLu*

    Слои:

    AveragePooling2DaveragePooling2dLayer с PaddingValue задается как 'mean'
    BatchNormalizationbatchNormalizationLayer
    Bidirectional(LSTM(__))bilstmLayer
    ConcatenatedepthConcatenationLayer
    Conv2Dconvolution2dLayer
    Conv2DTransposetransposedConv2dLayer
    CuDNNGRUgruLayer
    CuDNNLSTMlstmLayer
    DensefullyConnectedLayer
    DepthwiseConv2DgroupedConvolution2dLayer
    DropoutdropoutLayer
    EmbeddingwordEmbeddingLayer (Symbolic Math Toolbox)
    Flattennnet.keras.layer.FlattenCStyleLayer
    GlobalAveragePooling2DglobalAveragePooling2dLayer
    GlobalMaxPooling2DglobalMaxPooling2dLayer
    GRUgruLayer
    InputimageInputLayer, sequenceInputLayer, или featureInputLayer
    LSTMlstmLayer
    MaxPooling2DmaxPooling2dLayer
    MultiplymultiplicationLayer
    SeparableConv2DgroupedConvolution2dLayer или convolution2dLayer
    TimeDistributedsequenceFoldingLayer перед обернутым слоем и sequenceUnfoldingLayer после обернутого слоя
    UpSampling2Dresize2dLayer(Набор Image Processing Toolbox)
    UpSampling3Dresize3dLayer(Набор Image Processing Toolbox)
    ZeroPadding2Dnnet.keras.layer.ZeroPadding2DLayer

    * Для слоя PReLU, importTensorFlowLayers заменяет векторный параметр масштабирования на среднее значение векторных элементов. Можно изменить параметр обратно на вектор после импорта. Для получения примера смотрите Импорт Слоя Keras PReLU.

    Поддерживаемые функции TensorFlow-Keras Loss

    importTensorFlowLayers поддерживает следующие функции потерь Keras:

    • mean_squared_error

    • categorical_crossentropy

    • sparse_categorical_crossentropy

    • binary_crossentropy

    Совет

    • Если импортированная сеть содержит слой, не поддерживаемый для преобразования во встроенный слой MATLAB (см. TensorFlow-Keras Слои, поддерживаемые для преобразования во встроенные слои MATLAB) и importTensorFlowLayers не генерирует пользовательский слой автоматически, importTensorFlowLayers вставляет слой заполнителя вместо неподдерживаемого слоя. Чтобы найти имена и индексы неподдерживаемых слоев в сети, используйте findPlaceholderLayers функция. Затем можно заменить слой-заполнитель новым слоем, который вы задаете. Чтобы заменить слой, используйте replaceLayer.

    • importTensorFlowLayers может импортировать сети TensorFlow, созданные с помощью последовательного или функционального API TensorFlow-Keras.

    • Чтобы использовать предварительно обученную сеть для предсказания или передачи обучения на новых изображениях, необходимо предварительно обработать изображения так же, как были предварительно обработаны изображения, которые использовались для обучения импортированной модели. Наиболее распространенными этапами предварительной обработки являются изменение размера изображений, вычитание средних значений изображений и преобразование изображений из BGR-изображений в RGB.

      • Чтобы изменить размер изображений, используйте imresize. Для примера, imresize(image,[227,227,3]).

      • Для преобразования изображений из RGB в формат BGR используйте flip. Для примера, flip(image,3).

      Для получения дополнительной информации о предварительной обработке изображений для обучения и предсказания, см. «Предварительная обработка изображений для глубокого обучения».

    • Члены пакета + PackageName (пользовательские слои и операторы TensorFlow) недоступны, если родительская папка пакета отсутствует в пути MATLAB. Для получения дополнительной информации смотрите Пакеты и Путь MATLAB.

    Альтернативная функциональность

    Использовать importTensorFlowNetwork или importTensorFlowLayers для импорта сети TensorFlow в сохраненном формате модели [2]. Кроме того, если сеть находится в HDF5 или JSON формате, используйте importKerasNetwork или importKerasLayers для импорта сети.

    Ссылки

    [2] Использование формата SavedModel. https://www.tensorflow.org/guide/saved_model.

    Введенный в R2021a