Main Content

Definir capas de deep learning personalizadas

Sugerencia

En esta sección se explica cómo definir capas de deep learning personalizadas para usarlas en sus problemas. Para ver una lista de capas integradas en Deep Learning Toolbox™, consulte Lista de capas de deep learning.

Si Deep Learning Toolbox no proporciona la capa que necesita para la tarea, puede definir su propia capa personalizada usando este tema como guía. Después de definir la capa personalizada, puede comprobar automáticamente que es válida y compatible con la GPU, y que devuelve como salida gradientes correctamente definidos.

Arquitectura de capas de red neuronal

Durante el entrenamiento, el software realiza de forma iterativa pases hacia delante y hacia atrás a través de la red.

Durante un pase hacia delante a través de la red, cada capa coge las salidas de las capas anteriores, aplica una función y luego devuelve como salida (propagación hacia delante) los resultados a las siguientes capas. Las capas que tienen estado, como las capas de LSTM, también actualizan su estado.

Las capas pueden tener varias entradas o salidas. Por ejemplo, una capa puede coger X1, …, XN de varias capas anteriores y propagar hacia delante las salidas Y1, …, YM a las siguientes capas.

Al final de cada pase hacia delante de la red, el software calcula la pérdida L entre las predicciones y los objetivos.

Durante el pase hacia atrás a través de la red, cada capa coge las derivadas de la pérdida con respecto a las salidas de la capa, calcula las derivadas de la pérdida L con respecto a las entradas y propaga los resultados hacia atrás. Si la capa cuenta con parámetros que se aprenden, también calculará las derivadas de los pesos de la capa (parámetros que se aprenden). El software usa las derivadas de los pesos para actualizar los parámetros que se aprenden.

Este gráfico muestra el flujo de datos a través de una red neuronal profunda y destaca el flujo de datos a través de una capa con una única entrada X, una única salida Y y un parámetro que se aprende W.

Network diagram showing the flow of data through a neural network during training.

Plantilla de capa personalizada

Para definir una capa personalizada, use esta plantilla de definición de clase. Esta plantilla proporciona la estructura de una definición de clase de capa personalizada. Esboza lo siguiente:

  • Los bloques opcionales properties para las propiedades de la capa, los parámetros que se aprenden y los parámetros de estado. Para obtener más información, consulte Propiedades de capas personalizadas.

  • La función de constructor de la capa.

  • La función predict y la función opcional forward. Para obtener más información, consulte Funciones hacia delante.

  • La función opcional resetState para capas con propiedades de estado. Para obtener más información, consulte Función de restablecimiento del estado.

  • La función opcional backward. Para obtener más información, consulte Función hacia atrás.

