0

这是我正在工作的模型的一部分。作为 tf 计算梯度的新手,当我发现所有梯度值都为 0 时,我感到很困惑。这是代码:

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

后来我发现还有另一种叫做 jacobian 的方法,我在这里也使用过,仍然给出 0.s asgrad 值。谁能告诉我该怎么做。谢谢。

4

0 回答 0