### 实现DQN算法于CARLA框架
#### 创建环境配置
为了在CARLA环境中实施深度Q网络(DQN),首先需构建适合强化学习训练的基础架构。这涉及到安装必要的软件包以及初始化模拟器设置,确保能够稳定运行实验[^2]。
```bash
pip install carla gym numpy tensorflow stable-baselines3
```
上述命令用于下载所需的Python库文件,包括CARLA客户端API接口、OpenAI Gym工具箱以及其他辅助依赖项。
#### 设计动作与观测空间
紧接着定义智能体可执行的动作集合及其感知外界的方式。对于车辆控制而言,通常考虑加速踏板开度(油门/制动)及方向盘转角作为行动参数;而观察则可能涵盖自车动态特性(如位移坐标、瞬时速率)、周边交通状况或是车载传感装置反馈的数据流——例如视觉图像或激光测距仪信号等[^4]。
```python
import gym
from gym import spaces
import carla
class CarlaEnv(gym.Env):
"""Custom Environment that follows gym interface"""
metadata = {'render.modes': ['human']}
def __init__(self, host='localhost', port=2000):
super(CarlaEnv, self).__init__()
# Define action and observation space
self.action_space = spaces.Box(low=np.array([-1., 0.]), high=np.array([+1., 1.]))
self.observation_space = spaces.Dict({
"image": spaces.Box(low=0, high=255, shape=(84, 84, 3), dtype=np.uint8),
"velocity": spaces.Box(low=-np.inf, high=+np.inf, shape=(3,))
})
...
```
此段代码片段展示了如何利用`gym.Space`类来描述连续型操作范围(-1到+1之间变化的方向盘角度和0至完全踩下之间的加速度指令)以及由RGB像素矩阵构成的视图加上三维向量形式的速度表示所组成的复合观测结构。
#### 构建神经网络模型
接下来便是搭建适配于特定任务需求的目标函数逼近器——即所谓的策略π(a|s;θ)。鉴于本场景属于离散时间马尔科夫决策过程范畴内的一种特殊情况,故选用全连接前馈式多层感知机MLP作为基础单元,并通过卷积运算提取特征表达以适应输入端口处接收到的一系列二维灰阶影像资料[^1]。
```python
from stable_baselines3 import DQN
from stable_baselines3.common.torch_layers import BaseFeaturesExtractor
import torch as th
import torch.nn.functional as F
import torchvision.transforms as T
class CustomCNN(BaseFeaturesExtractor):
"""
:param observation_space: (gym.Space)
:param features_dim: (int) Number of features extracted.
This corresponds to the number of unit for the last layer.
"""
def __init__(self, observation_space: gym.spaces.Dict, features_dim: int = 512):
super().__init__(observation_space, features_dim)
n_input_channels = observation_space['image'].shape[-1]
self.cnn = nn.Sequential(
nn.Conv2d(n_input_channels, 32, kernel_size=8, stride=4, padding=0),
nn.ReLU(),
nn.Conv2d(32, 64, kernel_size=4, stride=2, padding=0),
nn.ReLU(),
nn.Flatten()
)
with th.no_grad():
sample_obs = {k:v[None,...].float() for k,v in observation_space.sample().items()}
n_flatten = self.cnn(sample_obs["image"]).shape[1]
self.linear = nn.Linear(n_flatten, features_dim)
def forward(self, observations: Dict[str, th.Tensor]) -> th.Tensor:
return F.relu(self.linear(self.cnn(observations["image"])))
policy_kwargs = dict(features_extractor_class=CustomCNN,
net_arch=[dict(pi=[256], vf=[256])])
model = DQN('MultiInputPolicy',
env=env,
learning_rate=1e-4,
buffer_size=int(1e6),
batch_size=32,
gamma=.99,
target_update_interval=10_000,
exploration_fraction=.1,
verbose=1,
policy_kwargs=policy_kwargs,
tensorboard_log="./tensorboard_logs/")
```
这里采用Stable Baseline3开源项目所提供的高层级封装接口快速实例化了一个基于双经验回放机制更新目标网络权重的标准DDPG变种版本-DQN对象实体。值得注意的是,在构造过程中还特别指定了自定义化的特征抽取子模块`CustomCNN`负责处理来自摄像机组件传入的画面帧序列,从而更好地捕捉潜在模式规律以便后续做出合理判断抉择。
#### 训练评估流程
最后一步就是启动迭代循环逐步累积交互经历直至满足预设收敛条件为止。期间可通过可视化手段实时监控各项性能指标走势变化趋势,进而调整超参组合寻求更优解方案[^3]。
```python
timesteps = 1e7
log_dir = "./logs/"
os.makedirs(log_dir, exist_ok=True)
callback = CallbackList([
EvalCallback(env, best_model_save_path=log_dir+"best_model",
log_path=log_dir, eval_freq=10000,
deterministic=True, render=False),
CheckpointCallback(save_freq=10000, save_path='./checkpoints/',
name_prefix='rl_model')
])
model.learn(total_timesteps=timesteps, callback=callback)
model.save(f"{log_dir}final_model")
del model # remove to demonstrate saving and loading
```
这段脚本实现了完整的自动化调教周期管理逻辑,不仅记录下了每次测试得分情况供后期分析对比之用,同时也定期保存阶段性成果防止意外丢失重要数据资产。