pytorch - 如何使用 PyTorch DataLoader 进行强化学习?
问题描述
我正在尝试在 PyTorch 中建立一个通用的强化学习框架,以利用所有利用 PyTorch DataSet 和 DataLoader 的高级实用程序,如 Ignite 或 FastAI,但我遇到了一个具有动态性质的阻止程序强化学习数据:
- 数据项是从代码生成的,而不是从文件中读取的,它们依赖于先前的操作和模型结果,因此每个 nextItem 调用都需要访问模型状态。
- 训练集的长度不是固定的,所以我需要一个动态的批量大小以及一个动态的总数据集大小。我的偏好是使用终止条件函数而不是数字。我可以“可能”用填充来做到这一点,就像在 NLP 句子处理中一样,但这是一个真正的 hack。
到目前为止,我的 Google 和 StackOverflow 搜索都取得了成果。这里有人知道将 DataLoader 或 DataSet 与强化学习一起使用的现有解决方案或解决方法吗?我讨厌放弃对依赖于那些的所有现有库的访问。
解决方案
这是一个基于 PyTorch 的框架,这是来自 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
参数,在那里你可以生成不同长度的批次。由于网络不依赖于第一个维度,您也可以从那里返回您想要的任何批量大小。
顺便提一句。如果每个样本的长度不同,则应使用填充,不同的批量大小与此无关。
推荐阅读
- github - 本地构建 VuePress 站点并将其推送到 Github Pages
- ios - Google Maps iOS 使用平移或触摸手势绘制圆圈并在绘制的圆圈内显示标记
- angular - 错误 RangeError:超出最大调用堆栈大小(Angular 6)
- python - 线性回归后从突发数据中减去线性斜率
- iframe - 使用本地文件将 iframe 内容添加到父文档
- java - 错误:缺少 JavaFX 运行时组件,需要在 Eclipse 中运行此应用程序
- migration - 语言版本迁移中函数不匹配参数,以及如何知道函数的签名
- swift - NSCollectionView 使用文件承诺拖放
- c# - 使用默认字段创建模型
- c++ - 让 iaxclient 向缓冲区发送音频/从缓冲区而不是音频设备获取音频