【问题标题】:Can I define two different call functions in Keras, one for a foward map and another for an inverse map我可以在 Keras 中定义两个不同的调用函数吗,一个用于正向映射,另一个用于反向映射
【发布时间】:2019-12-15 11:08:19
【问题描述】:

我正在尝试使用this paper 中描述的结构实现一个 INN(可逆神经网络)。

我想知道是否可以创建一个块(如论文中提出的那样)作为具有两个不同调用函数的自定义 keras 层。

基本结构如下:

import tensorflow as tf
import tensorflow.keras.layers as layers

class INNBlock(tf.keras.Model):
#inheriting from model instead of keras.layers.Layer, because I want manage the 
#underlying layer as well
    def __init__(self, size):
        super(INNBlock, self).__init__(name='innblock')
        #define layers
        self.denseL1 = layers.Dense(size,activation='relu')

    def call(self, inputs):
        #define the relationship between the layers for a foward call
        out = self.denseL1(inputs)
        return out

    def inverse_call(self, inputs):
        #define inverse relationship between the layer
        out = -self.denseL1(inputs) #use the same weights as the foward call
        return out

class INN(tf.keras.Model):
    def __init__(self,kenel_size,input_dim,min_clip,max_clip):
        super(INN, self).__init__()
        self.block_1 = INNBlock(size)
        self.block_2 = INNBlock(size)

    def call(self, inputs):
        x = self.block_1(inputs)
        x = self.block_2.inverse_call(y)
        x = self.block_1.inverse_call(x)
        return (y,x)

我已经想到的解决方案(但不是特别喜欢):

  • 为反向调用创建新层并赋予它们与前向调用中的层相同的权重。

  • 向输入添加另一个维度并在其中有一个变量,以确定是否要执行反向调用或正向调用(但我不知道 keras 是否允许这样做)

我希望有人知道,如果有办法实现这一点。 提前谢谢你:)

【问题讨论】:

  • 你试过你的代码了吗?好像没问题。
  • 看起来确实如此._。如果我不以定义的方式调用它们,我认为这些操作不会暴露给 keras。但我只是尝试从 x -> x 映射(网络必须学会什么都不做,而且效果很好)你知道,如果权重的更新现在会发生两次,因为它们在两个函数中?跨度>

标签: python tensorflow keras artificial-intelligence tensorflow2.0


【解决方案1】:

您的代码没有任何问题。你可以试试,它会正常运行。

call 方法是您只需执行model_instance(input_tensor)layer_instance(input_tensor) 时的标准方法。

但是如果你定义了另一个方法并在模型的调用方法中使用那个方法并没有错。将会发生的只是:

  • 如果您使用the_block(input_tensor),它将使用the_block.call(input_tensor)
  • 如果您在层/模型之外的某处使用the_block.inverse_call(input_tensor),它将无法构建 Keras 模型(层外不能有任何东西)
  • 如果您在层/模型中使用the_block.inverse_call(input_tensor)(这就是您正在做的事情),它与直接编写操作完全相同。您只是将它包装在另一个函数中。

对于 Keras/Tensorflow,inverse_call 没有什么特别之处。您可以在任何可以使用任何其他 keras/tensorflow 功能的地方使用它。


渐变会更新两次吗?

不完全是两次,但是这个操作肯定会算进去。当系统计算loss相对于权重的梯度时,如果loss是顺便用inverse_call构建的,那么它会参与梯度计算。

但是像往常一样,每批更新一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多