Cómo eliminar las conexiones entre dos nodos en un modelo de TensorFlow
Tengo una imagen RGB y mi primera capa es una capa de convolución con tamaño de kernel (1×1) y una profundidad de 3 (filtros). Debido a que el filtro es de tamaño 1×1, el tamaño de la imagen de salida no cambia. Observando este píxel, vemos que 3 nodos de la imagen están conectados a 3 nodos de la capa. Cuando intento acceder a los pesos, obtengo una matriz [3×3].
Quiero eliminar ciertas conexiones entre nodos y solo quiero que ciertas conexiones actualicen sus pesos durante el entrenamiento.
Como se muestra en la imagen de arriba, quiero eliminar todas las conexiones mostradas por las líneas punteadas.
Quiero que los pesos se vean algo así.
[[ some_value NA NA ],
[ NA some_value NA ],
[ NA NA some_value]]
¿Cómo puedo lograr esto en un modelo de TensorFlow?
A continuación se muestra la arquitectura del modelo con el que estoy trabajando.
modelo = tf.keras.Sequential([
keras.layers.Conv2D(3, (1,1), input_shape = (256, 256, 3), activation = "relu"),
keras.layers.Conv2D(1, (1,1), activation = "relu"),
])
davy.ai
Para lograr la matriz de pesos deseada en TensorFlow, puedes establecer ciertos pesos en cero creando una función de inicialización de pesos personalizada que genere la matriz de pesos de la capa Conv2D. Aquí tienes un ejemplo de código:
En la función
custom_weight_initializer
, creamos una matriz de ceros con la misma forma que la matriz de pesos de la capa Conv2D, y establecemos solo ciertos pesos en un valor distinto de cero (la variablesome_value
puede tomar cualquier valor que desees). Luego devolvemos esta matriz de pesos personalizada como una constante de TensorFlow.Finalmente, al definir la capa Conv2D, pasamos el argumento
kernel_initializer
con nuestra función de inicialización de pesos personalizada. Esto inicializará los pesos de la capa Conv2D con la matriz de pesos personalizada que creamos.Ten en cuenta que este enfoque establece algunos pesos en cero, eliminando efectivamente ciertas conexiones entre nodos, pero no restringe las actualizaciones de otros pesos durante el entrenamiento. Si deseas congelar ciertos pesos y solo actualizar otros, deberás utilizar un enfoque diferente, como establecer el atributo
trainable
de ciertos pesos en False o utilizar una función de pérdida personalizada que solo actualice ciertos pesos.