【发布时间】: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