【发布时间】:2019-12-11 09:32:07
【问题描述】:
一点背景
我正在编写一个卷积神经网络(用 c++ 编写)来在 4 x 4 网格上玩井字游戏。我想通过使用井字棋板继承旋转和二面体对称这一事实来优化它。我的意思是,如果您可以为给定的棋盘找到一个最佳移动,即使您旋转或镜像棋盘,它也会保持不变。所以我正在寻找的是一个删除矩阵的任何镜像或旋转的功能,因此网络会将所有旋转和/或镜像的板视为相同并以相同的方式响应它们。换句话说,对于任何矩阵 M,让它的旋转和/或镜像版本为 M',该函数将为所有 M' 返回 M。
This article 讨论了网络架构中的旋转和二面体对称实现,但我认为在我的情况下,输入比图像小很多,实现起来会更容易(并且会保持网络更小) ) 只需转换输入。我没有确凿的证据表明这会提高我的网络性能,但我渴望对其进行测试。
我的方法
我的棋盘只包含零、一和二。零是空白,一代表友方单位,二代表你对手的单位。我一直在考虑下一张图片所示的以下方法(绿色:友好,红色:对手):
- 计算敌方单位的平均位置和友方单位的平均位置
- 确保从敌方平均值到友方平均值的顺时针角度(以中心为第三点)低于 180 度。如果不是,请镜像董事会
- 旋转棋盘,直到友好的平均值指向左侧或棋盘的左上四分之一
然后当然会在需要时处理特殊情况(例如平均值位于中心时)。
现在这种方法似乎可行,但我怀疑这是最好的方法。我想知道是否已经有用于此目的的函数使用矩阵数学,或者我是否错过了有用的数学快捷方式或类似的东西。这是一个非常关键的优化部分,因为此操作将在每个网络移动之前完成,在我的训练计划中,这意味着每秒数千次。
【问题讨论】:
标签: algorithm matrix optimization conv-neural-network linear-algebra