classdef myLayer < nnet.layer.Layer % ...
        % & nnet.layer.Formattable ... % (Optional) 
        % & nnet.layer.Acceleratable % (Optional)

    properties
        % (Optional) Layer properties.

        % Declare layer properties here.
    end

    properties (Learnable)
        % (Optional) Layer learnable parameters.

        % Declare learnable parameters here.
    end

    properties (State)
        % (Optional) Layer state parameters.

        % Declare state parameters here.
    end

    properties (Learnable, State)
        % (Optional) Nested dlnetwork objects with both learnable
        % parameters and state parameters.

        % Declare nested networks with learnable and state parameters here.
    end

    methods
        function layer = myLayer()
            % (Optional) Create a myLayer.
            % This function must have the same name as the class.

            % Define layer constructor function here.
        end

        function layer = initialize(layer,layout)
            % (Optional) Initialize layer learnable and state parameters.
            %
            % Inputs:
            %         layer  - Layer to initialize
            %         layout - Data layout, specified as a networkDataLayout
            %                  object
            %
            % Outputs:
            %         layer - Initialized layer
            %
            %  - For layers with multiple inputs, replace layout with 
            %    layout1,...,layoutN, where N is the number of inputs.
            
            % Define layer initialization function here.
        end
        

        function [Y,state] = predict(layer,X)
            % Forward input data through the layer at prediction time and
            % output the result and updated state.
            %
            % Inputs:
            %         layer - Layer to forward propagate through 
            %         X     - Input data
            % Outputs:
            %         Y     - Output of layer forward function
            %         state - (Optional) Updated layer state
            %
            %  - For layers with multiple inputs, replace X with X1,...,XN, 
            %    where N is the number of inputs.
            %  - For layers with multiple outputs, replace Y with 
            %    Y1,...,YM, where M is the number of outputs.
            %  - For layers with multiple state parameters, replace state 
            %    with state1,...,stateK, where K is the number of state 
            %    parameters.

            % Define layer predict function here.
        end

        function [Y,state,memory] = forward(layer,X)
            % (Optional) Forward input data through the layer at training
            % time and output the result, the updated state, and a memory
            % value.
            %
            % Inputs:
            %         layer - Layer to forward propagate through 
            %         X     - Layer input data
            % Outputs:
            %         Y      - Output of layer forward function 
            %         state  - (Optional) Updated layer state 
            %         memory - (Optional) Memory value for custom backward
            %                  function
            %
            %  - For layers with multiple inputs, replace X with X1,...,XN, 
            %    where N is the number of inputs.
            %  - For layers with multiple outputs, replace Y with 
            %    Y1,...,YM, where M is the number of outputs.
            %  - For layers with multiple state parameters, replace state 
            %    with state1,...,stateK, where K is the number of state 
            %    parameters.

            % Define layer forward function here.
        end

        function layer = resetState(layer)
            % (Optional) Reset layer state.

            % Define reset state function here.
        end

        function [dLdX,dLdW,dLdSin] = backward(layer,X,Y,dLdY,dLdSout,memory)
            % (Optional) Backward propagate the derivative of the loss
            % function through the layer.
            %
            % Inputs:
            %         layer   - Layer to backward propagate through 
            %         X       - Layer input data 
            %         Y       - Layer output data 
            %         dLdY    - Derivative of loss with respect to layer 
            %                   output
            %         dLdSout - (Optional) Derivative of loss with respect 
            %                   to state output
            %         memory  - Memory value from forward function
            % Outputs:
            %         dLdX   - Derivative of loss with respect to layer input
            %         dLdW   - (Optional) Derivative of loss with respect to
            %                  learnable parameter 
            %         dLdSin - (Optional) Derivative of loss with respect to 
            %                  state input
            %
            %  - For layers with state parameters, the backward syntax must
            %    include both dLdSout and dLdSin, or neither.
            %  - For layers with multiple inputs, replace X and dLdX with
            %    X1,...,XN and dLdX1,...,dLdXN, respectively, where N is
            %    the number of inputs.
            %  - For layers with multiple outputs, replace Y and dLdY with
            %    Y1,...,YM and dLdY,...,dLdYM, respectively, where M is the
            %    number of outputs.
            %  - For layers with multiple learnable parameters, replace 
            %    dLdW with dLdW1,...,dLdWP, where P is the number of 
            %    learnable parameters.
            %  - For layers with multiple state parameters, replace dLdSin
            %    and dLdSout with dLdSin1,...,dLdSinK and 
            %    dLdSout1,...,dldSoutK, respectively, where K is the number
            %    of state parameters.

            % Define layer backward function here.
        end
    end
end

Entradas y salidas con formato

Usar objetos dlarray facilita el trabajo con datos de múltiples dimensiones, ya que permite etiquetar las dimensiones. Por ejemplo, puede etiquetar qué dimensiones corresponden a las dimensiones de espacio, tiempo, canal y lote usando las etiquetas "S", "T", "C" y "B", respectivamente. Para dimensiones no especificadas y otras dimensiones, use la etiqueta "U". Para las funciones de objeto dlarray que operan sobre dimensiones concretas, puede especificar las etiquetas de dimensión formateando el objeto dlarray directamente o usando la opción DataFormat.

Usar objetos dlarray con formato en capas personalizadas también permite definir capas en las que las entradas y salidas tienen formatos diferentes, como las capas que permutan, añaden o eliminan dimensiones. Por ejemplo, puede definir una capa que tome como entrada un minilote de imágenes con el formato "SSCB" (espacial, espacial, canal, lote) y como salida un minilote de secuencias con el formato "CBT" (canal, lote, tiempo). Usar objetos dlarray con formato también permite definir capas que pueden operar sobre datos con diferentes formatos de entrada, como capas que admiten entradas con los formatos "SSCB" (espacial, espacial, canal, lote) y "CBT" (canal, lote, tiempo).

Si no se especifica una función hacia atrás, de forma predeterminada, las funciones de capa reciben objetos dlarray sin formato como entrada. Para especificar que la capa recibe como entrada objetos dlarray con formato y devuelve como salida objetos dlarray con formato, herede también de la clase nnet.layer.Formattable al definir la capa personalizada.

Para ver un ejemplo de cómo definir una capa personalizada con entradas con formato, consulte Define Custom Deep Learning Layer with Formatted Inputs.

Aceleración de capas personalizadas

Si no se especifica una función hacia atrás al definir una capa personalizada, el software determina automáticamente los gradientes usando la diferenciación automática.

