【发布时间】:2017-11-16 20:21:02
【问题描述】:
我正在研究一个二元分类问题,其中网络接受两个输入并输出这个输入对的标签。
基本上,我首先使用编码器层进行嵌入并将嵌入结果连接起来。接下来,我将使用 RNN 结构对级联结果进行分类。但是我想不出编写代码的正确方法。我在下面附上我的代码。
input_size = n_feature # the number of features
encoder_size = 2000 # output dim for each encoder
dropout_rate = 0.5
X1 = Input(shape=(input_size, ), name='input_1')
X2 = Input(shape=(input_size, ), name='input_2')
encoder = Sequential()
encoder.add(Dropout(dropout_rate, input_shape=(input_size, )))
encoder.add(Dense(encoder_size, activation='relu'))
encoded_1 = encoder(X1)
encoded_2 = encoder(X2)
merged = concatenate([encoded_1, encoded_2])
#----------Need Help---------------#
comparer = Sequential()
comparer.add(LSTM(512, input_shape=(encoder_size*2, ), return_sequences=True))
comparer.add(Dropout(dropout_rate))
comparer.add(TimeDistributed(Dense(1)))
comparer.add(Activation('sigmoid'))
#----------Need Help---------------#
Y = comparer(merged)
model = Model(inputs=[X1, X2], outputs=Y)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
似乎对于 LSTM 层,输入应该是(None, encoder_size*2)。我尝试使用Y = comparer(K.transpose(merged)) 重塑 LSTM 层的输入,但失败了。顺便说一句,对于这个网络,输入形状是(input_size,),输出形状是(1,)。
【问题讨论】:
-
您希望编码器输出什么?单个向量还是向量序列?
-
只是一个向量。对于 LSTM,我希望看到它可以将此向量视为时间序列,这样它就可以记住之前看到的值。
-
您需要使用
stateful选项和reshape使其具有三维效果。 -
你能给我一个演示吗?我是 RNN 和 keras 的初学者。另外,如果我们这样做,恐怕输出层将是
(None, 1,1),这不是我想要的。
标签: keras