以下代码参考自:(如有侵权,请联系我立即删除)、
使用 Carla 和 Python 的自动驾驶汽车第 4 部分 —— 强化学习代理_强化学习与carla是如何联合的过程-优快云博客
本篇文章是小编在pycharm上自己手敲代码学习自动驾驶的第三篇文章,主要讲述如何编写Agent类,它将与我们设计的强化学习环境交互,并容纳我们实际的强化学习模型。
1、创建DQNAgent类,首先定义init方法
该方法的主要内容如下:
(1)构造两个网络model和target_model,一个为不断进化的主网络(又叫策略网络),一个为目标网络,刚开始两个网络的权重相同
(2)构造经验回放内存存储区,由一个双端队列deque构成。
该区域用于存储一系列的经验(或称为转换、transitions),每个transition通常包含四个或五个元素:当前状态(state)、采取的动作(action)、获得的奖励(reward)、新状态(next state),以及一个布尔值表示该状态是否是终止状态(done);
这里使用deque构造函数创建了一个双端队列,并通过maxlen参数设置了队列的最大长度。这意味着当队列中的元素数量超过 REPLAY_MEMORY_SIZE
时,最旧的元素将被自动从队列的一端移除,以便为新元素腾出空间。这样做可以限制内存的使用,并确保经验回放内存中的经验保持最新。
经验回放内存的主要作用是允许算法在训练时随机地采样一批经验,而不是仅仅使用最新的经验。这样做可以打破经验之间的时间相关性,并减少训练过程中的波动。此外,由于经验被存储在内存中,算法可以多次使用这些经验来训练模型,从而提高数据的利用效率。
(3)设置一些参数:tf.get_defaut_graph这个函数可以获取当前默认的计算图;self.training_initialized用于跟踪TensorFlow何时准备就绪
class DQNAgent:
def __init__(self):
self.model = self.create_model()
self.target_model = self.create_model()
self.target_model.set_weights(self.model.get_weights())
self.replay_memory = deque(maxlen=REPLAY_MEMORY_SIZE)
self.tensorboard = ModifiedTensorBoard(log_dir=f"logs/{MODEL_NAME}-{int(time.time())}")
self.target_update_counter = 0
self.graph = tf.get_default_graph()
self.terminate = False
self.last_logged_episode = 0
self.training_initialized = False
2、定义创建网络模型的方法create_model
该方法的主要内容如下:
(1)导入基础模型Xception模型,但是您也可以制作其他模型,或者导入一个不同的模型。
weights=None的意思是:不加载任何预训练的权重。这意味着Xception
模型的所有权重(即,网络中的连接参数)将被随机初始化(根据层的默认初始化策略,除非你在层定义中指定了不同的初始化器)。然后,这些权重将在训练过程中通过反向传播算法进行更新,以最小化指定的损失函数;
include_top=False将加载预训练模型的所有卷积层(或其他类型的特征提取层),但不包括顶部的全连接层,这意味着模型不包括用于分类的输出层;
最后一个参数表示输入图像的尺寸为 (IM_HEIGHT, IM_WIDTH, 3)
,即图像的高度、宽度和颜色通道数。
Xception模型-优快云博客Xception模型具体内容参考我的另一篇文章:Xception模型-优快云博客
(2)针对实际情况对基础模型进行修改:通过 base_model.output
获取基础模型的输出,然后使用 GlobalAveragePooling2D
对特征图进行全局平均池化,这有助于减少参数数量,并减少过拟合的风险。使用 Dense
层添加一个具有3个神经元的全连接层( 3
表示这个层有3个神经元(或称为单元)。这通常对应于您想要模型预测的输出值的数量。在您的情况下,这可能意味着您正在处理一个回归问题,并且您希望模型预测3个连续值),激活函数为 "linear",这意味着输出是连续的数值。
(3)定义一个新的Keras模型,指定了模型的输入和输出。
(4)编译模