在keras中使用LSTM对层序进行分类

在keras中使用LSTM对层序进行分类,keras,Keras,我正在研究一个二进制分类问题,其中网络接受两个输入并输出这个输入对的标签 基本上,我首先使用编码器层进行嵌入,然后连接嵌入结果。接下来,我将使用RNN结构对连接的结果进行分类。但是我想不出一个合适的方法来写代码。我在下面附上我的代码 input_size = n_feature # the number of features encoder_size = 2000 # output dim for each encoder dropout_rate = 0.5 X1 = Input(shap

我正在研究一个二进制分类问题,其中网络接受两个输入并输出这个输入对的标签

基本上,我首先使用编码器层进行嵌入,然后连接嵌入结果。接下来,我将使用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层,输入应该是
(无,编码器大小*2)
。我试图使用
Y=comparer(K.transpose(merged))
来重塑LSTM层的输入,但失败了。顺便说一句,对于这个网络,输入形状是
(输入大小,)
,输出形状是
(1,)

如果要在时间序列中变换输入向量,您可以简单地对其进行整形:

comparer = Sequential()

#reshape the vector into a time series form: (None, timeSteps, features)
comparer.add(Reshape((2 * encoder_size,1), input_shape=(2*encoder_size,))

#don't return sequences, you don't want a sequence as result:
comparer.add(LSTM(512, return_sequences=False))

comparer.add(Dropout(dropout_rate))

#Don't use a TimeDistributed, you're not dealing with a series anymore  
comparer.add(Dense(1))

comparer.add(Activation('sigmoid'))

您希望编码器输出什么?单个向量还是向量序列?只是一个向量。对于LSTM,我希望看到它可以将此向量视为一个时间序列,这样它就可以记住前面看到的值。您需要使用
stateful
选项和
重塑
将其三维化。您能给我一个演示吗?我是RNN和keras的初学者。另外,我担心如果我们这样做,输出层将是
(None,1,1)
,这不是我想要的。它可以工作,但我收到一条警告消息
2017-11-16 09:48:46.605652:I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247]PoolAllocator:14091获取请求后,put_count=24107被逐出_count=10000逐出_rate=0.414817,未满足分配率=0
,即使我设置了
批大小=1
。这正常吗?听起来很奇怪。我不理解那个错误。改变批量大小会改变这些计数吗?实际上,当批量太大时,我会遇到另一个问题。前面的设置是RNN层的输入形状是
(2000*2,1)
,并且
批处理大小=200
,那么我们就有了内存错误。我将编码器大小减小到
500
,将批量大小减小到
20
,以避免此类错误。是否需要批量大小以RNN为单位批处理单元格号?我上面发布的警告消息出现在前几个批次中,然后消失。不,RNN中的单元格/单元数与批次大小无关。但我不知道那个警告信息是什么意思。我以前从未见过它。