如何使用 PyTorch DataLoader 进行强化学习?
Posted
技术标签:
【中文标题】如何使用 PyTorch DataLoader 进行强化学习?【英文标题】:How can I use a PyTorch DataLoader for Reinforcement Learning? 【发布时间】:2019-12-07 01:24:15 【问题描述】:我正在尝试在 PyTorch 中建立一个通用的强化学习框架,以利用所有利用 PyTorch DataSet 和 DataLoader 的高级实用程序,如 Ignite 或 FastAI,但我遇到了阻碍强化学习数据的动态特性:
数据项是从代码生成的,而不是从文件中读取的,它们依赖于之前的操作和模型结果,因此每个 nextItem 调用都需要访问模型状态。 训练集的长度不是固定的,因此我需要动态批量大小以及动态总数据集大小。我的偏好是使用终止条件函数而不是数字。我可以“可能”使用填充来做到这一点,就像在 NLP 句子处理中一样,但这是一个真正的 hack。到目前为止,我的 Google 和 *** 搜索都取得了不错的成绩。这里有人知道将 DataLoader 或 DataSet 与强化学习一起使用的现有解决方案或解决方法吗?我讨厌放弃对依赖于那些的所有现有库的访问。
【问题讨论】:
【参考方案1】:Here 是一个基于 PyTorch 的框架,here 来自 Facebook。
当涉及到您的问题(毫无疑问是崇高的追求)时:
您可以轻松地创建一个 torch.utils.data.Dataset
依赖于任何东西,包括模型,类似这样的东西(请原谅弱抽象,这只是为了证明一点):
import typing
import torch
from torch.utils.data import Dataset
class Environment(Dataset):
def __init__(self, initial_state, actor: torch.nn.Module, max_interactions: int):
self.current_state = initial_state
self.actor: torch.nn.Module = actor
self.max_interactions: int = max_interactions
# Just ignore the index
def __getitem__(self, _):
self.current_state = self.actor.update(self.current_state)
return self.current_state.get_data()
def __len__(self):
return self.max_interactions
假设,torch.nn.Module
-like 网络有某种update
改变环境状态。总而言之,它只是一个 Python 结构,所以你可以用它来建模很多东西。
您可以将max_interactions
指定为几乎是infinite
,或者如果需要,您可以在训练期间通过一些回调即时更改它(因为__len__
可能会在整个代码中被多次调用)。环境还可以提供batches
而不是样本。
torch.utils.data.DataLoader
有 batch_sampler
参数,在那里你可以生成不同长度的批次。由于网络不依赖于第一个维度,您也可以从那里返回任何您想要的批量大小。
顺便说一句。如果每个样本的长度不同,则应使用填充,不同的批次大小与此无关。
【讨论】:
谢谢,Szymon - 这是一个不错的方法。有点 hack,因为我们真的不知道如何或在哪里调用 len (它是否在 for 范围内?)但这可能是我们能做的最好的事情。但特别感谢 SLM 链接 - 这看起来真的很棒。我将花一些时间来确保我不会重新发明***。以上是关于如何使用 PyTorch DataLoader 进行强化学习?的主要内容,如果未能解决你的问题,请参考以下文章
Pytorch中如何使用DataLoader对数据集进行批训练
Pytorch中如何使用DataLoader对数据集进行批训练
PyTorch DataLoader 将批次作为列表返回,批次作为唯一条目。如何从我的 DataLoader 获取张量的最佳方式
__getitem__ 的 idx 如何在 PyTorch 的 DataLoader 中工作?