首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tensorflow 2.0不计算梯度

Tensorflow 2.0不计算梯度
EN

Stack Overflow用户
提问于 2019-07-06 17:38:51
回答 3查看 9K关注 0票数 9

我想形象化CNN中给定的特征地图所学习到的模式(在本例中,我使用vgg16)。为此,我创建了一个随机图像,通过网络输入到所需的卷积层,选择特征映射并找到与输入相关的梯度。其想法是以这样一种方式改变输入,以最大限度地激活所需的功能映射。使用tensorflow 2.0,我有一个GradientTape,它跟踪函数,然后计算梯度,但是梯度不返回,为什么它不能计算梯度?

代码语言:javascript
运行
复制
import tensorflow as tf
import matplotlib.pyplot as plt
import time
import numpy as np
from tensorflow.keras.applications import vgg16

class maxFeatureMap():

    def __init__(self, model):

        self.model = model
        self.optimizer = tf.keras.optimizers.Adam()

    def getNumLayers(self, layer_name):

        for layer in self.model.layers:
            if layer.name == layer_name:
                weights = layer.get_weights()
                num = weights[1].shape[0]
        return ("There are {} feature maps in {}".format(num, layer_name))

    def getGradient(self, layer, feature_map):

        pic = vgg16.preprocess_input(np.random.uniform(size=(1,96,96,3))) ## Creates values between 0 and 1
        pic = tf.convert_to_tensor(pic)

        model = tf.keras.Model(inputs=self.model.inputs, 
                               outputs=self.model.layers[layer].output)
        with tf.GradientTape() as tape:
            ## predicts the output of the model and only chooses the feature_map indicated
            predictions = model.predict(pic, steps=1)[0][:,:,feature_map]
            loss = tf.reduce_mean(predictions)
        print(loss)
        gradients = tape.gradient(loss, pic[0])
        print(gradients)
        self.optimizer.apply_gradients(zip(gradients, pic))

model = vgg16.VGG16(weights='imagenet', include_top=False)


x = maxFeatureMap(model)
x.getGradient(1, 24)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-06 19:42:28

这是GradientTape的一个常见缺陷;磁带只跟踪设置为“监视”的张量,默认情况下磁带只监视可训练的变量(即用trainable=True创建的tf.Variable对象)。要查看pic张量,您应该在磁带上下文中添加tape.watch(pic)作为第一行。

而且,我不确定索引(pic[0])是否能工作,所以您可能想删除它--因为pic在第一个维度中只有一个条目,所以无论如何都不会有什么关系。

此外,您不能使用model.predict,因为这返回一个numpy数组,该数组基本上“破坏”计算图链,这样梯度就不会被反向传播。您应该简单地将模型用作可调用的,即predictions = model(pic)

票数 18
EN

Stack Overflow用户

发布于 2021-03-24 09:29:08

你定义了你自己的损失函数吗?在你的损失函数中,你把张量转换为虚张度吗?

作为一名新生,我也遇到了同样的问题:当我使用tape.gradient(损失,变量)时,结果没有结果,因为我在自己的损失函数中将张量转换为numpy数组。对于新生来说,这似乎是一个愚蠢但常见的错误。

票数 1
EN

Stack Overflow用户

发布于 2021-05-03 19:52:39

FYI:当GradientTape不能工作时,就有可能出现TensorFlow问题。检查TF github是否正在使用的TF函数有已知的问题将是一个问题的确定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56916313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档