我试图用本论文描述的结构来实现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)我已经想过的解决方案(但不要特别像):
我希望有人知道,如果有办法实现这一点。(预先谢谢:)
发布于 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方法构建的,则系统将参与梯度计算。
但是和往常一样,每批更新一次。
https://stackoverflow.com/questions/59343277
复制相似问题