强化算法的pythonic实现,使用起来很有趣

torchreinforce的Python项目详细描述


torchreinforce

强化算法的pythonic实现,使用起来非常有趣

安装

您可以像安装任何其他python包一样使用pip安装它

pip install torchreinforce

快速启动

为了在模型中使用增强算法,您只需要做两件事:

  • 使用ReinforceModule类作为基类
  • @ReinforceModule.forward
  • 装饰您的forward函数

就这样

classModel(ReinforceModule):def__init__(self,**kwargs):super(Model,self).__init__(**kwargs)self.net=torch.nn.Sequential(torch.nn.Linear(20,128),torch.nn.ReLU(),torch.nn.Linear(128,2),torch.nn.Softmax(dim=-1),)@ReinforceModule.forwarddefforward(self,x):returnself.net(x)

您的模型现在将输出ReinforceOutput对象。

此对象有两个重要功能

  • get()
  • reward(value)

您可以使用output.get()获取覆盖分布的实际示例,并使用output.reward(value)设置特定输出的奖励。

作为net您的模型,您必须做类似的事情

action=net(observation)observation,reward,done,info=env.step(action.get())action.reward(reward)

等等,你刚才说的是配送吗?

是的!当强化算法声明模型的输出将用作概率分布函数的参数时。

实际上,您可以使用您想要的任何概率分布,ReinforceModule构造函数确实接受以下参数:

  • gamma强化算法的gamma参数(默认值:Categorical
  • distributionReinforceDistributionpytorch.distributions分布(默认值:0.99)

像那样

net=Model(distribution=torch.distributions.Beta,gamma=0.99)

请记住,修饰的forward(x)输出的输出将用作distribution的参数。如果distribution需要多个参数,只需返回一个列表。

我为发行版增加了在testing中有deterministic行为的可能性,并且我只为Categorical发行版实现了它,如果您想实现自己的确定性逻辑,请检查文件distributions/categorical.py,这非常简单

例如,如果您想使用torch.distributions.Beta发行版,则需要执行类似于

classModel(ReinforceModule):def__init__(self,**kwargs):super(Model,self).__init__(**kwargs)...@ReinforceModule.forwarddefforward(self,x):return[self.net1(x),self.net2(x)]# the Beta distribution accepts two parametersnet=Model(distribution=torch.distributions.Beta,gamma=0.99)action=net(inp)env.step(action.get())

很好!训练怎么样?

您可以通过调用ReinforceModuleloss()函数来计算加固损失,而不是像对待任何其他pytorch损失函数那样对待它

net=...optmizer=...whiletraining:net.reset()forsteps:....loss=net.loss(normalize=True)optimizer.zero_grad()loss.backward()optmizer.step()

必须在每集开始前ReinforceModule调用reset()函数。如果要规范化奖励,还可以将参数normalize传递给loss()

组合在一起

完整的示例如下:

classModel(ReinforceModule):def__init__(self,**kwargs):super(Model,self).__init__(**kwargs)self.net=torch.nn.Sequential(torch.nn.Linear(4,128),torch.nn.ReLU(),torch.nn.Linear(128,2),torch.nn.Softmax(dim=-1),)@ReinforceModule.forwarddefforward(self,x):returnself.net(x)env=gym.make('CartPole-v0')net=Model()optimizer=torch.optim.Adam(net.parameters(),lr=0.001)foriinrange(EPISODES):done=Falsenet.reset()observation=env.reset()whilenotdone:action=net(torch.tensor(observation,dtype=torch.float32))observation,reward,done,info=env.step(action.get())action.reward(reward)loss=net.loss(normalize=False)optimizer.zero_grad()loss.backward()optimizer.step()

您可以在examples/文件夹中找到一个正在运行的示例。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java testNG优先级和依赖性   java JPQL:以下WHERE子句使用继承时出现问题   java是否可以在JTable渲染器中进行查询?   java如何在javascript中向url添加变量并使用@PathVariable获取   在外部jframe中显示java控制台   java I无法连接到IBM MQ的QM错误2035 MQRC\u未授权   apache zookeeper如何解决Storm应用程序在本地集群中运行时出现的错误“java.net.ConnectException:连接被拒绝:connect”?   读取第一行的java文本文件具有键和第二行前进值   java在哪个线程池中affinityRun提交任务?如何配置线程数?   Java拆分字符串正则表达式:前导空格   如何在Java中读取Pop3服务器中的入站电子邮件   带/不带布局管理器的swing Java定位GUI组件   在Spring Webflux中使用域设置java多会话ID   http Java web将其内容刮除,但只刮除正文样式,然后不退出并永远运行   java图形绘制组件和循环故障