主要内容

使用Deep Network Designer创建代理并使用图像观察进行培训

本示例演示如何创建一个深度Q学习网络(DQN)代理,该代理可以向上摆动并平衡在MATLAB®中建模的钟摆。在本示例中,您可以使用深度网络设计器.有关DQN代理的更多信息,请参见深度Q网络代理

MATLAB环境下摆锤的图像处理

本例的强化学习环境是一个简单的无摩擦摆,最初挂在一个向下的位置。训练目标是用最小的控制力使钟摆直立而不倾倒。

对于这种环境:

  • 向上平衡的摆位为0弧度,下悬位置为π弧度。

  • 从代理到环境的扭矩作用信号为-2到2 N·m。

  • 从环境中观察到的是摆锤的简化灰度图像和摆锤角度导数。

  • 奖励 r t ,在每个时间步长时,为

r t - θ t 2 + 0 1 θ t ˙ 2 + 0 001 u t - 1 2

在这里:

  • θ t 是垂直位置的位移角。

  • θ t ˙ 是位移角的导数。

  • u t - 1 是上一时间步的控制效果。

有关此模型的更多信息,请参见通过图像观察训练DDPG药剂摆动和平衡摆锤

创建环境接口

为摆创建一个预定义的环境接口。

env = rlPredefinedEnv (“SimplePendulumWithImage离散”);

该接口有两个观察值。第一个观察值命名为“pendImage”,是一个50乘50的灰度图像。

obsInfo=getObservationInfo(环境);obsInfo(1)
ans=rlNumericSpec,属性:LowerLimit:0上限:1名称:“pendImage”说明:[0x0字符串]维度:[50]数据类型:“double”

第二个观察,命名为“成角的”,是摆锤的角速度。

obsInfo (2)
ans=rlNumericSpec,属性:LowerLimit:-Inf上限:Inf名称:“angularRate”说明:[0x0字符串]维度:[1]数据类型:“double”

该界面有一个离散的动作空间,在这个空间中,agent可以对摆施加5个可能的扭矩值中的一个:-2,-1,0,1,或2 N·m。

actInfo = getActionInfo (env)
actInfo=rlFiniteSetSpec,属性为:元素:[-2-1 0 1 2]名称:“扭矩”说明:[0x0字符串]维度:[1 1]数据类型:“双”

修复随机生成器种子以获得再现性。

rng(0)

利用深度网络设计器构建评论网络

DQN代理使用临界值函数表示法来近似给定观察值和动作的长期奖励。在这种环境下,临界值是一个具有三个输入(两个观察值和一个动作)和一个输出的深度神经网络。有关创建深度神经网络值函数表示法的更多信息,请参阅创建策略和值函数表示

您可以通过使用深度网络设计器为此,您首先为每个观察和操作创建单独的输入路径。这些路径从各自的输入中学习较低级别的功能。然后您创建一个公共输出路径,将输入路径的输出组合起来。

创建图像观测路径

要创建图像观测路径,首先拖动图像输入层图层库窗格到画布。设置图层输入大小50岁,50岁,1对图像进行观察,并设置归一化没有一个

第二,拖动一个卷积层连接到画布,并将该层的输入连接到mageInputLayer.使用创建卷积层2过滤器(NumFilters属性),其高度和宽度为10FilterSize属性),并使用5在水平和垂直方向(大步走属性)。

最后,用两组雷卢耶fullyConnectedLayer层。第一个和第二个的输出大小fullyConnectedLayer层数分别为400和300。

创建所有输入路径和输出路径

以类似的方式构造其他输入路径和输出路径。

角速度路径(标量输入):

  • 图像输入层-设置输入大小1, - 1归一化没有一个

  • fullyConnectedLayer-设置OutputSize400

  • 雷卢耶

  • fullyConnectedLayer-设置OutputSize300

动作路径(标量输入):

  • 图像输入层-设置输入大小1, - 1归一化没有一个

  • fullyConnectedLayer-设置OutputSize300

输出路径:

  • additionLayer-将所有输入路径的输出连接到此层的输入。

  • 雷卢耶

  • fullyConnectedLayer-设置OutputSize1对于标量值函数。

从深层网络设计师导出网络

要将网络导出到MATLAB工作区,请在深度网络设计器点击出口深度网络设计器将网络导出为包含网络层的新变量。可以使用此层网络变量创建批评家表示。

或者,要为网络生成等效的MATLAB代码,请单击导出>生成代码

生成的代码如下所示。