Cuando se entrena una red con una capa personalizada sin función hacia atrás, el software traza cada objeto dlarray de entrada de la función hacia adelante de la capa personalizada para determinar la gráfica de cálculo que se usa para la diferenciación automática. Este proceso de trazado puede llevar algo de tiempo y terminar recalculando el mismo trazado. Mediante la optimización, el almacenamiento en caché y la reutilización de los trazados, se puede acelerar el cálculo del gradiente al entrenar una red. El software también puede reutilizar estos trazados para acelerar las predicciones de la red después del entrenamiento.

El trazado depende del tamaño, el formato y el tipo de datos subyacentes de las entradas de la capa. Es decir, la capa activa un nuevo trazado para las entradas con un tamaño, formato o tipo de datos subyacente no contenidos en la memoria caché. Las entradas que solo se diferencien en el valor de un trazado previamente almacenado en caché no activan otro nuevo.

Para indicar que la capa personalizada admite aceleración, herede también de la clase nnet.layer.Acceleratable al definir la capa personalizada. Cuando una capa personalizada hereda de nnet.layer.Acceleratable, el software almacena automáticamente en caché los trazados al pasar datos a través de un objeto dlnetwork.

Por ejemplo, para indicar que la capa personalizada myLayer admite aceleración, use esta sintaxis

classdef myLayer < nnet.layer.Layer & nnet.layer.Acceleratable
    ...
end

Consideraciones relativas a la aceleración

Debido a la naturaleza de los trazados en caché, no todas las funciones admiten la aceleración.

El proceso de almacenamiento en caché puede guardar valores o estructuras de código que cabría esperar que cambiaran o que dependieran de factores externos. Debe tener cuidado al acelerar capas personalizadas que:

  • Generen números aleatorios.

  • Usen instrucciones if y bucles while con condiciones que dependan de los valores de los objetos dlarray.

Dado que el proceso de almacenamiento en caché requiere un cálculo adicional, la aceleración puede hacer que, en algunos casos, el código tarde más en ejecutarse. Este escenario puede darse cuando el software dedica tiempo a crear nuevas memorias caché que no se reutilizan con frecuencia. Por ejemplo, cuando se pasan varios minilotes de diferentes longitudes de secuencia a la función, el software activa un nuevo trazado para cada longitud de secuencia única.

Cuando la aceleración de capas personalizadas causa ralentización, puede desactivar la aceleración eliminando la clase Acceleratable o desactivando la aceleración de las funciones predict y forward del objeto dlnetwork estableciendo la opción Acceleration en "none".

Para obtener más información sobre cómo activar el soporte para la aceleración de capas personalizadas, consulte Custom Layer Function Acceleration.

Propiedades de capas personalizadas

Declare las propiedades de la capa en la sección properties de la definición de la clase.

De forma predeterminada, las capas personalizadas tienen estas propiedades. No declare estas propiedades en la sección properties.

PropiedadDescripción
NameNombre de la capa, especificado como un vector de caracteres o un escalar de cadena. Para entradas en forma de arreglo Layer, las funciones trainnet y dlnetwork asignan automáticamente nombres a las capas con el nombre "".
Description

Descripción de una línea de la capa, especificada como un escalar de cadena o un vector de caracteres. Esta descripción aparece cuando la capa se muestra en un arreglo Layer.

Si no especifica una descripción de capa, el software muestra el nombre de la clase de capa.

Type

Tipo de la capa, especificado como un vector de caracteres o un escalar de cadena. El valor de Type aparece cuando la capa se muestra en un arreglo Layer.

Si no especifica un tipo de capa, el software muestra el nombre de la clase de capa.

NumInputsNúmero de entradas de la capa, especificado como entero positivo. Si no especifica este valor, el software establece automáticamente NumInputs en el número de nombres de InputNames. El valor predeterminado es 1.
InputNamesNombres de entrada de la capa, especificados como un arreglo de celdas de vectores de caracteres. Si no especifica este valor y NumInputs es mayor que 1, el software establece automáticamente InputNames en {'in1',...,'inN'}, donde N es igual a NumInputs. El valor predeterminado es {'in'}.
NumOutputsNúmero de salidas de la capa, especificado como entero positivo. Si no especifica este valor, el software establece automáticamente NumOutputs en el número de nombres de OutputNames. El valor predeterminado es 1.
OutputNamesNombres de salida de la capa, especificados como un arreglo de celdas de vectores de caracteres. Si no especifica este valor y NumOutputs es mayor que 1, el software establece automáticamente OutputNames en {'out1',...,'outM'}, donde M es igual a NumOutputs. El valor predeterminado es {'out'}.

Si la capa no tiene otras propiedades, puede omitir la sección properties.

Sugerencia

