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'')