当前位置: 首页 > 科技观察

AI实战,用Python玩转自动驾驶!_0

时间:2023-03-16 01:45:20 科技观察

安装环境gym是一个用于开发和比较强化学习算法的工具包。在python中安装gym库及其子场景相对容易。安装gym:pipinstallgym安装autopilot模块,这里使用EdouardLeurent在github上发布的包highway-env:pipinstall--usergit+https://github.com/eleurent/highway-env包含6个场景:高速公路—“highway-v0”合并—“merge-v0”Roundabout——“roundabout-v0”Parking——“parking-v0”Crossroad——“intersection-v0”Racingtrack—“Racetrack-v0”详细文档可以参考这里:https://highway-env.readthedocs.io/en/latest/配置环境安装完成后,可以在代码中进行实验(以高速公路场景为例):importgymimporthighway_env%matplotlibinlineenv=gym.make('highway-v0')env.reset()for_inrange(3):action=env.action_type.actions_indexes["IDLE"]obs,reward,done,info=env.step(action)之后env.render()运行,模拟器中会生成如下场景:env类有很多参数可以配置,具体请参考原文档训练模型1.数据过程ssing(1)statehighway-env包中没有定义传感器,车辆的所有状态(观测值)都是从底层代码中读取的,这样可以省去很多前期的工作。根据文档,状态(ovservations)有三种输出方式:Kinematics、GrayscaleImage和Occupancygrid。Kinematics输出一个V*F的矩阵,V代表需要观察的车辆数量(包括ego车辆本身),F代表需要统计的特征数量。示例:数据生成时,默认进行归一化处理,取值范围为:[100,100,20,20]。也可以设置除本车以外的车辆属性是地图的绝对坐标还是本车的相对坐标。定义环境时需要设置features的参数:config=\{"observation":{"type":"Kinematics",#select5vehiclesforobservation(includingegovehicle)"vehicles_count":5,#共有7个特征"features":["presence","x","y","vx","vy","cos_h","sin_h"],"features_range":{"x":[-100,100],"y":[-100,100],"vx":[-20,20],"vy":[-20,20]},"absolute":False,"order":"sorted"},"simulation_frequency":8,#[Hz]"policy_frequency":2,#[Hz]}GrayscaleImage生成一张W*H的灰度图,W代表图片宽度,H代表图片高度Occupancygrid生成一个WHFW*H表的三维矩阵表示本车周围的车辆情况,每个格子包含F个特征。(2)actionhighway-env包中的动作分为连续型和离散型两种。连续动作可以直接定义油门和转向角的值,离散动作包含5个元动作:ACTIONS_ALL={0:'LANE_LEFT',1:'IDLE',2:'LANE_RIGHT',3:'FASTER',4:'SLOWER'}(3)rewardhighway-env包除了停车场景外,使用了相同的奖励函数:该函数只能在其源码中更改,外层只能调整权重。(停车场景的rewardfunction包含在原文档中)2.搭建模型DQN网络,我使用第一种状态表示方法——Kinematics进行演示。由于状态数据量较小(5车*7特征),可以忽略CNN的使用,直接将二维数据的大小[5,7]转化为[1,35]。模型的输入是35,输出是离散动作的个数,一共5个。importtorchimporttorch.nnasnnfromtorch.autogradimportVariableimporttorch.nn.functionalasFimporttorch.optimasoptimimporttorchvision.transformsasTfromtorchimportFloatTensor,LongTensor,ByteTensorfromcollectionsimportnamedtupleimportrandomTensor=FloatTensorEPSILON=0#epsilon用于epsilongreedyapproachGAMMA=0.9TARGET_NETWORK_REPLACE_FREQ=40#目标网络更新频率MEMORY_CAPACITY=100BATCH_SIZE=80LR=0.01#learningrateclassDQNNet(nn.Module):def__init__(self):super(DQNNet,self).__init__()self.linear1=nn.Linear(35,35)self.linear2=nn.Linear(35,5)defforward(self,s):s=torch.FloatTensor(s)s=s.view(s.size(0),1,35)s=self.linear1(s)s=self.linear2(s)返回sclassDQN(object):def__init__(self):self.net,self.target_net=DQNNet(),DQNNet()self.learn_step_counter=0self.memory=[]self.position=0self.capacity=MEMORY_CAPACITYself.optimizer=torch.optim.Adam(self.net.parameters(),lr=LR)self.loss_func=nn.MSELoss()defchoose_action(self,s,e):x=np.expand_dims(s,axis=0)如果np.random.uniform()<1-e:actions_value=self.net.forward(x)action=torch.max(actions_value,-1)[1].data.numpy()action=action.max()else:action=np.random.randint(0,5)返回动作defpush_memory(self,s,a,r,s_):如果len(self.memory)