tianshou基于pytorch的SACPolicy连续空间算法算法训练,输出训练模型pth,并利用writer.add_graph输出网络结构
时间: 2024-05-03 16:17:00 浏览: 183
基于pytorch实现的堆叠自编码神经网络,包含网络模型构造、训练、测试
好的,您可以按照以下步骤使用tianshou进行SACPolicy的训练,并且输出训练模型pth,并利用writer.add_graph输出网络结构。
1. 安装tianshou
您可以使用以下命令安装最新版本的tianshou:
```
pip install tianshou
```
2. 构建环境
您需要构建一个gym环境,然后将其传递给tianshou的环境包装器。以下是一个示例环境:
```python
import gym
import numpy as np
class MyEnv(gym.Env):
def __init__(self):
self.action_space = gym.spaces.Box(low=-1, high=1, shape=(1,))
self.observation_space = gym.spaces.Box(low=-1, high=1, shape=(1,))
self.state = np.zeros((1,))
def reset(self):
self.state = np.zeros((1,))
return self.state
def step(self, action):
action = np.clip(action, -1, 1)
reward = -np.abs(action)
self.state += action
done = False
return self.state, reward, done, {}
```
在这个环境中,我们使用一个连续的动作空间和一个连续的观测空间,每个步骤的奖励为动作的绝对值的负数。
3. 定义模型
使用tianshou的智能体API,我们可以定义我们的SACPolicy模型:
```python
import torch
import torch.nn.functional as F
from tianshou.policy import SACPolicy
class MyModel(torch.nn.Module):
def __init__(self, obs_shape, action_shape):
super().__init__()
self.obs_dim = obs_shape[0]
self.act_dim = action_shape[0]
self.fc1 = torch.nn.Linear(self.obs_dim, 64)
self.fc2 = torch.nn.Linear(64, 64)
self.mu_head = torch.nn.Linear(64, self.act_dim)
self.sigma_head = torch.nn.Linear(64, self.act_dim)
self.value_head = torch.nn.Linear(64, 1)
def forward(self, obs, state=None, info={}):
x = F.relu(self.fc1(obs))
x = F.relu(self.fc2(x))
mu = self.mu_head(x)
sigma = F.softplus(self.sigma_head(x))
value = self.value_head(x)
dist = torch.distributions.Normal(mu, sigma)
return dist, value
```
在这个模型中,我们使用两个完全连接的层来处理观察,并将输出分别传递到一个均值头和一个标准差头中。我们还添加了一个价值头来估计每个状态的价值。最后,我们将均值和标准差组合成一个正态分布,以便我们可以从中采样动作。
4. 训练模型
使用tianshou的训练API,我们可以定义我们的训练循环:
```python
import torch.optim as optim
from tianshou.trainer import offpolicy_trainer
from tianshou.data import Collector, ReplayBuffer
from torch.utils.tensorboard import SummaryWriter
env = MyEnv()
train_envs = gym.make('MyEnv-v0')
test_envs = gym.make('MyEnv-v0')
# 建立replay buffer
buffer = ReplayBuffer(size=10000, buffer_num=1)
# 建立collector
train_collector = Collector(policy, train_envs, buffer)
test_collector = Collector(policy, test_envs)
# 建立optimizer
optimizer = optim.Adam(policy.parameters(), lr=3e-4)
# 定义训练循环
result = offpolicy_trainer(
policy, train_collector, test_collector, optimizer,
max_epoch=100, step_per_epoch=1000, collect_per_step=1,
episode_per_test=10, batch_size=64, train_fn=None,
test_fn=None, stop_fn=None, writer=writer, verbose=True)
```
在这个循环中,我们首先创建一个回放缓冲区和一个collector,然后使用Adam优化器来优化我们的模型参数。我们使用offpolicy_trainer方法来训练我们的模型,其中我们设置了一些超参数,如最大epoch数、每个epoch的步数、每个步骤的收集数等。
5. 输出模型
训练完成后,我们可以将模型保存为一个.pth文件:
```python
torch.save(policy.state_dict(), 'model.pth')
```
6. 输出网络结构
最后,我们可以使用以下代码将网络结构写入TensorBoard:
```python
writer.add_graph(policy, torch.zeros((1, 1)))
```
在这个例子中,我们使用一个大小为1的观察空间,以便我们可以将模型传递给writer.add_graph方法。这将在TensorBoard中显示我们的网络结构。
阅读全文