lgraph=layerGraph();tempLayers=[imageInputLayer([1],“名称”“成角的”“归一化”“没有”) fullyConnectedLayer (400,“名称”“dtheta_fc1”) reluLayer (“名称”“dtheta_relu1”) fullyConnectedLayer (300,“名称”“dtheta_fc2”)]; lgraph=添加层(lgraph,tempLayers);tempLayers=[imageInputLayer([1],“名称”“扭矩”“归一化”“没有”) fullyConnectedLayer (300,“名称”“扭矩_fc1”)];lgraph=addLayers(lgraph,tempLayers);tempLayers=[imageInputLayer([50 1],“名称”“pendImage”“归一化”“没有”)卷积2层([10],2,“名称”“img_conv1”“填充”“相同”“跨步”,[5])reluLayer(“名称”“relu_1”) fullyConnectedLayer (400,“名称”“评论家西塔fc1”) reluLayer (“名称”“theta_relu1”) fullyConnectedLayer (300,“名称”“评论家西塔fc2”)]; lgraph=添加层(lgraph,tempLayers);tempLayers=[additionLayer(3,“名称”“添加”) reluLayer (“名称”“relu_2”)完全连接层(1,“名称”“状态值”)];lgraph=addLayers(lgraph,tempLayers);lgraph=connectLayers(lgraph,“扭矩_fc1”“添加/ in3”);lgraph = connectLayers (lgraph,“评论家西塔fc2”“添加/三机一体”);lgraph = connectLayers (lgraph,“dtheta_fc2”“添加/ in2”);

查看critical网络配置。

图形绘图(lgraph)

Figure包含axes对象。axes对象包含graphplot类型的对象。

为使用的批评家表示指定选项rlRepresentationOptions

criticOpts = rlRepresentationOptions (“LearnRate”,1e-03,“GradientThreshold”1);

使用指定的深度神经网络创建批评家表示lgraph和选项。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation

评论家= rlQValueRepresentation (lgraph obsInfo actInfo,...“观察”, {“pendImage”“angularRate”},“行动”, {“扭矩”}, criticOpts);

要创建DQN代理,请首先使用指定DQN代理选项rlDQNAgentOptions

agentOpts = rlDQNAgentOptions (...“UseDoubleDQN”假的,...“TargetUpdateMethod”“平滑”...“TargetSmoothFactor”,1e-3,...“ExperienceBufferLength”1 e6,...“DiscountFactor”, 0.99,...“采样时间”env。Ts,...“MiniBatchSize”,64);agentOpts.epsilongreedexploration.EpsilonDecay=1e-5;

然后,使用指定的评论表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent

代理= rlDQNAgent(评论家,agentOpts);

火车代理

要培训代理,首先指定培训选项。

  • 每次训练最多5000集,每次训练最多500个时间步。

  • 在“事件管理器”对话框中显示培训进度(设置阴谋选项),并禁用命令行显示(设置详细的选择).

  • 当代理在连续五集的默认窗口长度上收到大于–1000的平均累积奖励时,停止训练。此时,代理可以使用最小的控制努力快速平衡垂直位置的钟摆。

有关更多信息,请参见rlTrainingOptions

trainOpts = rlTrainingOptions (...“最大集”,5000,...“MaxStepsPerEpisode”,500,...“冗长”假的,...“阴谋”“培训进度”...“StopTrainingCriteria”“平均向上”...“StopTrainingValue”,-1000);

在训练或模拟过程中,可以使用情节函数。

情节(env)

图Simple Pendulum Visualizer包含2个轴的物体。坐标轴对象1包含2个类型为直线、矩形的对象。axis对象2包含一个image类型的对象。

使用火车函数。这是一个计算密集型过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置doTraining.自己训练代理人,设置doTraining真正的

doTraining = false;如果doTraining%培训代理人。trainingStats=列车(代理人、环境、列车员);其他的%为示例加载预训练代理。装载(“MATLABPendImageDQN.mat”“代理人”);结束

模拟DQN代理

为了验证训练过的代理的性能,在摆环境中模拟它。有关代理模拟的更多信息,请参见模拟选项sim卡

simOptions=rlSimulationOptions(“MaxSteps”, 500);经验= sim (env,代理,simOptions);

图Simple Pendulum Visualizer包含2个轴的物体。坐标轴对象1包含2个类型为直线、矩形的对象。axis对象2包含一个image类型的对象。

totalReward=总和(经验奖励)
totalReward = -888.9802

另请参阅

|

相关的话题