我想实现一个暹罗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))
...
...
在这两种设置中,模型可以使用相同的输入正常工作。但这两种实现之间有什么区别吗?还是有另一种写作方式?