Contenido principal

imagePretrainedNetwork

Redes neuronales preentrenadas para imágenes

Desde R2024a

    Descripción

    La función imagePretrainedNetwork carga una red neuronal preentrenada y puede adaptar la arquitectura de la red neuronal para realizar la transferencia del aprendizaje y realizar ajustes.

    [net,classNames] = imagePretrainedNetwork devuelve una red neuronal SqueezeNet preentrenada y los nombres de clases de red. Esta red se ha entrenado con el conjunto de datos de ImageNet de 1000 clases.

    ejemplo

    [net,classNames] = imagePretrainedNetwork(name) devuelve la red neuronal preentrenada especificada y sus nombres de clases.

    [net,classNames] = imagePretrainedNetwork(___,Name=Value) especifica las opciones utilizando uno o más argumentos nombre-valor, además de cualquier combinación de los argumentos de entrada de las sintaxis anteriores. Por ejemplo, Weights="none" especifica la devolución de la red neuronal no inicializada, sin los pesos preentrenados.

    Ejemplos

    contraer todo

    Cargue una red neuronal SqueezeNet preentrenada y los nombres de clases de red en el área de trabajo.

    [net,classNames] = imagePretrainedNetwork;

    Visualice las propiedades de la red.

    net
    net = 
      dlnetwork with properties:
    
             Layers: [68×1 nnet.cnn.layer.Layer]
        Connections: [75×2 table]
         Learnables: [52×3 table]
              State: [0×3 table]
         InputNames: {'data'}
        OutputNames: {'prob_flatten'}
        Initialized: 1
    
      View summary with summary.
    
    

    Visualice los primeros nombres de clases.

    head(classNames)
        "tench"
        "goldfish"
        "great white shark"
        "tiger shark"
        "hammerhead"
        "electric ray"
        "stingray"
        "cock"
    

    Cargue una red neuronal SqueezeNet preentrenada en el área de trabajo.

    [net,classNames] = imagePretrainedNetwork;

    Lea una imagen de un archivo PNG y clasifíquela. Para clasificar la imagen, primero conviértala en el tipo de datos single.

    im = imread("peppers.png");
    figure
    imshow(im)

    Figure contains an axes object. The hidden axes object contains an object of type image.

    X = single(im);
    scores = predict(net,X);
    [label,score] = scores2label(scores,classNames);

    Muestre la imagen con la etiqueta predicha y la puntuación correspondiente.

    figure
    imshow(im)
    title(string(label) + " (Score: " + score + ")")

    Figure contains an axes object. The hidden axes object with title bell pepper (Score: 0.89394) contains an object of type image.

    Puede volver a entrenar redes preentrenadas para nuevos conjuntos de datos adaptando la red neuronal de forma que se ajuste a la nueva tarea y usando sus pesos aprendidos como punto de partida. Para adaptar la red a los nuevos datos, reemplace las últimas capas (conocidas como cabeza de red) de forma que genere puntuaciones de predicción para cada una de las clases de la nueva tarea.

    Cargar los datos de entrenamiento

    Extraiga el conjunto de datos MathWorks™ Merch. Se trata de un conjunto de datos pequeño que contiene 75 imágenes de artículos promocionales de MathWorks que pertenecen a cinco clases distintas. Los datos están dispuestos de manera que las imágenes estén en subcarpetas que corresponden a estas cinco clases.

    folderName = "MerchData";
    unzip("MerchData.zip",folderName);

    Cree un almacén de datos de imágenes. Un almacén de datos de imágenes permite almacenar grandes colecciones de datos de imágenes, incluidos los que no caben en la memoria, y leer eficazmente lotes de imágenes durante el entrenamiento de una red neuronal. Especifique la carpeta con las imágenes extraídas e indique que los nombres de las subcarpetas corresponden a las etiquetas de las imágenes.

    imds = imageDatastore(folderName, ...
        IncludeSubfolders=true, ...
        LabelSource="foldernames");

    Visualice algunas imágenes de muestra.

    numImages = numel(imds.Labels);
    idx = randperm(numImages,16);
    I = imtile(imds,Frames=idx);
    figure
    imshow(I)

    Visualice los nombres de las clases y el número de clases.

    classNames = categories(imds.Labels)
    classNames = 5×1 cell
        {'MathWorks Cap'          }
        {'MathWorks Cube'         }
        {'MathWorks Playing Cards'}
        {'MathWorks Screwdriver'  }
        {'MathWorks Torch'        }
    
    
    numClasses = numel(classNames)
    numClasses = 
    5
    

    Divida los datos en conjuntos de datos de entrenamiento y de validación. Utilice el 70% de las imágenes para el entrenamiento, el 15% para la validación y el 15% para la prueba. La función splitEachLabel divide el almacén de datos de imágenes en dos nuevos almacenes de datos.

    [imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.7,0.15,"randomized");

    Cargar una red preentrenada

    Cargue una red neuronal SqueezeNet preentrenada en el área de trabajo. Para devolver una red neuronal lista para volver a ser entrenada para los datos nuevos, especifique el número de clases.

    net = imagePretrainedNetwork(NumClasses=numClasses)
    net = 
      dlnetwork with properties:
    
             Layers: [68×1 nnet.cnn.layer.Layer]
        Connections: [75×2 table]
         Learnables: [52×3 table]
              State: [0×3 table]
         InputNames: {'data'}
        OutputNames: {'prob_flatten'}
        Initialized: 1
    
      View summary with summary.
    
    

    Obtenga el tamaño de entrada de la red neuronal de la capa de entrada.

    inputSize = net.Layers(1).InputSize
    inputSize = 1×3
    
       227   227     3
    
    

    La capa que se puede aprender de la cabeza de red (la última capa con parámetros que se pueden aprender) requiere un nuevo entrenamiento. Esta suele ser una capa totalmente conectada o una capa convolucional con un tamaño de salida que coincide con el número de clases.

    Para elevar el nivel de las actualizaciones de esta capa y acelerar la convergencia, aumente el factor de tasa de aprendizaje de los parámetros que se pueden aprender usando la función setLearnRateFactor. Establezca los factores de tasa de aprendizaje de los parámetros que se pueden aprender en 10.

    net = setLearnRateFactor(net,"conv10/Weights",10);
    net = setLearnRateFactor(net,"conv10/Bias",10);

    Preparar los datos para el entrenamiento

    Las imágenes del almacén de datos pueden tener diferentes tamaños. Para cambiar automáticamente el tamaño de las imágenes de entrenamiento, utilice un almacén de datos de imágenes aumentado. El aumento de datos también ayuda a evitar que la red se sobreajuste y memorice los detalles exactos de las imágenes de entrenamiento. Especifique estas operaciones de aumento adicionales para realizar en las imágenes de entrenamiento: voltear aleatoriamente las imágenes de entrenamiento a lo largo del eje vertical y trasladarlas aleatoriamente hasta 30 píxeles horizontal y verticalmente.

    pixelRange = [-30 30];
    
    imageAugmenter = imageDataAugmenter( ...
        RandXReflection=true, ...
        RandXTranslation=pixelRange, ...
        RandYTranslation=pixelRange);
    
    augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
        DataAugmentation=imageAugmenter);

    Para cambiar automáticamente el tamaño de las imágenes de validación y prueba sin realizar más aumentos de datos, utilice un almacén de datos de imágenes aumentadas sin especificar ninguna operación adicional de preprocesamiento.

    augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
    augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

    Especificar las opciones de entrenamiento

    Especifique las opciones de entrenamiento. Para escoger entre las opciones se requiere un análisis empírico. Para explorar diferentes configuraciones de opciones de entrenamiento mediante la ejecución de experimentos, puede utilizar la app Experiment Manager.

    Para este ejemplo, use las opciones siguientes:

    • Entrenar usando el optimizador Adam.

    • Para reducir el nivel de las actualizaciones a los pesos preentrenados, utilice una tasa de aprendizaje más pequeña. Establezca la tasa de aprendizaje en 0.0001.

    • Valide la red usando los datos de validación cada cinco iteraciones. Para conjuntos de datos más grandes, para impedir que la validación ralentice el entrenamiento, aumente este valor.

    • Muestre el progreso del entrenamiento en una gráfica y monitorice la métrica de precisión.

    • Deshabilite la salida detallada.

    options = trainingOptions("adam", ...
        InitialLearnRate=0.0001, ...
        ValidationData=augimdsValidation, ...
        ValidationFrequency=5, ...
        Plots="training-progress", ...
        Metrics="accuracy", ...
        Verbose=false);

    Entrenar redes neuronales

    Entrene la red neuronal con la función trainnet. Para la clasificación, utilice la pérdida de entropía cruzada. De forma predeterminada, la función trainnet usa una GPU en caso de que esté disponible. Para utilizar una GPU se requiere una licencia de Parallel Computing Toolbox™ y un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). De lo contrario, la función trainnet usa la CPU. Para especificar el entorno de ejecución, utilice la opción de entrenamiento ExecutionEnvironment.

    net = trainnet(augimdsTrain,net,"crossentropy",options);

    Probar una red neuronal

    Pruebe la red neuronal con la función testnet. Evalúe la precisión de la clasificación de una sola etiqueta. La precisión es el porcentaje de predicciones correctas. De forma predeterminada, la función testnet usa una GPU en caso de que esté disponible. Para seleccionar el entorno de ejecución manualmente, utilice el argumento ExecutionEnvironment de la función testnet.

    accuracy = testnet(net,augimdsTest,"accuracy")
    accuracy = 
    100
    

    Hacer predicciones

    Lea y muestre una imagen de prueba.

    im = imread("MerchDataTest.jpg");
    figure
    imshow(im)

    Utilice la red neuronal para hacer una predicción. Para hacer una predicción con una sola imagen, convierta la imagen al tipo de datos single y utilice la función predict. Para usar una GPU, si está disponible, primero convierta los datos a gpuArray. Para hacer predicciones con varias imágenes, utilice la función minibatchpredict.

    X = single(im);
    
    if canUseGPU
        X = gpuArray(X);
    end
    
    scores = predict(net,X);
    label = scores2label(scores,classNames);

    Muestre la imagen y la predicción.

    figure
    imshow(im)
    title("Prediction: " + string(label))

    Argumentos de entrada

    contraer todo

    Nombre de la red neuronal preentrenada, especificado como uno de estos valores:

    Argumento del nombre de modelo de imagePretrainedNetworkNombre de la red neuronalProfundidadMemoria de parámetrosParámetros (millones)Tamaño de entrada de imagenIntervalo de valores de entradaNormalización de capas de entradaPaquete de soporte requerido
    "squeezenet"SqueezeNet [2] 18

    4,7 MB

    1.24

    227 por 227

    [0, 255]"zerocenter"Ninguno
    "googlenet"GoogLeNet [3][4]22

    27 MB

    7.0

    224 por 224

    [0, 255]"zerocenter"

    Deep Learning Toolbox™ Model for GoogLeNet Network

    "googlenet-places365"[0, 255]"zerocenter"
    "inceptionv3"Inception-v3 [5]48

    91 MB

    23.9

    299 por 299

    [0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Inception-v3 Network
    "densenet201"DenseNet-201 [6] 201

    77 MB

    20.0

    224 por 224

    [0, 255]"zscore"Deep Learning Toolbox Model for DenseNet-201 Network
    "mobilenetv2"MobileNet-v2 [7]53

    14 MB

    3.5

    224 por 224

    [0, 255]"zscore"Deep Learning Toolbox Model for MobileNet-v2 Network
    "resnet18"ResNet-18 [8]18

    45 MB

    11.7

    224 por 224

    [0, 255]"zscore"Deep Learning Toolbox Model for ResNet-18 Network
    "resnet50"ResNet-50 [8]50

    98 MB

    25.6

    224 por 224

    [0, 255]"zscore"Deep Learning Toolbox Model for ResNet-50 Network
    "resnet101"ResNet-101 [8]101

    171 MB

    44.6

    224 por 224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for ResNet-101 Network
    "xception"Xception [9]71

    88 MB

    22.9299 por 299[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Xception Network
    "inceptionresnetv2"Inception-ResNet-v2 [10] 164

    213 MB

    55.9

    299 por 299

    [0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Inception-ResNet-v2 Network
    "shufflenet"ShuffleNet [11]505,5 MB1.4224 por 224[0, 255]"zscore"Deep Learning Toolbox Model for ShuffleNet Network
    "nasnetmobile"NASNet-Mobile [12]*20 MB 5.3224 por 224[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for NASNet-Mobile Network
    "nasnetlarge"NASNet-Large [12]*340 MB88.9331 por 331[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for NASNet-Large Network
    "darknet19"DarkNet-19 [13]1980 MB20.8256 por 256[0, 255]"rescale-zero-one"Deep Learning Toolbox Model for DarkNet-19 Network
    "darknet53"DarkNet-53 [13]53159 MB41.6256 por 256[0, 255]"rescale-zero-one"Deep Learning Toolbox Model for DarkNet-53 Network
    "efficientnetb0"EfficientNet-b0 [14]8220 MB5.3

    224 por 224

    [0, 255]"zscore"Deep Learning Toolbox Model for EfficientNet-b0 Network
    "alexnet"AlexNet [15]8

    233 MB

    61.0

    227 por 227

    [0, 255]"zerocenter"Deep Learning Toolbox Model for AlexNet Network
    "vgg16"VGG-16 [16]16

    528 MB

    138

    224 por 224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for VGG-16 Network
    "vgg19"VGG-19 [16]19

    548 MB

    144

    224 por 224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for VGG-19 Network

    Nota

    Si establece la opción Weights en "none", para la mayoría de los modelos no es necesario descargar el paquete de soporte.

    Argumentos de par nombre-valor

    contraer todo

    Especifique pares de argumentos opcionales como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos de nombre-valor deben aparecer después de otros argumentos. Sin embargo, el orden de los pares no importa.

    Ejemplo: net = imagePretrainedNetwork("googlenet",NumClasses=10) devuelve una red neuronal GoogLeNet preentrenada lista para volver a ser entrenada para una tarea de clasificación de 10 clases.

    Número de clases para tareas de clasificación, especificado como entero positivo o [].

    Si NumClasses es un entero, la función imagePretrainedNetwork adapta la red neuronal preentrenada para tareas de clasificación con el número especificado de clases reemplazando la capa que se puede aprender en la cabeza de clasificación de la red.

    Si especifica la opción NumClasses, NumResponses debe ser [] y la función no debe generar el argumento classNames.

    Tipos de datos: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    Número de respuestas para tareas de regresión, especificado como entero positivo o [].

    Si NumResponses es un entero, la función imagePretrainedNetwork adapta la red neuronal preentrenada para tareas de regresión con el número de respuestas especificado reemplazando la cabeza de clasificación de la red con una cabeza para tareas de regresión.

    Si especifica la opción NumResponses, NumClasses debe ser [] y la función no debe generar el argumento classNames.

    Tipos de datos: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    Pesos de la red neuronal, especificados como uno de estos valores:

    • "pretrained": devuelve la red neuronal con sus pesos preentrenados.

    • "none": solo devuelve la arquitectura de la red neuronal no inicializada. En este caso, la mayoría de las redes no requieren la descarga de un paquete de soporte.

    Tipo de nombre de clase, especificado como uno de estos valores:

    • "string": devuelve nombres de clase como arreglo de cadenas.

    • "cell": devuelve nombres de clase como arreglo de celdas de vector de caracteres. Use esta opción para la generación de código.

    Argumentos de salida

    contraer todo

    Red neuronal, devuelta como un objeto dlnetwork.

    Nombres de clase, devueltos como arreglo de cadenas o arreglo de celdas de vector de caracteres.

    La función devuelve nombres de clase solo cuando tanto el valor NumClasses como el valor NumResponses son []. El tipo de datos de classNames depende del argumento ClassNamesTypes.

    Tipos de datos: string | cell

    Sugerencias

    • Para crear y personalizar arquitecturas de la red neuronal ResNet 2D y 3D, utilice las funciones resnetNetwork y resnet3dNetwork, respectivamente.

    Referencias

    [1] ImageNet. http://www.image-net.org.

    [2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. “SqueezeNet: AlexNet-Level Accuracy with 50x Fewer Parameters and <0.5MB Model Size.” Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

    [3] Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. “Going Deeper with Convolutions.” In 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 1–9. Boston, MA, USA: IEEE, 2015. https://doi.org/10.1109/CVPR.2015.7298594.

    [4] Places. http://places2.csail.mit.edu/

    [5] Szegedy, Christian, Vincent Vanhoucke, Sergey Ioffe, Jon Shlens, and Zbigniew Wojna. “Rethinking the Inception Architecture for Computer Vision.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2818–26. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.308.

    [6] Huang, Gao, Zhuang Liu, Laurens Van Der Maaten, and Kilian Q. Weinberger. “Densely Connected Convolutional Networks.” In 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2261–69. Honolulu, HI: IEEE, 2017. https://doi.org/10.1109/CVPR.2017.243.

    [7] Sandler, Mark, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, and Liang-Chieh Chen. “MobileNetV2: Inverted Residuals and Linear Bottlenecks.” In 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition, 4510–20. Salt Lake City, UT: IEEE, 2018. https://doi.org/10.1109/CVPR.2018.00474.

    [8] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. “Deep Residual Learning for Image Recognition.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 770–78. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.90.

    [9] Chollet, François. “Xception: Deep Learning with Depthwise Separable Convolutions.” Preprint, submitted in 2016. https://doi.org/10.48550/ARXIV.1610.02357.

    [10] Szegedy, Christian, Sergey Ioffe, Vincent Vanhoucke, and Alexander Alemi. “Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning.” Proceedings of the AAAI Conference on Artificial Intelligence 31, no. 1 (February 12, 2017). https://doi.org/10.1609/aaai.v31i1.11231.

    [11] Zhang, Xiangyu, Xinyu Zhou, Mengxiao Lin, and Jian Sun. “ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices.” Preprint, submitted July 4, 2017. http://arxiv.org/abs/1707.01083.

    [12] Zoph, Barret, Vijay Vasudevan, Jonathon Shlens, and Quoc V. Le. “Learning Transferable Architectures for Scalable Image Recognition.” Preprint, submitted in 2017. https://doi.org/10.48550/ARXIV.1707.07012.

    [13] Redmon, Joseph. “Darknet: Open Source Neural Networks in C.” https://pjreddie.com/darknet.

    [14] Tan, Mingxing, and Quoc V. Le. “EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks.” Preprint, submitted in 2019. https://doi.org/10.48550/ARXIV.1905.11946.

    [15] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Communications of the ACM 60, no. 6 (May 24, 2017): 84–90. https://doi.org/10.1145/3065386.

    [16] Simonyan, Karen, and Andrew Zisserman. “Very Deep Convolutional Networks for Large-Scale Image Recognition.” Preprint, submitted in 2014. https://doi.org/10.48550/ARXIV.1409.1556.

    Capacidades ampliadas

    expandir todo

    Historial de versiones

    Introducido en R2024a