Main Content

train

Entrenar una red neuronal superficial

Descripción

Esta función entrena una red neuronal superficial. Para realizar deep learning con redes neuronales convolucionales o de LSTM, consulte trainNetwork en su lugar.

ejemplo

trainedNet = train(net,X,T,Xi,Ai,EW) entrena una red net según net.trainFcn y net.trainParam.

[trainedNet,tr] = train(net,X,T,Xi,Ai,EW) también devuelve un registro de entrenamiento.

ejemplo

[trainedNet,tr] = train(net,X,T,Xi,Ai,EW,Name,Value) entrena una red con opciones adicionales especificadas por uno o más argumentos de par nombre-valor.

Ejemplos

contraer todo

Aquí, la entrada x y los objetivos t definen una función simple que puede representar:

x = [0 1 2 3 4 5 6 7 8];
t = [0 0.84 0.91 0.14 -0.77 -0.96 -0.28 0.66 0.99];
plot(x,t,'o')

Aquí, feedforwardnet crea una red prealimentada de dos capas. La red tiene una capa oculta con diez neuronas.

net = feedforwardnet(10);
net = configure(net,x,t);
y1 = net(x)
plot(x,t,'o',x,y1,'x')

La red se entrena y, después, se resimula.

net = train(net,x,t);
y2 = net(x)
plot(x,t,'o',x,y1,'x',x,y2,'*')

Este ejemplo entrena una red autorregresiva no lineal de lazo abierto con entrada externa para modelar un sistema de levitación magnética definido por una corriente de control x y la respuesta de posición vertical t del imán; después, simula la red. La función preparets prepara los datos antes del entrenamiento y la simulación. Crea las entradas combinadas xo de la red de lazo abierto, que contienen tanto la entrada externa x como los valores de posición t anteriores. También prepara los estados de retardo xi.

[x,t] = maglev_dataset;
net = narxnet(10);
[xo,xi,~,to] = preparets(net,x,{},t);
net = train(net,xo,to,xi);
y = net(xo,xi)

Este mismo sistema se puede simular también en forma de lazo cerrado.

netc = closeloop(net);
view(netc)
[xc,xi,ai,tc] = preparets(netc,x,{},t);
yc = netc(xc,xi,ai);

Parallel Computing Toolbox™ permite a Deep Learning Toolbox™ simular y entrenar redes más rápido y con conjuntos de datos más grandes de los que caben en un PC. Actualmente, el entrenamiento paralelo solo es compatible con el entrenamiento de retroprogramación, no con mapas autoorganizados.

Aquí, el entrenamiento y la simulación tienen lugar en workers paralelos de MATLAB.

parpool
[X,T] = vinyl_dataset;
net = feedforwardnet(10);
net = train(net,X,T,'useParallel','yes','showResources','yes');
Y = net(X);

Utilice valores compuestos para distribuir manualmente los datos y obtener los resultados como un valor compuesto. Si se cargan los datos a la vez que se distribuyen, aunque cada elemento del conjunto de datos debe caber en la RAM, el conjunto de datos completo solo está limitado por la RAM total de todos los workers.

[X,T] = vinyl_dataset;
Q = size(X,2);
Xc = Composite;
Tc = Composite;
numWorkers = numel(Xc);
ind = [0 ceil((1:numWorkers)*(Q/numWorkers))];
for i=1:numWorkers
    indi = (ind(i)+1):ind(i+1);
    Xc{i} = X(:,indi);
    Tc{i} = T(:,indi);
end
net = feedforwardnet;
net = configure(net,X,T);
net = train(net,Xc,Tc);
Yc = net(Xc);

Observe en el ejemplo anterior que la función configure se empleó para establecer las dimensiones y los ajustes de procesamiento de las entradas de la red. Normalmente, esto sucede de forma automática cuando se llama a train, pero cuando se proporcionan datos compuestos, este paso debe realizarse manualmente con datos no compuestos.

Las redes se pueden entrenar utilizando el dispositivo con GPU actual, si Parallel Computing Toolbox lo admite. Actualmente, el entrenamiento con GPU solo es compatible con la retroprogramación, no con mapas autoorganizados.

[X,T] = vinyl_dataset;
net = feedforwardnet(10);
net = train(net,X,T,'useGPU','yes');
y = net(X); 

Para introducir datos manualmente en una GPU:

