这两个代码片段是否等效(使用Keras实现连体RNN网络)?

时间:2017-03-09 08:54:50

标签: keras

我想实现一个暹罗RNN网络,其中该网络的两条腿是共享的,并且在每个时间步,RNN将CNN输出作为输入,如下所示:

   X1    X2    X3    X4             Y1    Y2    Y3    Y4
    |     |     |     |              |     |     |     |
   CNN   CNN   CNN   CNN            CNN   CNN   CNN   CNN
    |     |     |     |              |     |     |     |
   RNN-->RNN-->RNN-->RNN--->[][]<---RNN<--RNN<--RNN<--RNN
                             ||
                         Classifier

我以这种方式使用Keras TimeDistributed Wrapper实现它:

cnn = InceptionV3(include_top=False)(input_im)
cnn = Flatten()(cnn)
# Use one TimeDistributed
cnn = TimeDistributed(Model(input=input_im, output=cnn))
rnn = LSTM(64)(cnn)

leg_a = Input(shape=sequence_shape)
leg_b = Input(shape=sequence_shape)
leg_a = rnn(leg_a)
leg_b = rnn(leg_b)
merged = merge([leg_a, leg_b], mode='concat', concat_axis=-1)
merged = Dense(1, activation='sigmoid')(merged)

我不知道上面的代码是否与以下内容等效:

# Use one TimeDistributed for one layer respectively
cnn = TimeDistributed(InceptionV3(include_top=False))(input_im)
cnn = TimeDistributed(Flatten())(cnn)
cnn = Model(input=input_im, output=cnn)
rnn = Sequential()
rnn.add(cnn)
rnn.add(LSTM(64))
...
...

在这两种设置中,模型可以使用相同的输入正常工作。但这两种实现之间有什么区别吗?还是有另一种写作方式?

0 个答案:

没有答案