【问题标题】:Defining a function to make symmetric matrices equal定义一个使对称矩阵相等的函数
【发布时间】:2019-12-11 09:32:07
【问题描述】:

一点背景

我正在编写一个卷积神经网络(用 c++ 编写)来在 4 x 4 网格上玩井字游戏。我想通过使用井字棋板继承旋转和二面体对称这一事实来优化它。我的意思是,如果您可以为给定的棋盘找到一个最佳移动,即使您旋转或镜像棋盘,它也会保持不变。所以我正在寻找的是一个删除矩阵的任何镜像或旋转的功能,因此网络会将所有旋转和/或镜像的板视为相同并以相同的方式响应它们。换句话说,对于任何矩阵 M,让它的旋转和/或镜像版本为 M',该函数将为所有 M' 返回 M。

This article 讨论了网络架构中的旋转和二面体对称实现,但我认为在我的情况下,输入比图像小很多,实现起来会更容易(并且会保持网络更小) ) 只需转换输入。我没有确凿的证据表明这会提高我的网络性能,但我渴望对其进行测试。


我的方法

我的棋盘只包含零、一和二。零是空白,一代表友方单位,二代表你对手的单位。我一直在考虑下一张图片所示的以下方法(绿色:友好,红色:对手):

  1. 计算敌方单位的平均位置和友方单位的平均位置
  2. 确保从敌方平均值到友方平均值的顺时针角度(以中心为第三点)低于 180 度。如果不是,请镜像董事会
  3. 旋转棋盘,直到友好的平均值指向左侧或棋盘的左上四分之一

然后当然会在需要时处理特殊情况(例如平均值位于中心时)。

现在这种方法似乎可行,但我怀疑这是最好的方法。我想知道是否已经有用于此目的的函数使用矩阵数学,或者我是否错过了有用的数学快捷方式或类似的东西。这是一个非常关键的优化部分,因为此操作将在每个网络移动之前完成,在我的训练计划中,这意味着每秒数千次。

【问题讨论】:

    标签: algorithm matrix optimization conv-neural-network linear-algebra


    【解决方案1】:

    这个问题的一个巧妙的解决方案是在所有板上定义一个total ordering,然后给一个板,将其“规范”表示定义为它的 8 个对称版本中的任何一个在该排序中是“最低”的。没有其他要求;任何总排序都可以。

    定义总顺序的一种简单方法是通过到整数的映射来归纳。由于有 16 个单元,每个单元具有三种状态之一(红色、绿色或空),我们可以将板状态映射到无符号 32 位整数,其中每个单元由两位表示:10 表示红色, 01 表示绿色,00 表示空白,这恰好是您已经用于板中单元格的数字表示。

    你的例子:

    • 01 10 00 00 10 01 00 00 01 00 00 00 00 01 00 00 是原版。
    • 00 01 10 01 01 00 01 10 00 00 00 00 00 00 00 00 是顺时针旋转 90 度。
    • 00 00 01 00 00 00 00 01 00 00 01 10 00 00 10 01 是 180 度旋转。
    • 00 00 00 00 00 00 00 00 10 01 00 01 01 10 01 00 是逆时针旋转 90 度。
    • 00 00 10 01 00 00 01 10 00 00 00 01 00 00 01 00 是水平镜像。
    • 00 01 00 00 01 00 00 00 10 01 00 00 01 10 00 00 是垂直镜像。
    • 01 10 01 00 10 01 00 01 00 00 00 00 00 00 00 00 为东南对角镜像。
    • 00 00 00 00 00 00 00 00 01 00 01 10 00 01 10 01 为西南斜镜像。

    这八个中最小的数字是最后一个,因此该板的“规范”版本是西南对角线镜像:

    【讨论】:

    • 有趣。一个可能的问题是它赋予红色玩家更多的权重,而赋予特定位置更多的权重。如果左上角有一个红色的棋子,而在对角附近有两个绿色的棋子,会发生什么?
    • 我不明白为什么会有问题。该函数的唯一要求是为该矩阵的所有转换返回相同的矩阵。函数对绿色和红色的权重如何无关紧要,只要它对每个变换都采用相同的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多