首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能否在Keras中定义两个不同的调用函数,一个用于foward映射,另一个用于逆映射。

我能否在Keras中定义两个不同的调用函数,一个用于foward映射,另一个用于逆映射。
EN

Stack Overflow用户
提问于 2019-12-15 11:08:19
回答 1查看 610关注 0票数 2

我试图用本论文描述的结构来实现INN (可逆神经网络)。

我想知道是否可以创建一个块(如本文所建议的),作为一个具有两个不同调用函数的定制keras层。

基本结构如下:

代码语言:javascript
复制
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)

我已经想过的解决方案(但不要特别像):

  • 为反向调用创建新的层,并赋予它们与正向调用中的层相同的权重。
  • 在输入中添加另一个维度,并在其中添加一个变量,以确定是否执行反向调用或foward调用(但我不知道keras是否允许这样做)

我希望有人知道,如果有办法实现这一点。(预先谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-15 19:03:56

你的代码没有什么问题。你可以试一试,它就能正常运行。

call方法是用于简单地执行model_instance(input_tensor)layer_instance(input_tensor)的标准方法。

但是,如果您定义另一个方法并在模型的call方法中使用该方法,那么没有什么问题。将要发生的是:

  • 如果您使用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函数。

,梯度会被更新两次吗?

虽然不是两次,但手术肯定会被计算在内。当系统根据权重计算损失梯度时,如果损失是用inverse_call方法构建的,则系统将参与梯度计算。

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

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

https://stackoverflow.com/questions/59343277

复制
相关文章

相似问题

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