Python 在Keras中复制寄存器梯度和梯度覆盖图

Python 在Keras中复制寄存器梯度和梯度覆盖图,python,tensorflow,keras,Python,Tensorflow,Keras,下面是在tensorflow中注册渐变和重写操作渐变的代码 # Registering a gradient some_multiplier = 0.5 @tf.RegisterGradient("AdaGrad") def _ada_grad(op, grad): return grad * some_multiplier # Overriding g = tf.get_default_graph() with g.gradient_override_map({"Ada":

下面是在tensorflow中注册渐变和重写操作渐变的代码

# Registering a gradient
some_multiplier = 0.5 

@tf.RegisterGradient("AdaGrad")
def _ada_grad(op, grad):
    return grad * some_multiplier 

# Overriding 
g = tf.get_default_graph()
with g.gradient_override_map({"Ada": "AdaGrad"}):
    model.loss = tf.identity(model.loss, name="Ada")
我想在keras中复制同样的东西。在搜索了很多东西之后,我找不到任何方法来做这件事

我尝试了以下代码,但没有成功。 梯度没有被修改。我得到了相同的结果,有和没有梯度覆盖。我通过将
一些乘法器设置为零来检查它

model = Model(...) # Keras model
model.compile(loss='sparse_categorical_crossentropy', optimizer=adadelta, metrics=['accuracy']) # Compiling Keras Model

@tf.RegisterGradient("AdaGrad")
def _ada_grad(op, grad):
    return grad * some_multiplier 

g = tf.get_default_graph()
with g.gradient_override_map({"Ada": "AdaGrad"}):
    model.total_loss = tf.identity(model.total_loss, name="Ada")

同样的方法也应该有效,但您需要确保使用Keras模型的图形。如果使用或,检索图形的方式会发生一些变化:


TensorFlow的
梯度覆盖图不适用于大多数Keras操作。 我发现的最简单的方法是用TensorFlow实现替换Keras中的操作

例如,假设考虑了relu激活,那么它将是简单的:

tf.keras.activations.relu = tf.nn.relu
# <function tensorflow.python.keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0)>
# <function tensorflow.python.ops.gen_nn_ops.relu(features, name=None)>

我也有同样的问题。在我的例子中,我使用“渐变覆盖贴图”试图实现“引导后支撑”

我使用VGG16作为预测模型

model = VGG16(include_top=True, weights='imagenet')
predicted = np.argmax(model.predict(np.expand_dims(img, axis=0)))
我尝试了下面的代码,但没有成功

with K.get_session().graph.gradient_override_map({'Relu': 'GuidedRelu'}):
    # here is implementation to get gradients
    # but "GuidedRelu" is not used
因此,在调用“gradient\u override\u map”之前,我创建了一个新的图形和会话,并成功地将gradient函数从“Relu”更改为“GuidedRelu”


我不知道为什么前者不起作用。但我希望这能有所帮助。

欢迎来到S.O.“不起作用”一词是含糊不清的。为了帮助他人回答您的问题,最好还包括对“实际”结果(错误、错误结果等)的简要描述,以及您“预期”将发生的情况。model.graph不起作用。它给出了一个属性错误:“Model”对象没有属性“graph”。还有其他方法可以得到keras图吗?@Sahitya哦,等等,你在用or吗。如果是第二个,您可以通过like
K.get_session().graph
(请参阅)访问该图。
sess = tf.Session()
graph = tf.get_default_graph()
tf.keras.backend.set_session(sess)
with graph.gradient_override_map({'Relu': 'GuidedRelu'}):
    model = tf.keras.applications.VGG16()
@tf.RegisterGradient("GuidedRelu")
def GuidedReluGrad(op, grad):
    grad_filter = tf.cast(grad > 0, "float32")
    output_filter = tf.cast(op.outputs[0] > 0, "float32")
    return output_filter * grad_filter * grad
model = VGG16(include_top=True, weights='imagenet')
predicted = np.argmax(model.predict(np.expand_dims(img, axis=0)))
with K.get_session().graph.gradient_override_map({'Relu': 'GuidedRelu'}):
    # here is implementation to get gradients
    # but "GuidedRelu" is not used
new_graph = tf.Graph()
with new_graph.as_default():
    new_sess = tf.Session(graph = new_graph)
    with new_sess.as_default():
        with new_graph.gradient_override_map({'Relu': 'GuidedRelu'}):
            new_model = VGG16(include_top=True, weights='imagenet')
            # here is implementation to get gradients with new graph/session
            # "GuidedRelu" is used