这个例子展示了如何创建一个深度q学习网络(DQN)代理,可以摆动和平衡一个在MATLAB®中建模的摆。在本例中,使用以下命令创建DQN代理深层网络设计师.有关DQN代理商的更多信息,请参阅深Q-Network代理.
用于该示例的增强学习环境是一个简单的无摩擦摆锤,其最初悬挂在向下位置。培训目标是使摆锤直立,而不会使用最小的控制工作。
对于这种环境:
向上平衡的摆锤位置是0.
弧度,向下悬挂的位置是PI.
弧度。
agent对环境的力矩动作信号为-2 ~ 2n·m。
从环境中观察到的是摆锤的简化灰度图像和摆锤角度导数。
奖励 ,每次步骤都提供了
这里:
为从垂直位置位移的角度。
是位移角的导数。
是上一个时间步骤的控制工作。
有关此模型的更多信息,请参阅用图像观察训练DDPG Agent上摆和平衡摆.
为摆锤创建预定义的环境界面。
Env = Rlpredefinedenv(“SimplePendulumWithImage-Discrete”);
该接口有两个观察值。第一个观察值命名为“pendImage”
,是一幅50乘50的灰度图像。
obsInfo = getObservationInfo (env);obsInfo (1)
ans = rlNumericSpec with properties: LowerLimit: 0 UpperLimit: 1 Name: "pendImage" Description: [0x0 string] Dimension: [50 50] DataType: "double"
第二个观察,命名为“成角的”
,为钟摆的角速度。
obsinfo(2)
ans = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "angularRate" Description: [0x0 string] Dimension: [1 1] DataType: "double"
该接口具有离散动作空间,其中代理可以将五种可能的扭矩值中的一个应用于摆锤:-2,-1,0,1或2 n·m。
Actinfo = GetActionInfo(ENV)
属性:Elements: [-2 -1 0 1 2] Name: "torque" Description: [0x0 string] Dimension: [1 1] DataType: "double"
修复随机生成器种子的再现性。
rng (0)
DQN代理使用批判价值函数表示来近似给定的观察和行动的长期奖励。在这个环境中,评论家是一个有三个输入(两个观察和一个动作)和一个输出的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
您可以使用该批读网络深层网络设计师为此,您首先为每个观察和操作创建单独的输入路径。这些路径从各自的输入中学习较低级别的功能。然后您创建一个公共输出路径,将输入路径的输出组合起来。
创建图像观察路径
要创建图像观察路径,请先拖动一个imageInputLayer
从层的图书馆窗格到画布。设置图层输入大小来50,50,1
用于图像观察,并设置正常化来没有一个
.
第二,拖卷积层
连接到画布,并将该层的输入连接到mageinputlayer.
.创建一个卷积层2
过滤器(numfilters.具有高度和宽度的财产10.
(过滤属性),并使用5.
在水平和垂直方向(步财产)。
最后,用两组完成图像路径网络雷卢耶
和全康统计层
层。第一和第二的输出尺寸全康统计层
层分别为400和300。
创建所有输入路径和输出路径
以类似的方式构造其他输入路径和输出路径。对于本示例,请使用以下选项。
角速度路径(标量输入):
imageInputLayer
——设置输入大小来1,1
和正常化来没有一个
.
全康统计层
——设置输出来400
.
雷卢耶
全康统计层
——设置输出来300
.
操作路径(标量输入):
imageInputLayer
——设置输入大小来1,1
和正常化来没有一个
.
全康统计层
——设置输出来300
.
输出路径:
附加学者
-将所有输入路径的输出连接到该层的输入。
雷卢耶
全康统计层
——设置输出来1
对于标量值函数。
将网络导出到MATLAB工作区,在深层网络设计师,点击出口.深层网络设计师将网络导出为包含网络层的新变量。您可以使用此层网络变量创建批评家表示。
或者,要为网络生成等效的MATLAB代码,请单击导出>生成代码.
生成的代码如下。
lgraph = layerGraph ();templayer = [imageInputLayer([1 1 1],]),“姓名”那“成角的”那“正常化”那“没有任何”)全连接列(400,“姓名”那“dtheta_fc1”)剥离(“姓名”那“dtheta_relu1”)全连接层(300,“姓名”那“dtheta_fc2”)]; lgraph=添加层(lgraph,tempLayers);tempLayers=[imageInputLayer([1],“姓名”那“扭矩”那“正常化”那“没有任何”)全连接层(300,“姓名”那“扭矩_fc1”));lgraph = addLayers (lgraph tempLayers);templayer = [imageInputLayer([50 50 1],]),“姓名”那“pendImage”那“正常化”那“没有任何”)卷积2层([10],2,“姓名”那“img_conv1”那“填充”那“相同的”那“步”[5] 5) reluLayer (“姓名”那“relu_1”)全连接列(400,“姓名”那“critic_theta_fc1”)剥离(“姓名”那“theta_relu1”)全连接层(300,“姓名”那“critic_theta_fc2”)]; lgraph=添加层(lgraph,tempLayers);tempLayers=[additionLayer(3,“姓名”那“添加”)剥离(“姓名”那“relu_2”) fullyConnectedLayer (1,“姓名”那“状态值”));lgraph = addLayers (lgraph tempLayers);Lgraph = ConnectLayers(LAPHAGE,“扭矩_fc1”那“添加/ IN3”);Lgraph = ConnectLayers(LAPHAGE,“critic_theta_fc2”那“加法/ In1”);Lgraph = ConnectLayers(LAPHAGE,“dtheta_fc2”那“加法/ IN2”);
查看批评批评网络配置。
图形绘图(lgraph)
指定使用批评者的选项rlrepresentationOptions.
.
批评= rlrepresentationOptions('学习'1 e 03'gradientthreshold',1);
使用指定的深度神经网络创建批评家表示lgraph
和选择。您还必须指定从环境界面获取的批评者的操作和观察信息。有关更多信息,请参阅rlQValueRepresentation
.
评论家= rlqvaluerepresentation(第一个,obsinfo,Actinfo,...“观察”,{“pendImage”那'Angularrate'},“行动”,{“扭矩”},批评);
要创建DQN代理,首先使用rldqnagentoptions.
.
Agentopts = RLDQNAGENTOPTIONS(...'unmorblebledqn',错误的,...'targetupdatemethod'那“平滑”那...'targetsmoothfactor'1 e - 3,...'经验BufferLength',1e6,...'贴花因子',0.99,...“SampleTime”,env.ts,...“MiniBatchSize”, 64);agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1 e-5;
然后,使用指定的批评批准表示和代理选项创建DQN代理。有关更多信息,请参阅rldqnagent.
.
代理= rldqnagent(批评者,代理商);
要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
每次训练最多5000集,每集最多持续500步时间。
在“插曲管理器”对话框中显示培训进度(设置情节
选项)并禁用命令行显示(设置verb
选择错误的
)。
当代理在连续五集的默认窗口长度上收到大于–1000的平均累积奖励时,停止训练。此时,代理可以使用最小的控制努力快速平衡垂直位置的钟摆。
有关更多信息,请参阅rltringOptions.
.
训练= rltrainingOptions(...“MaxEpisodes”, 5000,...“MaxStepsPerEpisode”, 500,...“详细”,错误的,...'plots'那“训练进步”那...'stoptrinaincriteria'那“AverageReward”那...'stoptriningvalue', -1000);
在训练或模拟过程中,您可以使用阴谋
函数。
情节(env)
使用火车
函数。这是一个计算密集型的过程,需要几个小时才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理用圆形
来错误的
.训练代理人,套装用圆形
来真的
.
dotraining = false;如果用圆形培训代理商。trainingStats =火车(代理,env, trainOpts);别的%为示例加载预训练的代理。负载('matlabpendimagedqn.mat'那“代理”);结尾
要验证培训的代理的性能,请在摆内环境中模拟它。有关代理模拟的更多信息,请参阅模拟选项
和SIM
.
simOptions=rlSimulationOptions(“MaxSteps”,500);体验= SIM(ENV,Agent,SimOptions);
totalReward =总和(experience.Reward)
TotalReward = -888.9802.