Si está creando una capa con varias entradas, debe establecer las propiedades NumInputs o InputNames en el constructor de la capa. Si está creando una capa con varias salidas, debe establecer las propiedades NumOutputs o OutputNames en el constructor de la capa. Para ver un ejemplo, consulte Define Custom Deep Learning Layer with Multiple Inputs.

Parámetros que se pueden aprender

Declare los parámetros de la capa que se pueden aprender en la sección properties (Learnable) de la definición de la clase.

Puede especificar arreglos numéricos u objetos dlnetwork como parámetros que se pueden aprender. Si el objeto dlnetwork tiene parámetros que se pueden aprender y parámetros de estado (por ejemplo, un objeto dlnetwork que contiene una capa LSTM), debe especificarlo en la sección properties (Learnable, State). Si la capa no tiene parámetros que se pueden aprender, podrá omitir las secciones properties con el atributo Learnable.

Si lo desea, puede especificar el factor de la tasa de aprendizaje y el factor L2 de los parámetros que se pueden aprender. De forma predeterminada, cada parámetro que se puede aprender tiene un factor de tasa de aprendizaje y un factor L2 establecidos en 1. Tanto para las capas integradas como para las personalizadas, puede establecer y obtener los factores de la tasa de aprendizaje y los factores de regularización L2 mediante las siguientes funciones.

FunciónDescripción
setLearnRateFactorEstablece el factor de la tasa de aprendizaje de un parámetro que se puede aprender.
setL2FactorEstablece el factor de regularización L2 de un parámetro que se puede aprender.
getLearnRateFactorObtiene el factor de la tasa de aprendizaje de un parámetro que se puede aprender.
getL2FactorObtiene el factor de regularización L2 de un parámetro que se puede aprender.

Para especificar el factor de la tasa de aprendizaje y el factor L2 de un parámetro que se puede aprender, use las sintaxis layer = setLearnRateFactor(layer,parameterName,value) y layer = setL2Factor(layer,parameterName,value), respectivamente.

Para obtener el valor del factor de la tasa de aprendizaje y del factor L2 de un parámetro que se puede aprender, use las sintaxis getLearnRateFactor(layer,parameterName) y getL2Factor(layer,parameterName), respectivamente.

Por ejemplo, esta sintaxis establece el factor de la tasa de aprendizaje del parámetro que se puede aprender "Alpha" en 0.1.

layer = setLearnRateFactor(layer,"Alpha",0.1);

Parámetros de estado

En el caso de las capas con estado, como las capas recurrentes, declare los parámetros de estado de la capa en la sección properties (State) de la definición de la clase. Si el parámetro que se puede aprender es un objeto dlnetwork que tiene parámetros que se pueden aprender y parámetros de estado (por ejemplo, un objeto dlnetwork que contiene una capa LSTM), debe especificar la propiedad correspondiente en la sección properties (Learnable, State). Si la capa no tiene parámetros de estado, podrá omitir las secciones properties con el atributo State.

Si la capa tiene parámetros de estado, las funciones hacia delante deben devolver también el estado actualizado de la capa. Para obtener más información, consulte Funciones hacia delante.

Para especificar una función de estado de restablecimiento personalizada, incluya una función con la sintaxis layer = resetState(layer) en la definición de la clase. Para obtener más información, consulte Función de restablecimiento del estado.

No se admite el entrenamiento paralelo de redes que contengan capas personalizadas con parámetros de estado que usen la función trainnet. Cuando se entrena una red con capas personalizadas con parámetros de estado, la opción de entrenamiento ExecutionEnvironment debe ser "auto", "gpu" o "cpu".

Inicialización de parámetros que se pueden aprender y de estado

Puede indicar que se inicialicen los parámetros que se pueden aprender y los parámetros de estado de la capa en la función de construcción de la capa o en una función initialize personalizada:

  • Si la inicialización de los parámetros que se pueden aprender o de los parámetros de estado no requiere información sobre el tamaño de la entrada de la capa (por ejemplo, los pesos que se pueden aprender de una capa de suma ponderada son vectores cuyo tamaño coincide con el número de entradas de la capa), puede inicializar los pesos en la función de construcción de la capa. Para ver un ejemplo, consulte Define Custom Deep Learning Layer with Multiple Inputs.

  • Si la inicialización de los parámetros que se pueden aprender o de los parámetros de estado requiere información sobre el tamaño de la entrada de la capa (por ejemplo, los pesos que se pueden aprender de una capa SReLU son vectores cuyo tamaño coincide con el número de entradas de la capa), puede inicializar los pesos en la función de construcción de la capa. Para ver un ejemplo, consulte Define Custom Deep Learning Layer with Learnable Parameters.

Funciones hacia delante

