Me cuesta interpretar la diferencia de codificación Keras para el etiquetado de secuencia de uno a muchos (por ejemplo, clasificación de imágenes individuales) y de muchos a muchos (por ejemplo, clasificación de secuencias de imágenes). Frecuentemente veo dos tipos diferentes de códigos:
El tipo 1 es donde no se aplica TimeDistributed de esta manera:
model=Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode="valid", input_shape=[1, 56,14]))
model.add(Activation("relu"))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Reshape((56*14,)))
model.add(Dropout(0.25))
model.add(LSTM(5))
model.add(Dense(50))
model.add(Dense(nb_classes))
model.add(Activation("softmax"))
Tipo 2 es donde TimeDistributed se aplica así:
model = Sequential()
model.add(InputLayer(input_shape=(5, 224, 224, 3)))
model.add(TimeDistributed(Convolution2D(64, (3, 3))))
model.add(TimeDistributed(MaxPooling2D((2,2), strides=(2,2))))
model.add(LSTM(10))
model.add(Dense(3))
Mis preguntas son:
¿Es correcto mi suposición de que el Tipo 1 es del tipo uno a muchos y el Tipo 2 es el tipo de muchos a muchos? ¿O
TimeDistributed
no tiene relevancia en este aspecto?En cualquier caso de uno a muchos o de muchos a muchos, se supone que la última capa densa tiene 1 nodo "largo" (emitiendo solo un valor por turno) y
la capa recurrente anterior es responsable de determinar cuántos
1 largo valor a emitir? ¿O se supone que la última capa densa consta de N nodos dondeN=max sequence length
? Si es así, ¿cuál es el punto de
usar RNN aquí cuando podríamos producir una entrada similar con múltiples
salidas con N estimadores "vainilla" paralelos?¿Cómo definir el número de pasos de tiempo en RNN? ¿Se
correlaciona de alguna manera con la longitud de la secuencia de salida o es solo un
hiperparámetro para ajustar?En el caso de mi ejemplo de Tipo 1 anterior, ¿cuál es el punto de aplicar
LSTM cuando el modelo emite solo una predicción de clase (de posible
nb_classes
)? ¿Qué pasa si uno omite la capa LSTM?
Respuestas:
El punto de usar cualquier capa recurrente es hacer que la salida sea el resultado no solo de un solo elemento independiente de otros elementos, sino más bien de una secuencia de elementos, de modo que el resultado de la operación de la capa en un elemento de la secuencia sea el resultado tanto de ese elemento como de cualquier elemento anterior en la secuencia El número de pasos de tiempo define cuánto dura esa secuencia. Es decir, cuántos elementos deben manejarse en una secuencia y afectar el resultado resultante de cada uno.
Una capa LSTM opera de tal manera que acepta entradas en el formulario número_de_pasos, dimensiones_de_cada_elemento. Si el parámetro return_sequences se establece en False, que es el valor predeterminado, la capa "compone" las entradas de todos los pasos de tiempo en una sola salida. Si considera una secuencia de, digamos 10 elementos, una capa LSTM con return_sequences establecida en False producirá a partir de dicha secuencia un único elemento de salida, y los atributos de este único elemento serán el resultado de todos los elementos (pasos de tiempo) en el secuencia. Esto es lo que desea en el caso de un diseño de muchos a uno.
Una capa LSTM con return_sequences establecida en True producirá una salida para cada elemento (paso de tiempo) en una secuencia de entrada. Esto se hace de tal manera que, en cualquier momento, la salida dependerá no solo del elemento que se está utilizando actualmente, sino también de los elementos anteriores de la secuencia. Esto es lo que desea en el caso de un diseño de muchos a muchos.
Como una capa LSTM toma una secuencia de elementos como entrada, cualquier capa antes de una capa LSTM en su modelo necesitará producir una secuencia como salida. En el caso de su modelo Tipo 1, las primeras capas no operan en secuencias, sino en un solo elemento a la vez. Por lo tanto, esto no produce una secuencia de elementos sobre los cuales operar para el LSTM.
El uso de TimeDistributed hace posible que una capa opere en cada elemento de una secuencia sin que los elementos se afecten entre sí. Las capas distribuidas en el tiempo operan así en secuencias de elementos, pero no hay recursividad.
En el caso de su modelo de tipo 2, las primeras capas producirán una secuencia de 5 pasos de largo, y las operaciones realizadas en cada uno de los elementos de la secuencia serán independientes entre sí, ya que las capas envueltas en TimeDistributed no son recurrentes. Como la capa LSTM utiliza la configuración predeterminada, return_sequences = False, la capa LSTM producirá una única salida para cada secuencia de 5 elementos.
El número final de nodos de salida en su modelo depende completamente del caso de uso. Un solo nodo es adecuado para algo como la clasificación binaria o para producir algún tipo de puntuación.
fuente
Creo que podrías usar mi trabajo anterior. En este código, creo ondas sinusoidales (de longitudes de onda y fases aleatorias) y entreno un LSTM a una secuencia de puntos desde estas ondas sinusoidales y produzco una secuencia de 150 puntos completando cada onda sinusoidal.
Este es el modelo:
Y este es el guión completo:
fuente