[X,T] = vinyl_dataset;
Xgpu = gpuArray(X);
Tgpu = gpuArray(T);
net = configure(net,X,T);
net = train(net,Xgpu,Tgpu);
Ygpu = net(Xgpu);
Y = gather(Ygpu); 

Observe en el ejemplo anterior que la función configure se empleó para establecer las dimensiones y los ajustes de procesamiento de las entradas de la red. Normalmente, esto sucede de forma automática cuando se llama a train, pero cuando se proporcionan datos gpuArray, este paso debe realizarse manualmente con datos que no son gpuArray.

Para ejecutar en paralelo, con los workers asignados a una GPU única diferente cada uno y workers adicionales que se ejecutan en una CPU:

net = train(net,X,T,'useParallel','yes','useGPU','yes');
y = net(X);

Utilizar solo workers con GPU únicas puede dar lugar a una velocidad mayor, ya que puede que los workers de la CPU no sigan el ritmo.

net = train(net,X,T,'useParallel','yes','useGPU','only');
Y = net(X);

En el siguiente ejemplo se ha entrenado una red con puntos de control guardados a una velocidad no mayor que una vez cada dos minutos.

[x,t] = vinyl_dataset;
net = fitnet([60 30]);
net = train(net,x,t,'CheckpointFile','MyCheckpoint','CheckpointDelay',120);

Después de un fallo del ordenador, se puede recuperar la red más reciente y utilizarla para continuar el entrenamiento desde el momento del fallo. El archivo de punto de control incluye una variable de estructura checkpoint, que incluye la red, el registro de entrenamiento, el nombre de archivo, la hora y el número.

[x,t] = vinyl_dataset;
load MyCheckpoint
net = checkpoint.net;
net = train(net,x,t,'CheckpointFile','MyCheckpoint');

Otro uso de la funcionalidad de punto de control es detener una sesión de entrenamiento paralelo (iniciada con el parámetro 'UseParallel') aunque la herramienta de entrenamiento de redes neuronales no esté disponible durante el entrenamiento paralelo. En este caso, establezca un 'CheckpointFile', utilice Ctrl+C para detener el entrenamiento en cualquier momento y, después, cargue el archivo de punto de control para obtener la red y el registro de entrenamiento.

Argumentos de entrada

contraer todo

Red de entrada, especificada como un objeto network. Para crear un objeto network, use feedforwardnet o narxnet, por ejemplo.

Entradas de la red, especificadas como una matriz de R por Q o como un arreglo de celdas de Ni por TS, donde

  • R es el tamaño de entrada

  • Q es el tamaño de lote

  • Ni = net.numInputs

  • TS es el número de unidades de tiempo

Los argumentos de train pueden tener dos formatos: matrices, para problemas estáticos y redes con entradas y salidas únicas, y arreglos de celdas, para múltiples unidades de tiempo y redes con entradas y salidas múltiples.

  • El formato de matriz se puede usar si solo hay que simular una unidad de tiempo (TS = 1). Resulta conveniente para redes con una única entrada y una única salida, pero se puede usar con redes que tengan más. Cuando la red tiene múltiples entradas, el tamaño de matriz es (suma de Ri) por Q.

  • El formato de arreglo de celdas es más general y más conveniente para redes con múltiples entradas y salidas, lo que permite presentar secuencias de entradas. Cada elemento X{i,ts} es una matriz de Ri por Q, donde Ri = net.inputs{i}.size.

Si se usan datos compuestos, 'useParallel' se establece automáticamente en 'yes'. La función toma datos compuestos y devuelve resultados compuestos.

Si se usan datos gpuArray, 'useGPU' se establece automáticamente en 'yes'. La función toma datos gpuArray y devuelve resultados gpuArray.

Nota

Si una columna de X contiene al menos un NaN, train no utiliza esa columna para entrenamiento, pruebas ni validación.

Objetivos de la red, especificados como una matriz de U por Q o como un arreglo de celdas de No por TS, donde

  • U es el tamaño de salida

  • Q es el tamaño de lote

  • No = net.numOutputs

  • TS es el número de unidades de tiempo

Los argumentos de train pueden tener dos formatos: matrices, para problemas estáticos y redes con entradas y salidas únicas, y arreglos de celdas, para múltiples unidades de tiempo y redes con entradas y salidas múltiples.

  • El formato de matriz se puede usar si solo hay que simular una unidad de tiempo (TS = 1). Resulta conveniente para redes con una única entrada y una única salida, pero se puede usar con redes que tengan más. Cuando la red tiene múltiples entradas, el tamaño de matriz es (suma de Ui) por Q.

  • El formato de arreglo de celdas es más general y más conveniente para redes con múltiples entradas y salidas, lo que permite presentar secuencias de entradas. Cada elemento T{i,ts} es una matriz de Ui por Q, donde Ui = net.outputs{i}.size.