Algunas capas se comportan de forma diferente durante el entrenamiento y durante la predicción. Por ejemplo, una capa de abandono realiza el abandono solo durante el entrenamiento y no tiene ningún efecto durante la predicción. Una capa usa una de estas dos funciones para realizar un pase hacia delante: predict o forward. Si el pase hacia adelante es en el momento de la predicción, la capa usa la función predict. Si el pase hacia adelante es en el momento del entrenamiento, la capa usa la función forward. Si no necesita dos funciones diferentes para el momento de la predicción y el momento del entrenamiento, puede omitir la función forward. En caso de necesitarlas, la capa usa predict en el momento del entrenamiento.

Si la capa tiene parámetros de estado, las funciones hacia delante deben devolver los parámetros de estado actualizados de la capa como arreglos numéricos.

Si define tanto una función forward personalizada como una función backward personalizada, la función hacia delante debe devolver una salida memory.

La sintaxis de la función predict depende del tipo de capa.

  • Y = predict(layer,X) reenvía los datos de entrada X a través de la capa y devuelve como salida el resultado Y, donde layer tiene una única entrada y una única salida.

  • [Y,state] = predict(layer,X) también devuelve como salida el parámetro de estado actualizado state, donde layer tiene un único parámetro de estado.

Puede ajustar las sintaxis para capas con varias entradas, varias salidas o varios parámetros de estado:

  • Para capas con varias entradas, sustituya X por X1,...,XN, donde N es el número de entradas. La propiedad NumInputs debe coincidir con N.

  • En el caso de capas con varias salidas, sustituya Y por Y1,...,YM, donde M es el número de salidas. La propiedad NumOutputs debe coincidir con M.

  • Para capas con varios parámetros de estado, sustituya state por state1,...,stateK, donde K es el número de parámetros de estado.

Sugerencia

Si el número de entradas en la capa puede variar, use varargin en lugar de X1,…,XN. En este caso, varargin es un arreglo de celdas de las entradas, donde varargin{i} corresponde a Xi.

Si el número de salidas puede variar, use varargout en lugar de Y1,…,YM. En este caso, varargout es un arreglo de celdas de las salidas, donde varargout{j} corresponde a Yj.

Sugerencia

Si la capa personalizada tiene un objeto dlnetwork para un parámetro que se puede aprender, en la función predict de la capa personalizada, use la función predict para dlnetwork. Al hacerlo, la función predict del objeto dlnetwork usa las operaciones de capa adecuadas para realizar la predicción. Si el objeto dlnetwork tiene parámetros de estado, también devuelve el estado de la red.

La sintaxis de la función forward depende del tipo de capa:

  • Y = forward(layer,X) reenvía los datos de entrada X a través de la capa y devuelve como salida el resultado Y, donde layer tiene una única entrada y una única salida.

  • [Y,state] = forward(layer,X) también devuelve como salida el parámetro de estado actualizado state, donde layer tiene un único parámetro de estado.

  • [__,memory] = forward(layer,X) también devuelve un valor de memoria para una función backward personalizada mediante cualquiera de las sintaxis anteriores. Si la capa tiene tanto una función forward personalizada como una función backward personalizada, la función hacia delante debe devolver un valor de memoria.

Puede ajustar las sintaxis para capas con varias entradas, varias salidas o varios parámetros de estado:

  • Para capas con varias entradas, sustituya X por X1,...,XN, donde N es el número de entradas. La propiedad NumInputs debe coincidir con N.

  • Para capas con varias salidas, sustituya Y por Y1,...,YM, donde M es el número de salidas. La propiedad NumOutputs debe coincidir con M.

  • Para capas con varios parámetros de estado, sustituya state por state1,...,stateK, donde K es el número de parámetros de estado.

Sugerencia

Si el número de entradas en la capa puede variar, use varargin en lugar de X1,…,XN. En este caso, varargin es un arreglo de celdas de las entradas, donde varargin{i} corresponde a Xi.

Si el número de salidas puede variar, use varargout en lugar de Y1,…,YM. En este caso, varargout es un arreglo de celdas de las salidas, donde varargout{j} corresponde a Yj.

Sugerencia

Si la capa personalizada tiene un objeto dlnetwork para un parámetro que se puede aprender, en la función forward de la capa personalizada, use la función forward del objeto dlnetwork. Al hacerlo, la función forward del objeto dlnetwork usa las operaciones de capa adecuadas para realizar el entrenamiento.

Las dimensiones de las entradas dependen del tipo de datos y de la salida de las capas conectadas.

Entrada de la capaEjemplo
FormaFormato de los datos
Imágenes 2D

Arreglo numérico de h por w por c por N, donde h, w, c y N son la altura, la anchura, el número de canales de las imágenes y el número de observaciones, respectivamente.

