tensorflow keras keras-layer

tensorflow - Especificar conexiones en NN(en keras)



keras-layer (1)

La forma más simple en que puedo pensar, si tiene esta matriz correctamente formada, es derivar la capa Densa y simplemente agregar la matriz en el código multiplicando los pesos originales:

class CustomConnected(Dense): def __init__(self,units,connections,**kwargs): #this is matrix A self.connections = connections #initalize the original Dense with all the usual arguments super(CustomConnected,self).__init__(units,**kwargs) def call(self,inputs): #change the kernel before calling the original call: self.kernel = self.kernel * self.connections #call the original calculations: super(CustomConnected,self).call(inputs)

Utilizando:

model.add(CustomConnected(units,matrixA)) model.add(CustomConnected(hidden_dim2, matrixB,activation=''tanh'')) #can use all the other named parameters...

Observe que todas las neuronas / unidades aún tienen un sesgo agregado al final. El argumento use_bias=False todavía funcionará si no desea sesgos. También puede hacer exactamente lo mismo usando un vector B, por ejemplo, y enmascarar los sesgos originales con self.biases = self.biases * vectorB

Sugerencia para la prueba: use diferentes dimensiones de entrada y salida, para que pueda estar seguro de que su matriz A tiene la forma correcta.

Acabo de darme cuenta de que mi código es potencialmente defectuoso, porque estoy cambiando una propiedad que utiliza la capa Dense original. Si aparecen comportamientos o mensajes extraños, puedes probar con otro método de llamada:

def call(self, inputs): output = K.dot(inputs, self.kernel * self.connections) if self.use_bias: output = K.bias_add(output, self.bias) if self.activation is not None: output = self.activation(output) return output

Donde K viene de import keras.backend as K

También puede ir más lejos y establecer un get_weights() personalizado de get_weights() si desea ver los pesos enmascarados con su matriz. (Esto no sería necesario en el primer enfoque anterior)

Estoy usando keras y tensorflow 1.4.

Quiero especificar explícitamente qué neuronas están conectadas entre dos capas. Por lo tanto, tengo una matriz A con unas en ella, siempre que la neurona i en la primera capa está conectada a la neurona j en la segunda capa y ceros en otra parte.

Mi primer intento fue crear una capa personalizada con un kernel, que tiene el mismo tamaño que A con ceros no entrenables, donde A tiene ceros y pesos entrenables, donde A tiene unos. Entonces, la salida deseada sería un simple producto de puntos. Desafortunadamente no logré averiguar cómo implementar un kernel que sea en parte entrenable y en parte no entrenable.

¿Alguna sugerencia?

(Construir un modelo funcional con muchas neuronas que estén conectadas a mano podría ser una solución, pero de alguna manera es una solución ''fea'')