RNN:了解层级连结

时间:2019-12-29 08:00:17

标签: python tensorflow machine-learning keras recurrent-neural-network

我试图理解张量流keras中各层的连接。 下面我画了我认为是2个RNN层[保留图片清晰度]和输出

的串联

My model

在这里,我试图连接两个RNN层。一层具有某个时间序列的患者的纵向数据[整数值],另一层具有分类输入的其他时间序列的相同患者的详细信息。

我不希望将这两个不同的时间顺序混淆在一起,因为它是医学数据。所以我正在尝试这个。但是在此之前,我想确定我画的是两层串联意味着什么。 下面是我的代码。看来效果很好,但我想确认我画的内容和实施的内容是否正确。

#create simpleRNN with one sequence of input

first_input = Input(shape=(4, 7),dtype='float32')
simpleRNN1 = layers.SimpleRNN(units=25,bias_initializer= initializers.RandomNormal(stddev=0.0001),
                           activation="relu",kernel_initializer= "random_uniform")(first_input)

#another layer of RNN
second_input = Input(shape=(16,1),dtype='float32')
simpleRNN2 = layers.SimpleRNN(units=25,bias_initializer= initializers.RandomNormal(stddev=0.0001),
                           activation="relu",kernel_initializer= "random_uniform")(second_input)

#concatenate two layers,stack dense layer on top
concat_lay = tf.keras.layers.Concatenate()([simpleRNN1, simpleRNN2]) 
dens_lay = layers.Dense(64, activation='relu')(concat_lay)
dens_lay = layers.Dense(32, activation='relu')(dens_lay)
dens_lay = layers.Dense(1, activation='sigmoid')(dens_lay)

model = tf.keras.Model(inputs=[first_input, second_input], outputs= [dens_lay])
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=["accuracy"],lr=0.001)
model.summary()

2 个答案:

答案 0 :(得分:3)

在这里串联意味着“链接在一起”或“统一”,将两个实体结合在一起。

我认为您的问题已在 https://datascience.stackexchange.com/questions/29634/how-to-combine-categorical-and-continuous-input-features-for-neural-network-trai 中解决(如何结合分类和连续输入特征进行神经网络训练

如果您拥有生物医学数据(即心电图)作为连续数据并诊断为分类数据,则我认为集成学习是最好的ansatz。

这里最好的解决方案是什么,这取决于您的问题的详细信息...

https://machinelearningmastery.com/ensemble-methods-for-deep-learning-neural-networks/

中描述了构建两个神经网络的集合。

答案 1 :(得分:2)

是的,您实现的是正确的(与图表相比)。确切地说,它正在执行以下操作。在这里,蓝色节点表示输入/输出,N表示None(这是批次尺寸)。

enter image description here

但只是添加一些注释,

  • 我假设您要在第一个Dense层(具有64个单位)混合RNN的两个输出,因为在那之后,就无法确定哪个输入是哪个。
  • Concatenate用作经验法则​​时,请指定需要连接的轴(默认为-1)。在这里,由于您有两个输入(None, 25)(None, 25),所以axis = -1很好。但是明确一点总是好事,否则在实现复杂模型时您可能会得到奇怪的结果。