如何让我的网络平等地对待输入的旋转?

人工智能 神经网络
2021-10-30 22:12:44

我正在尝试编写自己的系统来运行神经网络。为了减少所需的节点数量,建议让它平等地对待输入的旋转。

我的网络旨在通过查看网格中的每个正方形及其周围的正方形并给出该正方形的输出来学习和预测康威的生命游戏。它的输入是一个 9 位的字符串:

滑翔机

以上表示为 010 001 111。

然而,这种形状还有其他三个旋转,它们都产生相同的输出:

滑翔机旋转

我的网络拓扑是 9 个输入节点和 1 个输出节点,用于输入中中心正方形的下一个状态。如何构造隐藏层,以便它们将每个旋转视为相同,将可能输入的数量减少到原始输入的四分之一?

编辑:

每次旋转也会产生相同的结果。结合这些将使我的投入减少 1/8。对于滑翔机,我的目标是对所有这些输入进行完全相同的处理。这是否必须通过预处理来完成,或者我可以将其合并到网络中吗?

3个回答

如果我理解得很好,您的单个输出节点将是中间正方形的下一个状态。当您有足够的资源来训练模型时,您无需担心隐藏层中的节点数量。对于神经网络来说,这个问题很容易学习,所以没有大小问题。

您需要进行监督训练,这意味着您需要输入输入数据和匹配的预期输出。您需要确保在您的训练数据中,所有 4 个旋转都分配给相同的输出。这样,您的网络应该学会以同样的方式对待所有这些。

你让我很好奇,所以我自己试试。我的解决方案可以在几秒钟内在我的旧笔记本电脑上运行大约 20 个 epoch 来学习 100% 正确。我只是将输出稍微更改为 [0,1] 或 [1,0] 的分类,但这给出了您正在寻找的相同结果。仅供参考,这里是用python编写的代码:

from keras.models import Sequential
from keras.layers import Input, Dense
from keras.models import Model
from keras import optimizers
from keras.utils.np_utils import to_categorical
import helper

x_,y_ = helper.fnn_csv_toXY("conway.csv","output",False)
y_binary = to_categorical(y_)

model = Sequential()
model.add(Dense(100, activation='relu', kernel_initializer='glorot_uniform',input_shape =(9,)))
model.add(Dense(20, activation='relu', kernel_initializer='glorot_uniform'))
model.add(Dense(2, activation='softmax'))
adam=optimizers.Adam()
model.compile(optimizer=adam,
              loss='categorical_crossentropy',
              metrics=['acc'])
model.fit(x_, y_binary, epochs=100)

您已经确定了问题空间中的优化,并希望将其融入您的神经网络。我建议进行预处理:使用执行您想要的子集的神经网络来组合您的优化。

换句话说,通过手动编码一个旋转算法来规范您的输入,该算法旋转输入以捕获您的帖子中突出显示的等价。然后将此转换的输出提供给您的神经网络,用于训练和所有其他用途。这意味着您正在训练神经网络来解决您确定的子问题 - 旋转是多余的。

通过生成随机输入来测试你的规范化器,将其旋转到所有四个潜在的转换,在每个转换上运行规范化器,然后检查它们是否都是等价的。

更纯粹地说,首先考虑不同的输入,作为一个大小为 4 的圆形数组,每个项目包含一对位,另外还有一个中心位:

... 01、01、11、10 ...

0

在整个网络的设计中,继续这种循环结构和中心点范式。