python - simple - Implementando conexiones dispersas en la red neuronal(Theano)
redes neuronales ejemplos (2)
Disculpas por resucitar un hilo viejo, pero esta fue la guía más simple que encontré que fue útil para extender la guía en https://iamtrask.github.io/2015/07/12/basic-python-network/ para entradas parcialmente conectadas . Sin embargo, me tomó un tiempo entender la respuesta de Basesundi y creo que puedo mejorarla.
Había un par de cosas que necesitaba cambiar para que funcionara. En mi caso, estoy tratando de asignar desde N entradas a M neuronas en mi primera capa oculta. Mis entradas están en una matriz NxF, donde F es el número de entidades para mis entradas, y mis valores de sinapsis (pesos) entre las entradas y la primera capa están en una matriz FxM. Por lo tanto, la salida de Inputs <dot> Weights es una matriz NxM. Mi matriz de borde es una matriz MxF que especifica para cada neurona en la capa 1 (filas), cuáles de las características de los datos de entrada son relevantes (columnas).
En esta configuración, al menos, me obligó a cortar mis arreglos de manera diferente a lo especificado anteriormente. Además, la lista de comprensión devuelve una lista de matrices, que deben sumarse para obtener el NxM correcto (de lo contrario, se obtiene una matriz MxNxM).
Así que he usado lo siguiente (util.sigmoid es una función auxiliar propia):
y = [numpy.dot(x[:, edges[i]], w[edges[i]])
for i in range(M)]
y = util.sigmoid(numpy.sum(y, 0))
Esto parece funcionar para mí.
Algunos casos de uso para redes neuronales requieren que no todas las neuronas estén conectadas entre dos capas consecutivas. Para mi arquitectura de red neuronal, necesito tener una capa, donde cada neurona solo tenga conexiones con algunas neuronas preespecificadas en la capa anterior (en lugares algo arbitrarios, no con un patrón como una capa de convolución). Esto es necesario para modelar datos en un gráfico específico. Necesito implementar esta capa "Sparse" en Theano, pero no estoy acostumbrado a la forma de programación de Theano.
Parece que la forma más eficiente de programar conexiones dispersas en Theano sería usar theano.tensor.nnet.blocksparse.SparseBlockGemv . Una alternativa sería hacer la multiplicación de matrices, donde muchos pesos se establecen en 0 (= sin conexión), pero eso sería muy ineficiente en comparación con SparseBlockGemv
ya que cada neurona solo está conectada a 2-6 neuronas en la capa anterior de ~ 100000 neuronas Además, una matriz de peso de 100000x100000 no cabría en mi RAM / GPU. Por lo tanto, ¿podría alguien proporcionar un ejemplo de cómo implementar conexiones dispersas usando el método SparseBlockGemv
u otro método computacionalmente eficiente?
Un ejemplo perfecto sería extender el Tutorial Theano MLP con una capa adicional después de la capa oculta (y antes de softmax), donde cada neurona solo tiene conexiones con un subconjunto de neuronas en la capa anterior. Sin embargo, otros ejemplos también son muy bienvenidos!
Edición: tenga en cuenta que la capa debe implementarse en Theano, ya que es solo una pequeña parte de una arquitectura más grande.
La salida de una capa totalmente conectada viene dada por el producto punto de la entrada y los pesos de esa capa. En theano o numpy puedes usar el método del dot
.
y = x.dot(w)
Si solo tiene conexiones con algunas neuronas en la capa anterior y esas conexiones están predefinidas, podría hacer algo como esto:
y = [x[edges[i]].dot(w[i])) for i in neurons]
Donde los edges[i]
contienen los índices de las neuronas conectadas a la neurona i
y w[i]
los pesos de esta conexión.
Tenga en cuenta que theano no conoce las capas u otros detalles de alto nivel.