Haz todo lo posible por entender el código correctamente previamente a utilizarlo a tu proyecto si tquieres aportar algo puedes compartirlo con nosotros.
Solución:
Según la discusión en los comentarios, aquí hay una forma de podar una capa (una matriz de peso) de su red neuronal. Lo que hace esencialmente el método es seleccionar el k%
pesos más pequeños (elementos de la matriz) basados en su norma, y los pone a cero. De esa forma, la matriz correspondiente se puede tratar como una matriz dispersa, y podemos realizar una multiplicación de matriz densa-dispersa que puede ser más rápida si se eliminan suficientes pesos.
def weight_pruning(w: tf.Variable, k: float) -> tf.Variable:
"""Performs pruning on a weight matrix w in the following way:
- The absolute value of all elements in the weight matrix are computed.
- The indices of the smallest k% elements based on their absolute values are selected.
- All elements with the matching indices are set to 0.
Args:
w: The weight matrix.
k: The percentage of values (units) that should be pruned from the matrix.
Returns:
The unit pruned weight matrix.
"""
k = tf.cast(tf.round(tf.size(w, out_type=tf.float32) * tf.constant(k)), dtype=tf.int32)
w_reshaped = tf.reshape(w, [-1])
_, indices = tf.nn.top_k(tf.negative(tf.abs(w_reshaped)), k, sorted=True, name=None)
mask = tf.scatter_nd_update(tf.Variable(tf.ones_like(w_reshaped, dtype=tf.float32), name="mask", trainable=False), tf.reshape(indices, [-1, 1]), tf.zeros([k], tf.float32))
return w.assign(tf.reshape(w_reshaped * mask, tf.shape(w)))
Mientras que el método anterior elimina una sola conexión (peso), el método siguiente elimina una neurona completa de una matriz de peso. Es decir, el método selecciona el k%
neuronas más pequeñas (columnas de la matriz de pesos) según la norma euclidiana, y las pone a cero.
def unit_pruning(w: tf.Variable, k: float) -> tf.Variable:
"""Performs pruning on a weight matrix w in the following way:
- The euclidean norm of each column is computed.
- The indices of smallest k% columns based on their euclidean norms are selected.
- All elements in the columns that have the matching indices are set to 0.
Args:
w: The weight matrix.
k: The percentage of columns that should be pruned from the matrix.
Returns:
The weight pruned weight matrix.
"""
k = tf.cast(
tf.round(tf.cast(tf.shape(w)[1], tf.float32) * tf.constant(k)), dtype=tf.int32
)
norm = tf.norm(w, axis=0)
row_indices = tf.tile(tf.range(tf.shape(w)[0]), [k])
_, col_indices = tf.nn.top_k(tf.negative(norm), k, sorted=True, name=None)
col_indices = tf.reshape(
tf.tile(tf.reshape(col_indices, [-1, 1]), [1, tf.shape(w)[0]]), [-1]
)
indices = tf.stack([row_indices, col_indices], axis=1)
return w.assign(
tf.scatter_nd_update(w, indices, tf.zeros(tf.shape(w)[0] * k, tf.float32))
)
Finalmente, este repositorio de Github pasa por los métodos de poda explicados aquí y realiza experimentos en el conjunto de datos MNIST.
Si agrega una máscara, solo un subconjunto de sus pesos contribuirá al cálculo, por lo tanto, su modelo se eliminará. Por ejemplo, los modelos autorregresivos usan una máscara para enmascarar los pesos que se refieren a datos futuros para que la salida en el paso de tiempo t
solo depende de pasos de tiempo 0, 1, ..., t-1
.
En su caso, dado que tiene una capa simple completamente conectada, es mejor usar el abandono. Apaga aleatoriamente algunas neuronas en cada paso de iteración, por lo que reduce la complejidad del cálculo. Sin embargo, la razón principal por la que se inventó el abandono es para abordar el sobreajuste: al tener algunas neuronas apagadas al azar, se reducen las codependencias de las neuronas, es decir, se evita que algunas neuronas dependan de otras. Además, en cada iteración, su modelo será diferente (diferente número de neuronas activas y diferentes conexiones entre ellas), por lo que su modelo final puede interpretarse como un conjunto (colección) de varios modelos diferentes, cada uno especializado (esperamos) en el comprensión de un subconjunto específico del espacio de entrada.
Puedes añadir valor a nuestra información cooperando tu experiencia en las interpretaciones.