将 lstm 单元添加到神经网络以进行强化学习

Add lstm cell to neural network for reinforcement learning

我刚开始学习神经网络和人工智能。对于我的大学项目,我试图让代理人驾驶汽车驶向放置在飞机上随机位置的目标。这是我的模型代码:

def CreateModel(self):
    model = Sequential()
    model.add(Conv2D(40, kernel_size=(7, 9), strides=(1, 1), input_shape=self.input_shape, activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
    model.add(Conv2D(70, kernel_size=(5, 5), strides=(1, 1), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
    model.add(Conv2D(90, kernel_size=(4, 5), strides=(1, 1), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
    model.add(Activation('relu'))
    model.add(Flatten())
    model.add(Dense(768))
    model.add(Activation('relu'))
    model.add(Dense(1024))
    model.add(Activation('relu'))
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dense(5))
    model.add(Activation('softmax'))
    model.compile(loss="mean_squared_error", optimizer=keras.optimizers.Adam(lr=self.learning_rate))
    return model

def __init__(self, load='', epsilon=0.8):
    self.input_shape = (90,120,3)

    # Training hyperparameters
    self.gamma           = 0.99
    self.epsilon         = epsilon
    self.epsilon_min     = 0.3
    self.epsilon_decay   = 0.9998
    self.learning_rate   = 0.001
    self.tau             = 0.05 
    self.memory_size     = 2000

    self.memory = deque(maxlen=self.memory_size)

    if (load != ''):
        print('|| ------------  Init model load: {0}'.format(load))
        self.model = load_model(load)
        self.target_model = load_model(load)
    else:
        print('|| ------------  No load. Initializing')
        self.model = self.CreateModel()
        self.target_model = self.CreateModel()



def Act(self, state):
    self.epsilon *= self.epsilon_decay
    self.epsilon = max(self.epsilon_min, self.epsilon)

    print("|| ----  Epsilon: {0}".format(self.epsilon))

    if np.random.random() < self.epsilon:
        return np.random.randint(low=0,high=5)

    return (self.model.predict(state)).argmax(axis=1)[0]

它采用单个 120 x 90 3 通道图像作为输入,并输出 Q 值向量,用于根据图像可以采取的 5 种可能操作。我阅读了这篇研究论文 (https://link.springer.com/content/pdf/10.1007%2Fs00521-017-3241-z.pdf) 并以此为基础对我的网络进行了建模。我已经训练了一段时间,但结果令人失望。 我想合并一个 LSTM 单元来处理 10 个连续帧而不是 1 个连续帧的序列,并为每个序列输出相同的单个 5 元素数组。我试图理解 Keras LSTM 和 TimeDistributed 层,但无法理解如何对我的模型进行相应的更改。请帮助我或将我引导至以新手方式解决此主题的页面?

现在您的输入形状应该是 (1,120, 90, 3),其中 1 指的是 batch_size。 对于包含 5 张图片的时间序列,您需要一个新的批量大小:(1, 10, 120, 90, 3)。这是一个 5D 张量。 虽然在你可以尝试这一层之前我从未尝试过这个:https://keras.io/layers/recurrent/#convlstm2d 这接受 5D 张量并输出典型的 4D 张量。有了这个输出,你就可以像以前一样简单地恢复卷积和池化。

如果您想使用多个 convlstm2d 层,您必须在除最后一个 conv2lstm 层之外的所有层中设置 return_sequences=True。