Si se usan datos compuestos, 'useParallel' se establece automáticamente en 'yes'. La función toma datos compuestos y devuelve resultados compuestos.

Si se usan datos gpuArray, 'useGPU' se establece automáticamente en 'yes'. La función toma datos gpuArray y devuelve resultados gpuArray.

Observe que T es opcional y que solo hay que usarlo para redes que requieren objetivos.

Nota

Cualquier valor NaN en los objetivos T se trata como datos faltantes. Si un elemento de T es NaN, ese elemento no se utiliza para entrenamiento, pruebas ni validación.

Condiciones de retardo de entrada iniciales, especificadas como un arreglo de celdas de Ni por ID o como una matriz de R por (ID*Q), donde

  • ID = net.numInputDelays

  • Ni = net.numInputs

  • R es el tamaño de entrada

  • Q es el tamaño de lote

Para entradas en forma de arreglo de celdas, las columnas de Xi se ordenan desde el estado de retardo más antiguo hasta el más reciente. Xi{i,k} es la entrada i en el momento ts = k - ID.

Xi también es opcional y solo hay que usarlo para redes que tienen retardos de entrada o de capa.

Condiciones de retardo de capa iniciales, especificadas como un arreglo de celdas de Nl por LD o como una matriz de (suma de Si) por (LD*Q), donde

  • Nl = net.numLayers

  • LD = net.numLayerDelays

  • Si = net.layers{i}.size

  • Q es el tamaño de lote

Para entradas en forma de arreglo de celdas, las columnas de Ai se ordenan desde el estado de retardo más antiguo hasta el más reciente. Ai{i,k} es la salida de capa i en el momento ts = k - LD.

Pesos de errores, especificados como un arreglo de celdas de No por TS o como una matriz de (suma de Ui) por Q, donde

  • No = net.numOutputs

  • TS es el número de unidades de tiempo

  • Ui = net.outputs{i}.size

  • Q es el tamaño de lote

Para entradas en forma de arreglo de celdas, cada elemento EW{i,ts} es una matriz de Ui por Q, donde

  • Ui = net.outputs{i}.size

  • Q es el tamaño de lote

Los pesos de errores EW también pueden tener un tamaño de 1 para todos o para cualquiera de los elementos No, TS, Ui o Q. En ese caso, se extienden automáticamente las dimensiones de EW para que coincidan con los objetivos T. Esto permite ponderar de forma práctica la importancia en cualquier dimensión (como por muestra) manteniendo la misma importancia en otra (como el tiempo, con TS=1). Si todas las dimensiones son 1, por ejemplo, si EW = {1}, todos los valores objetivo se tratan con la misma importancia. Ese es el valor predeterminado de EW.

Según se indica arriba, los pesos de errores EW pueden ser de las mismas dimensiones que los objetivos T o tener algunas dimensiones establecidas en 1. Por ejemplo, si EW es de 1 por Q, las muestras objetivo tendrán distintas importancias, pero cada elemento de una muestra tendrá la misma importancia. Si EW es (suma de Ui) por 1, cada elemento de salida tiene una importancia diferente y todas las muestras se tratan con la misma importancia.

Argumentos de par nombre-valor

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.

En las versiones anteriores a la R2021a, use comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: 'useParallel','yes'

Opción para especificar cálculos paralelos, especificada como 'yes' o 'no'.

  • 'no': los cálculos tienen lugar en el hilo normal de MATLAB. Este es el ajuste de 'useParallel' por defecto.

  • 'yes': los cálculos tienen lugar en workers paralelos si hay un grupo paralelo abierto. En caso contrario, los cálculos tienen lugar en el hilo normal de MATLAB®.

Opción para especificar cálculos con GPU, especificada como 'yes', 'no' u 'only'.

  • 'no': los cálculos tienen lugar en la CPU. Este es el ajuste de 'useGPU' por defecto.

  • 'yes': los cálculos tienen lugar en el gpuDevice actual, si se trata de una GPU compatible (consulte los requisitos de GPU en Parallel Computing Toolbox). Si no se admite el gpuDevice actual, los cálculos permanecen en la CPU. Si 'useParallel' es también 'yes' y si hay un conjunto paralelo abierto, cada worker con una GPU única utiliza esa GPU; otros workers ejecutan cálculos en sus núcleos de CPU correspondientes.

  • 'only': si no hay ningún grupo paralelo abierto, este ajuste es el mismo que 'yes'. Si hay un grupo paralelo abierto, solo se usan workers con GPU únicas. Sin embargo, si hay un grupo paralelo abierto, pero no hay GPU compatibles disponibles, los cálculos vuelven a realizarse en todas las CPU de los workers.