"SSCB"
Imágenes 3DArreglo numérico de h por w por d por c por N, en el que h, w, d, c y N son la altura, la anchura, el número de canales de las imágenes y el número de observaciones de las imágenes, respectivamente."SSSCB"
Secuencias de vectores

Matriz de c por N por s, donde c es el número de características de la secuencia, N es el número de observaciones de la secuencia y s es la longitud de la secuencia.

"CBT"
Secuencias de imágenes 2D

Arreglo de h por w por c por N por s, donde h, w y c corresponden a la altura, la anchura y el número de canales de la imagen, respectivamente, N es el número de observaciones de la secuencia de la imagen y s es la longitud de la secuencia.

"SSCBT"
Secuencias de imágenes 3D

Arreglo de h por w por d por c por N por s, donde h, w, d y c corresponden a la altura, la anchura, la profundidad y el número de canales de la imagen, respectivamente, N es el número de observaciones de la secuencia de la imagen y s es la longitud de la secuencia.

"SSSCBT"
CaracterísticasArreglo de c por N, donde c es el número de características y N es el número de observaciones."CB"

Las capas que producen secuencias como salida pueden producir secuencias de cualquier longitud o datos sin dimensión de tiempo.

Las salidas de las funciones hacia delante de la capa personalizada no deben ser complejas. Si las funciones predict o forward de su capa personalizada implican números complejos, convierta todas las salidas a valores reales antes de devolverlas. Usar números complejos en las funciones predict o forward de su capa personalizada puede dar lugar a parámetros complejos que se pueden aprender. Si usa la diferenciación automática (en otras palabras, no está escribiendo una función hacia atrás para su capa personalizada), convierta todos los parámetros que se pueden aprender en valores reales al principio del cálculo de la función. De este modo, se garantiza que las salidas de las funciones hacia atrás generadas automáticamente no sean complejas.

Función de restablecimiento del estado

De forma predeterminada, la función resetState para objetos dlnetwork no tiene ningún efecto sobre las capas personalizadas con parámetros de estado. Para definir el comportamiento de capa de la función resetState para objetos de red, defina la función de capa resetState opcional en la definición de capa que restablece los parámetros de estado.

La función resetState debe tener la sintaxis layer = resetState(layer), donde la capa devuelta tiene las propiedades de restablecimiento de estado.

La función resetState no debe establecer ninguna propiedad de capa, excepto aquellas que se pueden aprender y las propiedades de estado. Si la función establece otras propiedades de la capa, esta podría comportarse de forma inesperada. (desde R2023a)

Función hacia atrás

La función hacia atrás de la capa calcula las derivadas de la pérdida con respecto a los datos de entrada y, a continuación, devuelve como salida (propaga hacia atrás) los resultados a la capa anterior. Si la capa tiene parámetros que se pueden aprender (por ejemplo, los pesos de la capa), backward también calcula las derivadas de estos. Cuando se usa la función trainnet, la capa actualiza automáticamente los parámetros que se pueden aprender usando estas derivadas durante el paso hacia atrás.

Definir la función hacia atrás es opcional. Si no se especifica una función hacia atrás y las funciones hacia delante de la capa admiten objetos dlarray, el software determina automáticamente la función hacia atrás mediante diferenciación automática. Para obtener una lista de las funciones que admiten objetos dlarray, consulte List of Functions with dlarray Support. Defina una función hacia atrás personalizada cuando desee:

  • Usar un algoritmo específico para calcular las derivadas.

  • Usar operaciones en las funciones hacia delante que no admitan objetos dlarray.

Las capas personalizadas con objetos dlnetwork que se pueden aprender no admiten funciones hacia atrás personalizadas.

Para definir una función hacia atrás personalizada, cree una denominada backward.

La sintaxis de la función backward depende del tipo de capa.

  • dLdX = backward(layer,X,Y,dLdY,memory) devuelve las derivadas dLdX de la pérdida con respecto a la entrada de la capa, donde layer tiene una única entrada y una única salida. Y corresponde a la salida de la función hacia delante y dLdY corresponde a la derivada de la pérdida con respecto a Y. La entrada memory de la función corresponde a la salida de memoria de la función hacia delante.

  • [dLdX,dLdW] = backward(layer,X,Y,dLdY,memory) también devuelve la derivada dLdW de la pérdida con respecto al parámetro que se puede aprender, donde layer tiene un único parámetro que se puede aprender.

  • [dLdX,dLdSin] = backward(layer,X,Y,dLdY,dLdSout,memory) también devuelve la derivada dLdSin de la pérdida con respecto a la entrada del estado, donde layer tiene un único parámetro de estado y dLdSout corresponde a la derivada de la pérdida con respecto a la salida de estado de la capa.

  • [dLdX,dLdW,dLdSin] = backward(layer,X,Y,dLdY,dLdSout,memory) también devuelve la derivada dLdW de la pérdida con respecto al parámetro que se puede aprender y devuelve la derivada dLdSin de la pérdida con respecto a la entrada de estado de la capa, donde layer tiene un único parámetro de estado y un único parámetro que se puede aprender.

