es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En Gradient Tape, los gradientes de Tensorflow llegan como 0.s.

Aquí hay una parte de un modelo en el que estoy trabajando. Al ser nuevo en el cálculo de gradientes en tf, me confundí cuando encontré que todos los valores de gradientes están llegando como 0. Aquí está el código:

class A:
    def __init__(self, inputA_dim, inputB_dim):
        self.inputA_dim = (35, 35, 1)
        self.inputB_dim = 2
        self.model = self.nn_model()
        self.opt = tf.keras.optimizers.Adam()

print(self.model.summary())

def nn_model(self):
    inputA = Input(self.inputA_dim)
    conv1 = Conv2D(10, 3, padding="same", activation="relu")(inputA)
    pool1 = MaxPool2D(padding='same')(conv1)
    conv2 = Conv2D(10, 3, padding="same", activation="relu")(pool1)
    pool2 = MaxPool2D(padding='same')(conv2)
    conv3 = Conv2D(10, 3, padding="same", activation="relu")(pool2)
    pool3 = MaxPool2D(padding='same')(conv3)
    flatten = Flatten()(pool3)
    s2 = Dense(32, activation="relu")(flatten)
    s3 = Dense(32, activation="relu")(s2)
    s4 = Dense(2, activation="relu")(s3)
    inputB = Input((self.inputB_dim,))
    a1 = Dense(2, activation="relu")(inputB)
    c1 = concatenate([s2, a1], axis=-1)
    c2 = Dense(4, activation="relu")(c1)
    outputs = Dense(1, activation="linear")(c2)
    return tf.keras.Model([inputA, inputB], outputs)

def predict(self, inputs):
    return self.model.predict(inputs)

def gradients(self, inputA, inputB):
    inputB = tf.convert_to_tensor(inputB)
    with tf.GradientTape() as tape:
        tape.watch(inputB)
        values = self.model([inputA, inputB])
        values = tf.squeeze(values)
    g = tape.gradient(values, inputB)
    print(g)
    return g

Más tarde encontré que hay otro método llamado jacobiano que también usé aquí, todavía dando valores de gradientes como 0. ¿Alguien puede decirme qué hacer. Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar en la función de activación de la última capa del modelo. El código especifica que la función de activación para la última capa es “lineal”. Esto significa que la salida de la última capa puede ser cualquier número real, lo que puede llevar a gradientes muy grandes o muy pequeños.

    Prueba a cambiar la función de activación de la última capa por algo diferente, como “sigmoid” o “relu”. Esto debería dar lugar a valores de gradiente más razonables.

    Si esto no resuelve el problema, es posible que desee verificar los valores de los tensores de entrada y asegurarse de que no sean todos cero o muy pequeños. Esto también puede conducir a gradientes cero.

Comments are closed.