#tensorflow2.0 #gradient #gradienttape
#тензорный поток 2,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
Позже я обнаружил, что есть еще один метод, называемый якобианом, который я также использовал здесь, все еще давая 0.s в качестве значений. Кто-нибудь может сказать мне, что делать. Спасибо.
Комментарии:
1. Что такое «действия»?
2. @SusmitAgrawal это отредактировано, оно должно быть введено
3. проблема решена сокращением сети conv.