【问题标题】:ValueError: No gradients provided for any variable: ['Variable:0']ValueError:没有为任何变量提供渐变:['Variable:0']
【发布时间】:2020-04-07 22:18:22
【问题描述】:

我正在尝试准备一个示例笔记本,用于展示如何按照this tutorial 在 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)

这是我的训练循环的样子 -

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_inputtf.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'].

这里是where,可以找到整个 Colab 笔记本。感谢任何帮助/指针。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    您的delta(可训练变量)未参与磁带内的任何操作。如果它不做任何事情,它就无法被观看。

    为了获得更好的性能,由于您使用的是 Eager Execution,因此当您使用不应更新的模型时,请使用 training=False(磁带将监视模型中的每个可训练内核,除非您这样做,任何批量归一化和 dropout 也会表现不同)——既然你说你使用 ResNet 进行预处理,我假设这个 ResNet 应该使用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))
    

    【讨论】:

    • 让我试着回复你。
    • 成功了,谢谢。现在的问题是损失没有改变。如果您能分享一些指针,那就太好了。
    • 什么是可训练的,什么是不可训练的? delta 在 0 和 1 之间吗?您的模型是否以 softmax 和单个单元结尾?你的模型中有 relus 吗? (真的有很多可能性,你可能应该问另一个问题,详细说明一切)。
    • 好建议。 delta 是可训练的。 delta 是一个非常小的数量,介于 [0,1] 之间。这里使用的最后一层 ResNet50 是 Softmax。最后一层有 1000 个单元(这是一个预训练的网络)。详情我提到了 Colab notebook,不便之处敬请见谅。
    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多