Keras: ¿Cómo definir la forma de entrada para la primera capa DENSE?
Soy nuevo en el aprendizaje profundo y keras.
Consulte el siguiente código.
1) Quiero confirmar la terminología. Antes de procesar para crear lotes mediante el Generador de series temporales, hay 10 muestras. Después de procesar por el Generador, ¿es correcto decir que hay 8 muestras en 1 lote?
2) No entiendo por qué yhat difiere cuando defino la forma de entrada de la primera capa como ‘input_shape’ vs ‘input_dim’. yhat debería ser solo (1,1) – un valor único.
3) Si en cambio, uso una capa de RNN simple como mi primera capa, ¿cuál debería ser la forma de entrada?
Gracias
univariable un paso problema con mlp
desde numpy importar matriz
desde keras.models importar secuencial
desde keras.layers importar densa
desde keras.preprocessing.sequence importar TimeseriesGenerator
definir conjunto de datos
series = matriz([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 10 muestras antes del procesamiento por el Generador
definir generador
timestep = 2
generador = TimeseriesGenerator(series, series, length=timestep, batch_size=8)
número de lotes
imprimir('Lotes: %d' % len(generador))
OUT --> Lotes: 1
imprimir cada lote
para i en rango(len(generador)):
x, y = generador[i]
imprimir('%s => %s' % (x, y))
OUT:
[[1 2]
[2 3]
[3 4]
[4 5]
[5 6]
[6 7]
[7 8]
[8 9]] => [ 3 4 5 6 7 8 9 10]
Después del procesamiento por el Generador, hay 8 muestras en 1 lote.
x, y = generador[0]
imprimir(x.shape)
definir modelo
modelo = secuencial()
TensorFlow asume que la primera dimensión es el tamaño del lote que puede tener cualquier tamaño, por lo que no es necesario definirlo. La segunda D es el número de pasos de tiempo. La tercera D es el número de características
1ª CAPA con forma de entrada definida por input_shape
modelo.add(densa(100, activation='relu', input_shape=(timestep,1)))
1ª CAPA con forma de entrada definida por input_dim
modelo.add(densa(100, activation='relu', input_dim=timestep))
modelo.add(densa(1))
modelo.compilar(optimizer='adam', loss='mse')
ajustar modelo
modelo.fit_generator(generador, steps_per_epoch=1, epochs=200, verbose=0)
hacer una predicción de un paso fuera de la muestra
x_input = matriz([9, 10]).reshape((1, timestep))
imprimir(x_input.shape)
yhat = modelo.predict(x_input, verbose=0)
imprimir(yhat)
OUT: [[9.3066435, 10.239568]] si la forma de la primera capa es input_shape
OUT: [[11.545249]] si la forma de la primera capa es input_dim
davy.ai
Respuestas
Sí, después de ser procesado por TimeSeriesGenerator, hay 8 muestras en 1 lote. La longitud de cada lote es 2 y el tamaño del lote es 8, por lo que hay un total de 8 secuencias en cada lote.
La diferencia en yhat probablemente se debe a la diferencia en la forma de los datos de entrada que el modelo está recibiendo. Cuando se utiliza
input_shape
, el modelo espera datos de entrada con forma(tamaño_lote, paso_tiempo, características)
, mientras que cuando se utilizainput_dim
, el modelo espera datos de entrada con forma(tamaño_lote, características)
. Esta diferencia puede hacer que el modelo se comporte de manera diferente y produzca una salida diferente.Si se utilizara una capa RNN simple como primera capa, la forma de entrada seguiría siendo
(paso_tiempo, características)
como en el caso de usarinput_shape
para la capa Dense. La capa RNN simple también espera datos de entrada con forma(tamaño_lote, paso_tiempo, características)
.