如何在Tensorflow/Keras中的两层之间创建循环连接?

如何在Tensorflow/Keras中的两层之间创建循环连接?,tensorflow,keras,recurrent-neural-network,Tensorflow,Keras,Recurrent Neural Network,基本上,我想做的是采用以下非常简单的前馈图: 然后添加一个循环层,将第二个密集层的输出作为第一个密集层的输入,如下所示。这两个模型显然都是对我的实际用例的简化,尽管我认为我所要求的一般原则对这两个模型都适用 我想知道Tensorflow甚至keras是否有一种有效的方法来实现这一点,特别是在GPU处理效率方面。虽然我很有信心我可以在Tensorflow中拼凑出一个定制模型来完成这个功能,但我对这样一个定制模型的GPU处理效率感到悲观。因此,如果有人知道一种有效的方法来实现两层之间的重复连接,

基本上,我想做的是采用以下非常简单的前馈图:

然后添加一个循环层,将第二个密集层的输出作为第一个密集层的输入,如下所示。这两个模型显然都是对我的实际用例的简化,尽管我认为我所要求的一般原则对这两个模型都适用

我想知道Tensorflow甚至keras是否有一种有效的方法来实现这一点,特别是在GPU处理效率方面。虽然我很有信心我可以在Tensorflow中拼凑出一个定制模型来完成这个功能,但我对这样一个定制模型的GPU处理效率感到悲观。因此,如果有人知道一种有效的方法来实现两层之间的重复连接,我将不胜感激。谢谢您抽出时间!=)


为了完整性起见,下面是创建第一个简单前馈图的代码。我通过图像编辑创建的循环图

inputs = tf.keras.Input(shape=(128,))

h_1 = tf.keras.layers.Dense(64)(inputs)
h_2 = tf.keras.layers.Dense(32)(h_1)
out = tf.keras.layers.Dense(16)(h_2)

model = tf.keras.Model(inputs, out)

由于我的问题还没有得到任何答案,我想与大家分享我提出的解决方案,以防有人通过搜索找到这个问题

如果您发现或想出更好的解决方案,请告诉我-谢谢

类SimpleModel(tf.keras.Model):
定义初始化(自、输入形状、*args、**kwargs):
super(SimpleModel,self)。\uuuuuu初始化(*args,**kwargs)
#创建节点层
self.node_1=tf.keras.layers.InputLayer(input_shape=input_shape)
self.node_2=tf.keras.layers.density(64,activation='sigmoid')
self.node_3=tf.keras.layers.density(32,activation='sigmoid')
self.node_4=tf.keras.layers.density(16,activation='sigmoid')
self.conn_3_2_经常性_状态=无
#创建循环连接状态
节点_1_输出_形状=self.node_1.compute_输出_形状(输入_形状)
node_2_output_shape=self.node_2.compute_output_shape(node_1_output_shape)
node_3_output_shape=self.node_3.compute_output_shape(node_2_output_shape)
self.conn_3_2_递归_state=tf.Variable(初始_值=self.node_3(tf.ones(shape=node_2_output_shape)),
可训练=错误,
验证_shape=False,
dtype=tf.float32)
#或
#self.conn_3_2_recurrent_state=tf.random.uniform(shape=node_3_output_shape,minval=0.123,maxval=4.56)
#或
#self.conn\u 3\u 2\u递归\u状态=tf.ones(形状=节点\u 3\u输出\u形状)
#或
#self.conn_3_2_递归_state=tf.zeros(shape=node_3_output_shape)
def呼叫(自我,输入):
x=自身节点_1(输入)
#tf.打印(自连接3\u 2\u状态)
#tf.print(self.conn\u 3\u 2\u returnal\u state.shape)
x=tf.keras.layers.Concatenate(轴=-1)([x,self.conn\u 3\u 2\u状态])
x=自身节点_2(x)
x=自身节点_3(x)
self.conn_3_2_reportional_state.assign(x)
#tf.打印(自连接3\u 2\u状态)
#tf.print(self.conn\u 3\u 2\u returnal\u state.shape)
x=自身节点_4(x)
返回x
#演示模型的状态性(在model.call()中取消注释)
模型=简单模型(输入形状=(10128))
x=tf.one(形状=(10128))
型号(x)
型号(x)
#演示循环连接TF模型的可训练性
x=tf.random.uniform(形状=(10128))
y=tf.one(形状=(10,16))
模型=简单模型(输入形状=(10128))
compile(优化器='adam',loss='binary\u crossentropy')
模型拟合(x=x,y=y,epochs=100)