Почему optimizer.get_gradients (...) в tf не работает? - PullRequest
0 голосов
/ 07 января 2020

Я хочу использовать optimizer.get_gradients () из tf2.0 вместо GradientTape () простой модели следующим образом

import numpy as np
import tensorflow as tf

class C3BR(tf.keras.Model):
    def __init__(self, filterNum, kSize, strSize, padMode, dFormat='channels_first'):
        super(C3BR, self).__init__()
        if dFormat == 'channels_first':
            self.conAx = 1
        else:
            self.conAx = -1
        self.kSize = (kSize, kSize, kSize)
        self.conv = layers.Conv3D(filters=filterNum, kernel_size=self.kSize, strides=strSize, padding=padMode, data_format=dFormat)
        self.BN = layers.BatchNormalization(axis=self.conAx)
        self.Relu = layers.ReLU()

    def call(self, inputs, ifTrain=False):
        x = self.conv(inputs)
        x= self.BN(x, training=ifTrain)
        outputs = self.Relu(x)
        return outputs

model = C3BR(32, 3, 1, 'valid')
# model.build_model(input_shape=(2, 4, 64, 64, 64))
# model.summary()
curOpt = tf.keras.optimizers.Adam(learning_rate=1e-4)
x = tf.ones((2, 4, 64, 64, 64), dtype=tf.float32)
yTrue =  tf.ones((2, 32, 62, 62, 62), dtype=tf.float32)
yPred = model(x,ifTrain=True)
loss = tf.reduce_mean(yPred-yTrue)
## Why does not it work?
gradients = curOpt.get_gradients(loss, model.trainable_variables)
curOpt.apply_gradients(zip(gradients, model.trainable_variables)) 
gradNorm = tf.linalg.global_norm(gradients)

Но когда я запустил код, возникла ошибка, указав, что в C3BR отсутствует градиент None.

Я неправильно использую optimizer.get_gradients (...)?

1 Ответ

0 голосов
/ 07 января 2020

Рекомендуемый способ работы с градиентами в TF2 - использовать tf.GradientTape(). Я не могу сказать вам, почему выше не работает. Но работает следующее.

model = C3BR(32, 3, 1, 'valid')
# model.build_model(input_shape=(2, 4, 64, 64, 64))
# model.summary()
curOpt = tf.keras.optimizers.Adam(learning_rate=1e-4)
x = tf.ones((2, 4, 64, 64, 64), dtype=tf.float32)
yTrue =  tf.ones((2, 32, 62, 62, 62), dtype=tf.float32)
## Why does not it work?
with tf.GradientTape() as tape:
  yPred = model(x,ifTrain=True)
  #print(yPred)
  loss = tf.reduce_mean(yPred-yTrue)

gradients = tape.gradient(loss, model.trainable_variables)
print(gradients)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...