0

我正在使用 LSTM 层构建 DQN。尝试将 96 个时间段、33 个特征数组传递给模型,用于训练,即:shape=(96, 33) 还尝试实现后填充掩码 (val=0.) 以适应可变长度序列(最大长度=96)。

model = Sequential()
inp = (NUM_TIMEPERIODS, NUM_FEATURES)
model.add(Masking(mask_value=0., input_shape=inp))
model.add(LSTM(NUM_FEATURES, input_shape=inp, activation='tanh', return_sequences=True))
model.add(LSTM(NUM_FEATURES, activation='tanh'))
model.add(Dense(NUM_FEATURES, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',
              optimizer=Adam(lr=LEARNING_RATE, decay=DECAY),
              metrics=['accuracy'])

当我提交一个名为 current_states 的序列时,形状为 (96, 33),使用:

current_qs_list = self.model.predict(current_states)

要生成 q 值,返回错误:

ValueError: Input 0 of layer lstm is incompatible with the layer: 
expected ndim=3, found ndim=2. Full shape received: [32, 33]

我认为 32 是被提交给模型的第一个序列的屏蔽长度(超出最大长度 96),并被转储......试图在屏蔽层之前立即添加一个输入层:

model.add(Input(batch_size=None, shape=inp))

但没有解决方案,只有更多的错误。请问如何重写模型输入层以在 [96,33] 数组上接收和训练?或者我是否需要将一批序列(例如:4 个序列)合并到一个数组中作为 [4, 96, 33] 然后提交给模型?

4

1 回答 1

0

我想出的唯一可行的解​​决方案是将两个或多个 (96, 33) 数组组合成一个小批量:

minibatchSize = 2
current_states = np.concatenate(array1(96,33), array2(96,33)).reshape(minbatchSize, 
                 NUM_TIMEPERIODS, NUM_FEATURES)

然后提交给模型,该模型在 Masking 之前添加了一个 Input 层:

model.add(Input(batch_size=minibatchSize, shape=inp))

如果不指定非零或非 1 的批大小并在输入层中指定该批大小,就无法使其工作。必须使用批次...

于 2020-08-02T11:24:59.603 回答