Puede ajustar las sintaxis para capas con varias entradas, varias salidas, varios parámetros que se pueden aprender o varios parámetros de estado:

  • Para capas con varias entradas, sustituya X y dLdX por X1,...,XN y dLdX1,...,dLdXN, respectivamente, donde N es el número de entradas.

  • Para capas con varias salidas, sustituya Y y dLdY por Y1,...,YM y dLdY1,...,dLdYM, respectivamente, donde M es el número de salidas.

  • Para capas con varios parámetros que se pueden aprender, sustituya dLdW por dLdW1,...,dLdWP, donde P es el número de parámetros que se pueden aprender.

  • Para capas con varios parámetros de estado, sustituya dLdSin y dLdSout por dLdSin1,...,dLdSinK y dLdSout1,...,dLdSoutK, respectivamente, donde K es el número de parámetros de estado.

Para reducir el uso de memoria evitando que las variables que no se usan se guarden entre el paso hacia delante y el paso hacia atrás, sustituya los argumentos de entrada correspondientes por ~.

Sugerencia

Si el número de entradas a backward puede variar, use varargin después de layer, en lugar de los argumentos de entrada. En este caso, varargin es un arreglo de celdas de las entradas, donde los primeros N elementos corresponden a las N entradas de la capa, los siguientes M elementos corresponden a las M salidas de la capa, los siguientes M elementos corresponden a las derivadas de la pérdida con respecto a las M salidas de la capa, los siguientes K elementos corresponden a las K derivadas de la pérdida con respecto a las K salidas de estado, y el último elemento corresponde a memory.

Si el número de salidas puede variar, use varargout en lugar de argumentos de salida. En este caso, varargout es un arreglo de celdas de las salidas, donde los primeros N elementos corresponden a las N derivadas de la pérdida con respecto a las N entradas de la capa, los siguientes P elementos corresponden a las derivadas de la pérdida con respecto a los P parámetros que se pueden aprender y los siguientes K elementos corresponden a las derivadas de la pérdida con respecto a las K entradas de estado.

Los valores de X e Y son los mismos que en las funciones hacia delante. Las dimensiones de dLdY son las mismas que las dimensiones de Y.

Las dimensiones y el tipo de datos de dLdX son los mismos que las dimensiones y el tipo de datos de X. Las dimensiones y los tipos de datos de dLdW son los mismos que las dimensiones y tipos de datos de W.

Para calcular las derivadas de la pérdida, puede usar la regla de la cadena:

LX(i)=jLYjYjX(i)

LWi=jLYjYjWi

Cuando se usa la función trainnet, la capa actualiza automáticamente los parámetros que se pueden aprender usando las derivadas dLdW durante el paso hacia atrás.

Para ver un ejemplo de cómo definir una función hacia atrás personalizada, consulte Specify Custom Layer Backward Function.

Las salidas de la función hacia atrás de la capa personalizada no deben ser complejas. Si la función hacia atrás implica números complejos, convierta todas las salidas de la función hacia atrás en valores reales antes de devolverlas.

Compatibilidad con la GPU

Si las funciones hacia delante de la capa admiten objetos dlarray, la capa es compatible con la GPU. En caso contrario, para ser compatibles con la GPU, las funciones de la capa deben admitir entradas y devolver salidas de tipo gpuArray (Parallel Computing Toolbox).

Muchas funciones integradas de MATLAB® admiten argumentos de entrada gpuArray (Parallel Computing Toolbox) y dlarray. Para obtener una lista de las funciones que admiten objetos dlarray, consulte List of Functions with dlarray Support. Para obtener una lista de las funciones que se ejecutan en una GPU, consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox). Para utilizar una GPU para deep learning, debe también disponer de un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). Para obtener más información sobre cómo trabajar con GPU en MATLAB, consulte GPU Computing in MATLAB (Parallel Computing Toolbox).

Compatibilidad con la generación de código

Para crear una capa personalizada que admita la generación de código, debe ocurrir lo siguiente:

  • La capa debe especificar el pragma %#codegen en la definición de la capa.

  • Las entradas y la salida de las funciones hacia delante de la capa deben tener el mismo tamaño de lote.

  • Las propiedades no escalares deben ser un arreglo simple, doble o de caracteres.

  • Las propiedades escalares deben ser de tipo numérico, lógico o cadena.

