una tutorial redes reconocimiento paso neuronales neuronal implementacion imagenes hacer convolucionales convolucional como clasificador python neural-network theano conv-neural-network keras

tutorial - redes neuronales convolucionales python



Dimensiones de entrada a una red convolucional unidimensional en keras. (1)

realmente es difícil entender las dimensiones de entrada de la layer 1d convolucional en keras:

Forma de entrada

Tensor 3D con forma: (muestras, pasos, input_dim).

Forma de salida

Tensor 3D con forma: (samples, new_steps, nb_filter). El valor de los pasos podría haber cambiado debido al relleno.

Quiero que mi red acepte una serie temporal de precios (101, en orden) y produzca 4 probabilidades. Mi red no convolucional actual que hace esto bastante bien (con un conjunto de entrenamiento de 28000) se ve así:

standardModel = Sequential() standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation=''sigmoid'')) standardModel.add(Dense(4, W_regularizer=l2(0.7), activation=''softmax''))

Para mejorar esto, quiero hacer un mapa de características desde la capa de entrada que tiene un campo receptivo local de longitud 10. (y, por lo tanto, tiene 10 pesos compartidos y 1 sesgo compartido). Luego quiero usar la agrupación máxima y alimentar esto en una capa oculta de aproximadamente 40 neuronas y luego generar esto con 4 neuronas con softmax en la capa externa.

foto (es bastante horrible lo siento!)

Así que idealmente, la capa convolucional tomaría un tensor 2d de dimensiones:

(minibatch_size, 101)

y salida un tensor 3d de dimensiones

(minibatch_size, 91, no_of_featuremaps)

Sin embargo, la capa keras parece requerir una dimensión en la entrada llamada paso. He intentado entender esto y todavía no lo entiendo. En mi caso, ¿debería ser el paso 1 ya que cada paso en el vector es un aumento en el tiempo en 1? Además, ¿qué es new_step?

Además, ¿cómo se convierte la salida de las capas de agrupación (un tensor 3d) en una entrada adecuada para la capa oculta estándar (es decir, una capa de keras densas) en forma de un tensor 2D?

Actualización: Después de las sugerencias muy útiles dadas, traté de hacer una red convolucional así:

conv = Sequential() conv.add(Convolution1D(64, 10, input_shape=(1,101))) conv.add(Activation(''relu'')) conv.add(MaxPooling1D(2)) conv.add(Flatten()) conv.add(Dense(10)) conv.add(Activation(''tanh'')) conv.add(Dense(4)) conv.add(Activation(''softmax''))

La línea conv.Add (Flatten ()) arroja un rango que excede los límites de error válidos. Curiosamente, este error no se produce solo para este código:

conv = Sequential() conv.add(Convolution1D(64, 10, input_shape=(1,101))) conv.add(Activation(''relu'')) conv.add(MaxPooling1D(2)) conv.add(Flatten())

obra

print conv.input_shape print conv.output_shape

resultados en

(None, 1, 101 (None, -256)

siendo devuelto

Actualización 2:

Cambiado

conv.add(Convolution1D(64, 10, input_shape=(1,101)))

a

conv.add(Convolution1D(10, 10, input_shape=(101,1))

Y empezó a funcionar. Sin embargo, ¿hay alguna diferencia importante entre la entrada (Ninguna, 101, 1) a una capa conv 1d o (Ninguna, 1, 101) que debo conocer? ¿Por qué no funciona (Ninguno, 1, 101)?


La razón por la que se ve así es que el diseñador de Keras tenía la intención de hacer que el marco convolucional unidimensional se interpretara como un marco para tratar las secuencias. Para comprender completamente la diferencia, intente imaginar que tiene una secuencia de varios vectores de características. Luego, su salida será al menos bidimensional: donde la primera dimensión se conecta con el tiempo y otras dimensiones se conectan con las características. El marco convolucional unidimensional se diseñó para en cierto modo en negrita en esta dimensión temporal y para tratar de encontrar los patrones recurrentes en los datos, en lugar de realizar una transformación convolucional multidimensional clásica.

En su caso, simplemente debe cambiar la forma de sus datos para que tengan forma (dataset_size, 101, 1), ya que solo tiene una característica. Se podría hacer fácilmente usando la función numpy.reshape . Para entender lo que significa un nuevo paso, debe comprender que está haciendo la convolución a lo largo del tiempo, por lo que cambia la estructura temporal de sus datos, lo que lleva a una nueva estructura conectada en el tiempo. Para obtener sus datos en un formato adecuado para capas densas / estáticas, use la capa keras.layers.flatten , igual que en el caso clásico de convolución.

ACTUALIZACIÓN: Como mencioné anteriormente, la primera dimensión de la entrada está conectada con el tiempo. Entonces, la diferencia entre (1, 101) y (101, 1) radica en que, en el primer caso, tiene un paso de tiempo con 101 funciones y en el segundo - 101 pasos de tiempo con 1 función. El problema que mencionó después de su primer cambio tiene su origen en la agrupación con tamaño 2 en dicha entrada. Solo tiene un paso de tiempo (no puede agrupar ningún valor en una ventana de tiempo de tamaño 2) simplemente porque no hay suficientes pasos de tiempo para hacerlo.