ValueError: Градиенты не указаны для любой переменной: ['Variable: 0'] - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь подготовить блокнот для примеров, чтобы показать, как создавать состязательные примеры в TensorFlow 2.x, следуя этому руководству .

Мне удалось портировать некоторые из них, но я застрял со странной проблемой ValueError: No gradients provided for any variable: ['Variable:0']. и не могу понять, почему.

Вот как я загружаю изображение, для которого я пытаюсь создать противника:

def preprocess_image(image_pixels):
    # image_pixels = preprocess_input(image_pixels)
    image_pixels = cv2.resize(image_pixels, (224, 224))
    image_pixels = np.expand_dims(image_pixels, axis=0)

    return image_pixels

# Load and preprocess image but a but without any preprocess_input
sample_image = show_image("pig.jpg")
preprocessed_image = preprocess_image(sample_image)

# Initialize the perturbation quantity
image_tensor = tf.convert_to_tensor(preprocessed_image, dtype=tf.float32)
delta = tf.Variable(tf.zeros_like(image_tensor), trainable=True)

Вот как выглядит моя тренировка l oop -

for t in range(30):
    inp = preprocess_input(image_tensor + delta)
    with tf.GradientTape() as tape:
        tape.watch(delta)
        pred = resnet50(inp)
        loss = - scc_loss(
                tf.convert_to_tensor([341]),
                pred
            )
        if t % 5 == 0:
            print(t, loss.numpy())

        # Get the gradients
        gradients = tape.gradient(loss, delta)

        # Update the weights
        optimizer.apply_gradients([(gradients, delta)])

        # Clip so that the delta values are within [0,1]
        delta.assign(clip_eps(delta))

где preprocess_input равно tf.keras.applications.resnet50, а моя модель - предварительно обученный ResNet50. Оптимизатор определен как optimizer = tf.keras.optimizers.SGD(learning_rate=1e-1). Ниже перечислены ошибки:

0 -0.00041249825
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-284-174284e3aea4> in <module>()
     15 
     16         # Update the weights
---> 17         optimizer.apply_gradients([(gradients, delta)])
     18 
     19         # Clip so that the delta values are within [0,1]

1 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py in apply_gradients(self, grads_and_vars, name, experimental_aggregate_gradients)
    472       ValueError: If none of the variables have gradients.
    473     """
--> 474     grads_and_vars = _filter_grads(grads_and_vars)
    475     var_list = [v for (_, v) in grads_and_vars]
    476 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py in _filter_grads(grads_and_vars)
   1201   if not filtered:
   1202     raise ValueError("No gradients provided for any variable: %s." %
-> 1203                      ([v.name for _, v in grads_and_vars],))
   1204   if vars_with_empty_grads:
   1205     logging.warning(

ValueError: No gradients provided for any variable: ['Variable:0'].

Вот , где можно найти всю записную книжку Colab. Цени любую помощь / указатели.

1 Ответ

1 голос
/ 07 апреля 2020

Ваш delta (обучаемая переменная) не участвует ни в одной операции внутри ленты. За ним нельзя наблюдать, если он ничего не делает.

Чтобы иметь лучшую производительность, поскольку вы используете активное выполнение, используйте training=False, когда вы используете модель, которая не должна обновляться (лента будет наблюдать за каждым обучаемым ядром в моделях, если вы не сделаете это). это, любая нормализация и выпадение партии также будут вести себя по-разному) - Так как вы сказали, что вы используете Re sNet для предварительной обработки, я предполагаю, что этот Re sNet должен использовать training=False.

for t in range(30):
    with tf.GradientTape() as tape:
        tape.watch(delta)
        inp = preprocess_input(image_tensor + delta)
        pred = resnet50(inp)
        loss = - scc_loss(
                tf.convert_to_tensor([341]),
                pred
            )
        if t % 5 == 0:
            print(t, loss.numpy())

#these things should not be inside the tape:
    # Get the gradients
    gradients = tape.gradient(loss, delta)

    # Update the weights
    optimizer.apply_gradients([(gradients, delta)])

    # Clip so that the delta values are within [0,1]
    delta.assign(clip_eps(delta))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...