构建一个简单的卷积神经网络,使用构建一个简单的卷积神经网络,使用DRL框架框架tianshou匹配匹配DQN算法算法
在之前的文章中,我们做了如下工作:
如何设计一个类flappy-bird小游戏:【python实战】使用pygame写一个flappy-bird类小游戏 | 设计思路+项目结构+代码详解|新手向
DFS 算法是怎么回事,我是怎么应用于该小游戏的:【深度优先搜索】一个实例+两张动图彻底理解DFS|DFS与BFS的区别|用DFS自动控制我们的小游
戏
BFS 算法是怎么回事,我是怎么应用于该小游戏的:【广度优先搜索】一个实例+两张动图彻底理解BFS|思路+代码详解|用DFS自动控制我们的小游戏
强化学习为什么有用?其基本原理:无需公式或代码,用生活实例谈谈AI自动控制技术“强化学习”算法框架
本节开始,我们将讨论如何用深度强化学习实现小游戏的自动控制。
构造一个简单的卷积神经网络,实现构造一个简单的卷积神经网络,实现 DQN
本文涉及的 .py 文件有:
DQN_train/gym_warpper.py
DQN_train/dqn_train.py
requirements
tianshou
pytorch > 1.40
gym
openCV
封装交互环境封装交互环境
强化学习算法有效,很大程度上取决于奖励机制设计的是否合理。
事件事件 奖励奖励
动作后碰撞障碍物、墙壁 -1
动作后无事发生 0.1
动作后得分 1
封装代码在 gym_wrapper.py 中,使用类 AmazingBrickEnv 。
强化学习机制与神经网络的构建强化学习机制与神经网络的构建
我设计的机制为:
每 2 帧进行一次动作决策;
状态的描述变量为 2 帧的图像。
对于每帧的图像处理如下。
# 首先把图像转换成 RGB 矩阵
pygame.surfarray.array3d(pygame.display.get_surface())
# 使用 openCV 将 RGB 矩阵矩阵转换成 100*100 的灰度0-1矩阵
x_t = cv2.cvtColor(cv2.resize(obs, (100, 100)), cv2.COLOR_BGR2GRAY)
最后使用 np.stack() 将两帧数据合并,我们就得到了一个 2 通道的图像矩阵数据。
卷积神经网络的构建卷积神经网络的构建
class Net(nn.Module):
def __init__(self):
super().__init__()
# nn.Conv2d(通道数, 输出通道数, 卷积核大小, 步长)
self.conv1 = nn.Conv2d(2, 32, 8, 4, padding=1)
self.conv2 = nn.Conv2d(32, 64, 4, 2, padding=1)
self.conv3 = nn.Conv2d(64, 64, 3, 1, padding=1)
self.fc1 = nn.Linear(64, 64)
self.fc2 = nn.Linear(64, 3)
def forward(self, obs, state=None, info={}):
if not isinstance(obs, torch.Tensor):
obs = torch.tensor(obs, dtype=torch.float)
# turn NHWC to NCHW
obs = obs.permute(0, 3, 1, 2)
x = F.max_pool2d(F.relu(self.conv1(obs)), 2)
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = F.max_pool2d(F.relu(self.conv3(x)), 2)
x = x.view(-1, 64)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x, state
神经网络解构如上述代码。
评论0
最新资源