La generación de código C estándar, C++ o CUDA (cuando la opción TargetLibrary de DeepLearningConfig es "none") admite capas personalizadas con entradas que contienen solo dimensiones de espacio, canal, lote y tiempo. En caso contrario, solo admite capas personalizadas con imágenes 2D o entrada de características. La generación de código no admite capas personalizadas con propiedades de estado (propiedades con atributo State).

Para ver un ejemplo de cómo crear una capa personalizada que admita la generación de código, consulte Define Custom Deep Learning Layer for Code Generation.

Composición de red

Para crear una capa personalizada que defina por sí misma una red neuronal, puede declarar un objeto dlnetwork como parámetro que se puede aprender en la sección properties (Learnable) de la definición de la capa. Este método se conoce como composición de red. Puede usar la composición de red para lo siguiente:

  • Crear una red con estructuras de control, por ejemplo, una red con una sección que pueda cambiar dinámicamente en función de los datos de entrada.

  • Crear una red con bucles; por ejemplo, una red con secciones que retroalimenten la salida.

  • Implementar el reparto de pesos; por ejemplo, en redes en las que diferentes datos deben pasar por las mismas capas, como las redes neuronales gemelas o las redes generativas antagónicas (GAN).

En el caso de redes anidadas que tienen parámetros que se pueden aprender y parámetros de estado, como las redes con normalización de lotes o las capas LSTM, declare la red en la sección properties (Learnable, State) de la definición de la capa.

Compatibilidad con la GPU

Si las funciones hacia delante de la capa admiten objetos dlarray, la capa es compatible con la GPU. En caso contrario, para ser compatibles con la GPU, las funciones de la capa deben admitir entradas y devolver salidas de tipo gpuArray (Parallel Computing Toolbox).

Muchas funciones integradas de MATLAB admiten argumentos de entrada gpuArray (Parallel Computing Toolbox) y dlarray. Para obtener una lista de las funciones que admiten objetos dlarray, consulte List of Functions with dlarray Support. Para obtener una lista de las funciones que se ejecutan en una GPU, consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox). Para utilizar una GPU para deep learning, debe también disponer de un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). Para obtener más información sobre cómo trabajar con GPU en MATLAB, consulte GPU Computing in MATLAB (Parallel Computing Toolbox).

Comprobar la validez de una capa

Si crea una capa de deep learning personalizada, puede utilizar la función checkLayer para comprobar si es válida. La función comprueba la validez de las capas, la compatibilidad con la GPU, si los gradientes están correctamente definidos y la compatibilidad con la generación de código. Para comprobar si una capa es válida, ejecute el siguiente comando:

checkLayer(layer,layout)
layer es una instancia de la capa y layout es un objeto networkDataLayout que especifica los tamaños y formatos de datos válidos para las salidas de la capa. Para realizar una comprobación con varias observaciones, utilice la opción ObservationDimension. Para comprobar la compatibilidad con la generación de código, establezca la opción CheckCodegenCompatibility en 1 (true). Para entradas de gran tamaño, las comprobaciones de gradiente tardan más en ejecutarse. Para acelerar el proceso, especifique un tamaño de entrada válido más pequeño.

Para obtener más información, consulte Check Custom Layer Validity.

Comprobar la validez de una capa personalizada usando checkLayer

Compruebe la validez de la capa personalizada sreluLayer.

La capa personalizada sreluLayer, que se adjunta a este ejemplo como archivo de apoyo, aplica la operación SReLU a los datos de entrada. Para acceder a esta capa, abra el ejemplo como un script en vivo.

Cree una instancia de la capa.

layer = sreluLayer;

Cree un objeto networkDataFormat que especifique el tamaño de entrada esperado y el formato de la entrada típica a la capa. Especifique un tamaño de entrada válido de [24 24 20 128], donde las dimensiones corresponden a la altura, anchura, número de canales y número de observaciones de la salida de la capa anterior. Especifique el formato como "SSCB" (espacial, espacial, canal, lote).

validInputSize = [24 24 20 128];
layout = networkDataLayout(validInputSize,"SSCB");

Compruebe la validez de la capa con checkLayer.

checkLayer(layer,layout)
Skipping GPU tests. No compatible GPU device found.
 
Skipping code generation compatibility tests. To check validity of the layer for code generation, specify the CheckCodegenCompatibility and ObservationDimension options.
 
Running nnet.checklayer.TestLayerWithoutBackward
.......... ..........
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 20 Passed, 0 Failed, 0 Incomplete, 14 Skipped.
	 Time elapsed: 0.21645 seconds.

La función no detecta ningún problema con la capa.

Consulte también

| | | | | | | | | | | |

Temas relacionados