tutorial redes neuronales libreria learning imagenes espaƱol ejemplos convolucionales clasificador python machine-learning neural-network keras convolution

python - redes - La dimensionalidad de Keras en la falta de coincidencia de la capa convolucional



redes neuronales convolucionales python (1)

Bueno, me parece que necesitas google un poco más sobre redes convolucionales :-)

Está aplicando en cada paso 32 filtros de longitud 2 sobre su secuencia. Entonces, si seguimos las dimensiones de los tensores después de cada capa:

Dimensiones: (Ninguno, 32, 1)

model.add(k.layers.convolutional.Convolution1D(32,2, input_shape = (32, 1))) model.add(k.layers.Activation(''relu''))

Dimensiones: (Ninguno, 31, 32) (su filtro de longitud 2 recorre toda la secuencia, por lo que ahora la secuencia es de longitud 31)

model.add(k.layers.convolutional.Convolution1D(32,2)) model.add(k.layers.Activation(''relu''))

Dimensiones: (Ninguno, 30, 32) (pierde nuevamente un valor debido a sus filtros de longitud 2, pero todavía tiene 32 de ellos)

model.add(k.layers.convolutional.Convolution1D(32,2)) model.add(k.layers.Activation(''relu''))

Dimensiones: (Ninguno, 29, 32) (lo mismo ...)

model.add(k.layers.convolutional.Convolution1D(32,2)) model.add(k.layers.Activation(''relu''))

Dimensiones: (Ninguno, 28, 32)

Ahora quiere usar una capa Densa encima de eso ... la cosa es que la capa Densa funcionará como sigue en su entrada 3D:

model.add(k.layers.core.Dense(32)) model.add(k.layers.Activation(''sigmoid''))

Dimensiones: (Ninguno, 28, 32)

Esta es tu salida. Lo primero que encuentro raro es que quieras 32 salidas de tu capa densa ... Deberías haber puesto 1 en lugar de 32. Pero incluso esto no solucionará tu problema. Vea lo que sucede si cambiamos la última capa:

model.add(k.layers.core.Dense(1)) model.add(k.layers.Activation(''sigmoid''))

Dimensiones: (Ninguno, 28, 1)

Esto sucede porque aplica una capa densa a un tensor ''2D''. Lo que hace en caso de que aplique una capa densa (1) a una entrada [28, 32] es que produce una matriz de peso de forma (32,1) que se aplica a los 28 vectores para que se encuentre con 28 salidas del tamaño 1.

Lo que propongo para solucionar esto es cambiar las 2 últimas capas como esta:

model = k.models.Sequential() model.add(k.layers.convolutional.Convolution1D(32,2, input_shape = (32, 1))) model.add(k.layers.Activation(''relu'')) model.add(k.layers.convolutional.Convolution1D(32,2)) model.add(k.layers.Activation(''relu'')) model.add(k.layers.convolutional.Convolution1D(32,2)) model.add(k.layers.Activation(''relu'')) # Only use one filter so that the output will be a sequence of 28 values, not a matrix. model.add(k.layers.convolutional.Convolution1D(1,2)) model.add(k.layers.Activation(''relu'')) # Change the shape from (None, 28, 1) to (None, 28) model.add(k.layers.core.Flatten()) # Only one neuron as output to get the binary target. model.add(k.layers.core.Dense(1)) model.add(k.layers.Activation(''sigmoid''))

Ahora los últimos dos pasos tomarán su tensor de

(Ninguno, 29, 32) -> (Ninguno, 28, 1) -> (Ninguno, 28) -> (Ninguno, 1)

Espero que esto te ayude.

PD. si te preguntas qué es None, es la dimensión del lote, no alimentas las 1000 muestras en onces, lo alimentas lote por lote y como el valor depende de lo que elijas, por convension colocamos None.

EDITAR:

Explicando un poco más por qué la longitud de las secuencias pierde un valor en cada paso.

Digamos que tiene una secuencia de 4 valores [x1 x2 x3 x4] , quiere usar su filtro de longitud 2 [f1 f2] para convolucionar sobre la secuencia. El primer valor vendrá dado por y1 = [f1 f2] * [x1 x2] , el segundo será y2 = [f1 f2] * [x2 x3] , el tercero será y3 = [f1 f2] * [x3 x4] . Luego llegaste al final de tu secuencia y no puedes ir más allá. Tiene como resultado un sequnce [y1 y2 y3] .

Esto se debe a la longitud del filtro y los efectos en los bordes de su secuencia. Hay varias opciones, algunas rellenan la secuencia con 0 para obtener exactamente la misma longitud de salida ... Puede elegir esa opción con el parámetro ''padding'' . Puede leer más sobre esto aquí y encontrar los diferentes valores posibles para el argumento de padding aquí . Te animo a que leas este último enlace, da información sobre formas de entrada y salida ...

Del doc:

relleno: uno de "válido" o "igual" (no distingue entre mayúsculas y minúsculas). "válido" significa "sin relleno". "lo mismo" da como resultado el relleno de la entrada de manera que la salida tenga la misma longitud que la entrada original.

el valor predeterminado es ''válido'', por lo que no rellena su ejemplo.

También te recomiendo que actualices tu versión de keras a la última. Convolution1D ahora es Conv1D, por lo que es posible que el documento y los tutoriales sean confusos.

Intento jugar con Keras para construir mi primera red neuronal. No tengo experiencia y no puedo entender por qué mi dimensionalidad no es correcta. No puedo deducir de sus documentos de qué se queja este error, ni siquiera qué capa lo está causando.

Mi modelo tiene una matriz de números de 32 bytes y se supone que da un valor booleano en el otro lado. Quiero una convolución 1D en la matriz de bytes de entrada.

arr1 es la matriz de 32 bytes, arr2 es una matriz de booleanos.

inputData = np.array(arr1) inputData = np.expand_dims(inputData, axis = 2) labelData = np.array(arr2) print inputData.shape print labelData.shape model = k.models.Sequential() model.add(k.layers.convolutional.Convolution1D(32,2, input_shape = (32, 1))) model.add(k.layers.Activation(''relu'')) model.add(k.layers.convolutional.Convolution1D(32,2)) model.add(k.layers.Activation(''relu'')) model.add(k.layers.convolutional.Convolution1D(32,2)) model.add(k.layers.Activation(''relu'')) model.add(k.layers.convolutional.Convolution1D(32,2)) model.add(k.layers.Activation(''relu'')) model.add(k.layers.core.Dense(32)) model.add(k.layers.Activation(''sigmoid'')) model.compile(loss = ''binary_crossentropy'', optimizer = ''rmsprop'', metrics=[''accuracy'']) model.fit( inputData,labelData )

La salida de la impresión de formas es (1000, 32, 1) y (1000,)

El error que recibo es:

Trazabilidad (llamada más reciente): archivo "cnn / init .py", línea 50, en inputData, labelData File "/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras /models.py ", línea 863, en ajuste initial_epoch = initial_epoch) Archivo" /home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py ", línea 1358, en ajuste batch_size = batch_size) Archivo "/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py", línea 1238, en _standardize_user_data exception_prefix = '' target '') Archivo "/home/steve/Documents/cnn/env/local/lib/python2.7/site-packages/keras/engine/training.py", línea 128, en _standardize_input_data str (array.shape)) ValueError : Error al verificar el objetivo: la activación esperada_5 tiene 3 dimensiones, pero tiene matriz con forma (1000, 1)