Keras LSTM对载体序列的影响

时间:2018-03-05 09:49:05

标签: python keras lstm rnn

我正在尝试使用玩具示例来学习使用keras的循环网络。数据集定义如下:

pos = [1,2,3,4] # positive observation.
neg = [1,2,3,0] # negative observation.
half_len = 500

data = np.reshape(np.concatenate((np.tile(pos, half_len), np.tile(neg, half_len)), axis=0), (2 * half_len, -1))
labels = np.asarray([1] * half_len + [0] * half_len)

这是我的模特:

model = Sequential()
model.add(Embedding(max_features, output_dim=16))
model.add(LSTM(32, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

正如预期的那样,这很容易达到准确度1.但是嵌入层不适合我的实际用例。当我将玩具示例重新格式化为以下内容时:

pos = [[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0]]
neg = [[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 1]]
half_len = 500

time_steps = 4
feature_length = 5

data = np.reshape(np.concatenate((np.tile(pos, half_len), np.tile(neg, half_len)), axis=0), (2 * half_len, time_steps, feature_length))
labels = np.asarray([1] * half_len + [0] * half_len)

模型:

model = Sequential()
model.add(LSTM(32, dropout=0.2, recurrent_dropout=0.2, input_shape=(time_steps, feature_length)))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

准确度大约为0.6(我让它训练的时间比第一个版本长5倍)。上述2如何不相同?什么是使模型适应第二个输入的好方法?

谢谢。

1 个答案:

答案 0 :(得分:0)

您正在创建的“数据”是错误的。在您的“数据”中,完整的数组(例如[[1、0、0、0、0],[0、1、0、0、0],[0、0、1、0、0],[0, 0,0,1,0]])不会重复添加,而是要多次添加同一元素(即[1,0,0,0,0]),这被视为单个输入。

d1 = np.asarray(np.split(np.tile(pos,(500,1)),500))
d2 = np.asarray(np.split(np.tile(neg,(500,1)),500))
data= np.append(d1,d2,axis=0)

将其用作数据,您将获得精度1。