使用深度网络设计器创建代理和使用图像观察训练
这个例子展示了如何创建一个深度q学习网络(DQN)代理,它可以摆动和平衡MATLAB®中建模的摆。在本例中,使用深层网络设计师.有关DQN代理的更多信息,请参见DQN (Deep Q-Network)代理.
摆摆摆动与图像MATLAB环境
本例中的强化学习环境是一个简单的无摩擦钟摆,最初悬挂在向下的位置。训练目标是用最小的控制力使钟摆直立而不跌倒。
对于这个环境:
向上平衡的钟摆位置为
0
弧度,向下悬挂的位置是π
弧度。从试剂到环境的扭矩动作信号在-2到2 N·m之间。
从环境观测得到的是摆的简化灰度图像和摆角导数。
奖励 ,在每个时间步上提供,为
在这里:
为从直立位置的位移角。
是位移角的导数。
是来自前一个时间步骤的控制努力。
有关此模型的更多信息,请参见利用图像观察训练DDPG代理上摆和平衡摆.
创建环境接口
为钟摆创建一个预定义的环境接口。
env = rlPredefinedEnv (“SimplePendulumWithImage-Discrete”);
接口有两个观测值。第一个观察,命名为“pendImage”
,为50 × 50灰度图像。
obsInfo = getObservationInfo (env);obsInfo (1)
ans = rlNumericSpec,属性:LowerLimit: 0 UpperLimit: 1名称:"pendImage"描述:[0x0 string]维度:[50 50]数据类型:"double"
第二个观察结果被命名为“angularRate”
为钟摆的角速度。
obsInfo (2)
ans = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "angularRate" Description: [0x0 string] Dimension: [1 1] DataType: "double"
该界面具有一个离散的动作空间,在该空间中,代理可以向钟摆施加5个可能的扭矩值之一:-2、-1、0、1或2 N·m。
actInfo = getActionInfo (env)
actInfo = rlFiniteSetSpec属性:元素:[-2 -1 0 1 2]名称:"torque"描述:[0x0 string]尺寸:[1 1]数据类型:"double"
固定随机生成器种子的再现性。
rng (0)
利用深度网络设计器构建批评家网络
DQN代理在给定的观察和行动下,使用临界价值函数表示逼近长期奖励。对于这种环境,批评家是一个具有三个输入(两个观察和一个动作)和一个输出的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建政策和价值功能.
可以通过交互式的方式构建批评家网络深层网络设计师为此,你首先为每个观察和动作创建单独的输入路径。这些路径从各自的输入中学习较低级别的特征。然后创建一个公共输出路径,该路径组合了来自输入路径的输出。
创建图像观测路径
要创建图像观察路径,首先拖动imageInputLayer
从层的图书馆窗格到画布上。设置层InputSize来50岁,50岁,1
对图像进行观察,并设置归一化来没有一个
.
第二,拖convolution2DLayer
到画布,并连接此层的输入到I的输出mageInputLayer
.创建一个卷积层2
过滤器(NumFilters属性),其高度和宽度为10
(FilterSize属性),并使用一个步幅5
在水平和垂直方向(步属性)。
最后,用两组完成图像路径网络reLULayer
而且fullyConnectedLayer
层。第一个和第二个的输出大小fullyConnectedLayer
层分别为400和300。
创建所有输入路径和输出路径
以类似的方式构造其他输入路径和输出路径。对于本例,使用以下选项。
角速度路径(标量输入):
imageInputLayer
——设置InputSize来1, - 1
而且归一化来没有一个
.fullyConnectedLayer
——设置OutputSize来400
.reLULayer
fullyConnectedLayer
——设置OutputSize来300
.
动作路径(标量输入):
imageInputLayer
——设置InputSize来1, - 1
而且归一化来没有一个
.fullyConnectedLayer
——设置OutputSize来300
.
输出路径:
additionLayer
—将所有输入路径的输出都连接到该层的输入。reLULayer
fullyConnectedLayer
——设置OutputSize来1
对于标量值函数。
从深度网络设计器导出网络
要将网络导出到MATLAB工作区,请在深层网络设计师,点击出口.深层网络设计师将网络导出为包含网络层的新变量。您可以使用这个层网络变量创建批评家表示。
或者,为网络生成等价的MATLAB代码,单击导出>生成代码.
生成的代码如下所示。
lgraph = layerGraph ();tempLayers = [imageInputLayer([1 1 1],“名称”,“angularRate”,“归一化”,“没有”) fullyConnectedLayer (400,“名称”,“dtheta_fc1”) reluLayer (“名称”,“dtheta_relu1”) fullyConnectedLayer (300,“名称”,“dtheta_fc2”));lgraph = addLayers (lgraph tempLayers);tempLayers = [imageInputLayer([1 1 1],“名称”,“扭矩”,“归一化”,“没有”) fullyConnectedLayer (300,“名称”,“torque_fc1”));lgraph = addLayers (lgraph tempLayers);tempLayers = [imageInputLayer([50 50 1],“名称”,“pendImage”,“归一化”,“没有”10) convolution2dLayer ([10], 2,“名称”,“img_conv1”,“填充”,“相同”,“步”[5] 5) reluLayer (“名称”,“relu_1”) fullyConnectedLayer (400,“名称”,“critic_theta_fc1”) reluLayer (“名称”,“theta_relu1”) fullyConnectedLayer (300,“名称”,“critic_theta_fc2”));lgraph = addLayers (lgraph tempLayers);tempLayers = [additionLayer(3,“名称”,“添加”) reluLayer (“名称”,“relu_2”) fullyConnectedLayer (1,“名称”,“stateValue”));lgraph = addLayers (lgraph tempLayers);lgraph = connectLayers (lgraph,“torque_fc1”,“添加/ in3”);lgraph = connectLayers (lgraph,“critic_theta_fc2”,“添加/三机一体”);lgraph = connectLayers (lgraph,“dtheta_fc2”,“添加/ in2”);
查看批评家网络配置。
图绘制(lgraph)
使用指定批评家表示的选项rlOptimizerOptions
.
criticOpts = rlOptimizerOptions (“LearnRate”1 e 03“GradientThreshold”1);
使用指定的深度神经网络创建批评家表示lgraph
和选项。您还必须为批评者指定操作和观察信息,这些信息将从环境接口获得。有关更多信息,请参见rlQValueFunction
.
网= dlnetwork (lgraph);评论家= rlQValueFunction(净、obsInfo actInfo,...“ObservationInputNames”, (“pendImage”,“angularRate”),“ActionInputNames”,“扭矩”);
要创建DQN代理,首先使用指定DQN代理选项rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions (...“UseDoubleDQN”假的,...“CriticOptimizerOptions”criticOpts,...“ExperienceBufferLength”1 e6,...“SampleTime”, env.Ts);agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1 e-5;
然后,使用指定的批评家表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
火车代理
要培训代理,首先要指定培训选项。对于本例,使用以下选项。
每次训练最多5000集,每集持续最多500个时间步。
在“集训管理器”对话框中显示训练进度
情节
选项)并禁用命令行显示(设置详细的
选项假
).当代理获得的平均累积奖励超过默认连续5集的窗口长度-1000时停止训练。在这一点上,代理可以用最小的控制努力快速平衡摆在直立位置。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...“MaxEpisodes”, 5000,...“MaxStepsPerEpisode”, 500,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, -1000);
可以在训练或模拟过程中可视化摆系统情节
函数。
情节(env)
训练代理使用火车
函数。这是一个计算密集的过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining
来假
.亲自训练探员,设doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainOpts);其他的为示例加载经过训练的代理。负载(“MATLABPendImageDQN.mat”,“代理”);结束
模拟DQN代理
要验证经过训练的代理的性能,请在摆环境中对其进行模拟。有关代理模拟的更多信息,请参见rlSimulationOptions
而且sim卡
.
simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward = -888.9802