exponenta event banner

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. При импорте этих слоев программа автоматически создает пользовательские слои.

    В этом примере используется вспомогательная функция findCustomLayers. Для просмотра кода этой функции см. раздел Вспомогательная функция.

    Укажите папку модели.

    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 в текущей папке.

    Поиск индексов автоматически создаваемых пользовательских слоев с помощью вспомогательной функции 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 используйте эти операторы при взаимодействии с пользовательскими слоями.

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

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

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

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

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

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

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

    • При указании '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' в зависимости от предполагаемого рабочего процесса.

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

    • Преобразовать a 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Соответствующий слой набора инструментов для глубокого обучения
    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(Панель инструментов для анализа текста)
    Flattennnet.keras.layer.FlattenCStyleLayer
    GlobalAveragePooling2DglobalAveragePooling2dLayer
    GlobalMaxPooling2DglobalMaxPooling2dLayer
    GRUgruLayer
    InputimageInputLayer, sequenceInputLayer, или featureInputLayer
    LSTMlstmLayer
    MaxPooling2DmaxPooling2dLayer
    MultiplymultiplicationLayer
    SeparableConv2DgroupedConvolution2dLayer или convolution2dLayer
    TimeDistributedsequenceFoldingLayer перед обернутым слоем, и sequenceUnfoldingLayer после обернутого слоя
    UpSampling2Dresize2dLayer(Панель инструментов обработки изображений)
    UpSampling3Dresize3dLayer(Панель инструментов обработки изображений)
    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 для импорта сети.

    Ссылки

    [1] ТензорПоток. https://www.tensorflow.org/.

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

    Представлен в R2021a