Opción para mostrar recursos, especificada como 'yes' o 'no'.

  • 'no': no muestra los recursos de cálculo utilizados en la línea de comandos. Este es el ajuste por defecto.

  • 'yes': muestra en la línea de comandos un resumen de todos los recursos de cálculo utilizados realmente. Los recursos reales pueden diferir de los solicitados si se solicita cálculo paralelo o de GPU, pero no hay un grupo paralelo abierto, o si no hay una GPU admitida disponible. Cuando se utilizan workers paralelos, se describe el modo de cálculo de cada worker, incluidos los workers del grupo que no se utilizan.

Reducción de la memoria, especificada como un entero positivo.

En la mayoría de las redes neuronales, el modo de cálculo de entrenamiento con CPU por defecto es un algoritmo MEX compilado. Sin embargo, para redes grandes, puede que los cálculos no tengan lugar con un modo de cálculo de MATLAB. Esto se puede confirmar utilizando 'showResources'. Si se está utilizando MATLAB y la memoria es un problema, establecer la opción de reducción en un valor N mayor que 1 reduce en gran medida el almacenamiento temporal requerido para entrenar por un factor de N a cambio de tiempos de entrenamiento más largos.

Archivo de punto de control, especificado como un vector de caracteres.

El valor para 'CheckpointFile' se puede establecer en un nombre de archivo para guardar en la carpeta de trabajo actual, en una ruta de archivo de otra carpeta o en una cadena vacía para deshabilitar el guardado del punto de control (valor predeterminado).

Retardo de punto de control, especificado como entero no negativo.

El parámetro opcional 'CheckpointDelay' limita la frecuencia con la que se guarda. Limitar la frecuencia de los puntos de control puede mejorar la eficiencia, manteniendo la cantidad de tiempo durante la que se guardan los puntos de control baja en comparación con el tiempo dedicado a los cálculos. Tiene un valor predeterminado de 60, lo que significa que los guardados del punto de control no tienen lugar más de una vez por minuto. Establezca el valor de 'CheckpointDelay' en 0 si desea que los guardados del punto de control tengan lugar una vez por época.

Argumentos de salida

contraer todo

Red entrenada, devuelta como un objeto network.

Registro de entrenamiento (epoch y perf), devuelto como una estructura cuyos campos dependen de la función de entrenamiento de la red (net.NET.trainFcn). Puede incluir campos como los siguientes:

  • Funciones y parámetros de entrenamiento, división de datos y rendimiento

  • Índices de división de datos para conjuntos de entrenamiento, validación y prueba

  • Máscaras de división de datos para conjuntos de entrenamiento, validación y prueba

  • Número de épocas (num_epochs) y la mejor época (best_epoch)

  • Una lista de los nombres de estado de entrenamiento (states)

  • Los campos de cada nombre de estado que registra su valor durante el entrenamiento

  • Mejores rendimientos de la red, evaluados en cada época: mejor rendimiento en el conjunto de entrenamiento (best_perf), mejor rendimiento en el conjunto de validación (best_vperf) y mejor rendimiento en el conjunto de prueba (best_tperf)

Algoritmos

train llama a la función que indica net.trainFcn utilizando los valores de parámetros de entrenamiento que indica net.trainParam.

Una época de entrenamiento suele definirse como una presentación única de todos los vectores de entrada a la red. Después, la red se actualiza según los resultados de todas esas presentaciones.

El entrenamiento tiene lugar hasta que se produce un número máximo de épocas, se cumple el objetivo de rendimiento o se da cualquier otra condición de parada de la función net.trainFcn.

Algunas funciones de entrenamiento se desvían de esta norma y presentan un único vector de entrada (o secuencia) cada época. Se selecciona un vector de entrada (o secuencia) de forma aleatoria para cada época de los vectores de entrada concurrentes (o secuencias). competlayer devuelve redes que utilizan trainru, una función de entrenamiento que hace esto.

Historial de versiones

Introducido antes de R2006a

Consulte también

| | |