在神经网络中添加LSTM单元用于强化学习

我刚开始学习神经网络和人工智能。我的大学项目是尝试让一个智能体驾驶汽车朝向在一个平面上随机放置的目标。这是我的模型代码:

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 modeldef __init__(self, load='', epsilon=0.8):    self.input_shape = (90,120,3)    # 训练超参数    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('|| ------------  初始化模型加载: {0}'.format(load))        self.model = load_model(load)        self.target_model = load_model(load)    else:        print('|| ------------  无加载。正在初始化')        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的三通道图像作为输入,并输出一个基于图像可以采取的5个可能动作的Q值向量。我阅读了这篇研究论文(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张图片的时间序列,你需要一个新的batch size: (1, 10, 120, 90, 3)。这是一个5D张量。虽然我之前从未尝试过,你可以尝试这个层: https://keras.io/layers/recurrent/#convlstm2d它接受5D张量并输出典型的4D张量。有了这个输出,你可以简单地继续像之前一样进行卷积和池化操作。

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注