在一个排列不变性的数据上神经网络是困难的。拼图游戏就是这种类型的数据,那么神经网络能解决一个2x2的拼图游戏吗?

什么是置换不变性(Permutation Invariance)?

如果一个函数的输出不通过改变其输入的顺序而改变,那么这个函数就是一个排列不变量。下面是一个例子。

1) f(x,y,z) = ax + by +cz
2) f(x,y,z) = xyz

如果我们改变输入的顺序,第一个函数的输出会改变,但是第二个函数的输出不会改变。第二个函数是置换不变量。

神经网络的权值映射到特定的输入单元。当输入改变时,输出也会改变。为了学习这种对称性,权值应该是这样的即使改变了输入,最终的输出也是不变的。而前馈网络是不容易学习的。

拼图游戏也是置换不变性。不管拼图的顺序是什么,输出总是固定的。下面是一个2x2的网格难题的例子,我们将在这个项目中尝试解决它。

解决一个3x3网格的难题是极其困难的。下面是这些谜题的可能组合。

2x2 puzzle = 4! = 24 combinations
3x3 puzzle = 9! = 362880 comb’ns

为了解决一个3x3的难题,网络必须从362880中预测出一个正确的组合。这也是为什么3x3拼图是一个难题的另一个原因。

让我们继续,尝试解决一个2x2的拼图游戏。

怎么得到这些数据的?

没有任何公共数据集可用于拼图游戏,所以我必须自己创建它。我创建的数据如下。

  1. 采集了大约26K动物图像的原始数据集。
  2. 裁剪所有图像到固定大小200x200。
  3. 将图像分割为训练、测试和验证集。
  4. 将图片切成4块,随机重新排列。
  5. 对于训练集,我重复了4次前面的步骤来增加数据。
  6. 最后,我们有92K个训练图像和2K个测试图像。我还分离出300张图像进行验证。
  7. 标签是一个整数数组,表示每个拼图块的正确位置。

这个数据集包含2x2和3x3的puzzle。你可以在这里找到它。

https://www.kaggle.com/shivajbd/jigsawpuzzle

数据是怎样的呢?

下面是一个2x2网格拼图的数据示例。输入是一个200x200像素的图像和标签是一个4个整数的数组,其中每个整数告诉每个片段的正确位置。

我们的目标是将这个图像输入到神经网络中,并得到一个输出,它是一个4个整数的向量,表示每一块的正确位置。

如何设计这个网络的?

在尝试了20多种神经网络架构和大量的尝试和错误之后,我得到了一个最优的设计。如下所示。

首先,从图像中提取每一块拼图(共4块)。

然后把每一个片段都传递给CNN。CNN提取有用的特征并输出一个特征向量。

我们使用Flatten layer将所有4个特征向量连接成一个。

然后我们通过前馈网络来传递这个组合向量。这个网络的最后一层给出了一个16单位长的向量。

我们将这个16单位向量重塑成4x4的矩阵。

为什么要做维度重塑?

在一个正常的分类任务中,神经网络会为每个类输出一个分数。我们通过应用softmax层将该分数转换为概率。概率值最高的类就是我们预测的类。这就是我们如何进行分类。

这里的情况不同。我们想把每一个片段都分类到正确的位置(0,1,2,3),这样的片段共有4个。所以我们需要4个向量(对于每个块)每个有4个分数(对于每个位置),这只是一个4x4矩阵。其中的行对应于要记分的块和列。最后,我们在这个输出矩阵行上应用一个softmax。

下面是网络图。

代码实现

我在这个项目中使用Keras框架。以下是Keras中实现的完整网络。这看起来相当简单。

model = keras.models.Sequential()model.add(td(ZeroPadding2D(2), input_shape=(4,100,100,3)))  # extra paddingmodel.add(td(Conv2D(50, kernel_size=(5,5), padding='same', activation='relu', strides=2))) # padding=same for more padding
model.add(td(BatchNormalization()))
model.add(td(MaxPooling2D()))                                                              # only one maxpool layerQmodel.add(td(Conv2D(100, kernel_size=(5,5), padding='same', activation='relu', strides=2)))
model.add(td(BatchNormalization()))
model.add(td(Dropout(0.3)))model.add(td(Conv2D(100, kernel_size=(3,3), padding='same', activation='relu', strides=2)))
model.add(td(BatchNormalization()))
model.add(td(Dropout(0.3)))model.add(td(Conv2D(200, kernel_size=(3,3), padding='same', activation='relu', strides=1)))
model.add(td(BatchNormalization()))
model.add(td(Dropout(0.3)))model.add(Flatten())  # combining all the featuresmodel.add(Dense(600, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(400, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(16))
model.add(Reshape((4, 4)))        # reshaping the final output
model.add(Activation('softmax'))  # softmax would be applied row wise

模型解释

输入形状是(4,100,100,3)。我将形状(100,100,3)的4个图像(拼图)输入到网络中。

我使用的是时间分布(TD)层。TD层在输入上多次应用给定的层。在这里,TD层将对4个输入图像应用相同的卷积层(行:5,9,13,17)。

为了使用TD层,我们必须在输入中增加一个维度,TD层在该维度上多次应用给定的层。这里我们增加了一个维度,即图像的数量。因此,我们得到了4幅图像的4个特征向量。

一旦CNN特征提取完成,我们将使用Flatten层(行:21)连接所有的特征。然后通过前馈网络传递矢量。重塑最终的输出为4x4矩阵,并应用softmax(第29,30行)。

CNN的架构

这个任务与普通的分类任务完全不同。在常规的分类中,任务网络更关注图像的中心区域。但在拼图游戏中,边缘信息比中心信息重要得多。

所以我的CNN架构与平常的CNN有以下几个不同之处。

填充

我在图像通过CNN之前使用了一些额外的填充(line: 3),并且在每次卷积操作之前填充feature map (padding = same),以保护尽可能多的边缘信息。

MaxPooling

代码中尽量避免了pooling层,只使用一个MaxPool层来减小feature map的大小(行:7). pooling使得网络平移不变性,这意味着即使你旋转或晃动图像中的对象,网络仍然会检测到它。这对任何对象分类任务都很有用。

对于拼图游戏一般不希望网络具有平移不变性。我们的网络应该对变化很敏感。因为我们的边缘信息是非常敏感的。

浅层网络

我们知道CNN的顶层提取了像边缘、角等特征。当我们深入更深的层倾向于提取特征,如形状,颜色分布,等等。这和我们的案例没有太大关系,所以只创建一个浅层网络。

这些都是您需要了解CNN架构的重要细节。网络的其余部分相当简单,有3个前馈层,一个重塑层,最后一个softmax层。

训练

最后,我使用sparse_categorical_crossentropy loss和adam optimizer编译我的模型。我们的目标是一个4单位向量,告诉我们每一块的正确位置。

Target Vector: [[3],[0],[1],[2]]

我把网络训练了5个轮次。我开始时的学习率是0.001批次大小是64。在每一个轮次之后,我都在降低学习速度,增加批处理规模。

结果

在预测时,我们的网络输出一个4x4的向量,然后我们选择每行中有最大值的索引,也就是预测的位置。因此我们得到一个长度为4的向量。使用这个向量,我们还可以重新排列拼图碎片并将它们可视化。

经过训练,我在2K个未见过的批图上运行了模型,模型能够正确解决80%的谜题。

下面是由网络解决的几个样本。

作者:Shiva Verma

deephub翻译组

本文代码 https://github.com/shivaverma/Jigsaw-Solver

用神经网络解决拼图游戏相关推荐

  1. c#拼图碎片形状_使用神经网络解决拼图游戏

    在一个排列不变性的数据上神经网络是困难的.拼图游戏就是这种类型的数据,那么神经网络能解决一个2x2的拼图游戏吗? 什么是置换不变性(Permutation Invariance)? 如果一个函数的输出 ...

  2. 拼图游戏和它的AI算法

    写了个拼图游戏,探讨一下相关的AI算法.拼图游戏的复原问题也叫做N数码问题. 拼图游戏 N数码问题 广度优先搜索 双向广度优先搜索 A*搜索 游戏设定 实现一个拼图游戏,使它具备以下功能: 1.自由选 ...

  3. 新个人项目-- 拼图游戏

    正式开博记录,想和很久但一直没有执行的新个人项目-- 拼图游戏. 完全由前端技术完成.从简单粗糙到复杂精细. 为了督促自己持续推进该项目,立博为证. 之后会陆续将文档.计划补充上来.都是非官方非正式的 ...

  4. 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc

    C语言拼图游戏实验报告 课程设计实验报告 班级:光电104-2 姓名:刘云龙 学号:201058501220 一.实验题目:使用C语言编写一个小游戏(拼图游戏) 二.实验目的:C语言是每一个通信学生的 ...

  5. 拼图游戏及其相关算法

    From: http://blog.sina.com.cn/s/blog_4ed8b87701011c6x.html   这个问题其实可以简单表述成,3*3的格子装了1至8,8个数字,数字是随机分布于 ...

  6. android 拼图课程设计,拼图游戏设计_课程设计报告.docx

    Il Il Il Il 学号 1608220203 2016-2017学年 第一学期 <Windows程序设计> 课程设计报告 题目:拼图游戏设计 专业: 班级: 姓名: 指导教师: 成绩 ...

  7. 如果去掉数学前后的空格_数学家们是怎么玩趣味拼图游戏的?

    不变量理论是数学家在研究过程中很常用的一个分析手段.在实际问题中确定和寻找不变量以及可能的使用方法可以被看做为一门艺术,下面我们就从几个小小的趣味问题入手,带大家看看不变量的巨大作用. 数学史的渊源很 ...

  8. html5制作拼图游戏教程,用HTML5制作视频拼图的教程

    几天前同事给我看了一个特效,是一个拼图游戏,不同的是,拼图里的是动画.他让我看下做个DEMO,于是就自己整了一会,也确实不难.用canvas很容易做.所以这篇博文不适合高手看....就是随便写来玩玩的 ...

  9. 自动拼图android github,GitHub - zero0011/Puzzle: 拼图游戏 , 可自动实现 拼图操作

    拼图游戏 启动 前端 npm i npm run dev 后端 cd server npm i nodemon app.js 实现功能有 普通的拼图功能 自动拼图功能(难点) 游戏聊天室的设计 效果大 ...

最新文章

  1. 【2016-05-19】一次tomcat频繁挂掉的问题定位
  2. jquery可见性选择器(匹配匹配所有显示的元素)
  3. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)
  4. shell编程基本语法
  5. cacti监控java,Cacti for Oracle监控
  6. 学习数字电路必须知道的几种编码
  7. 【转载】最短路径之Dijkstra算法详细讲解
  8. 复杂性思维中文第二版 六、生命游戏
  9. lastLogon和lastLogonTimestamp的区别
  10. uni-app 跨端开发注意事项
  11. 【密码学 | CTF】培根密码
  12. 计算机word文档工作区名称,word文档界面名称 word文档的界面组成
  13. blast2go进行Nr注释
  14. Matlab读取shape文件并统计均值
  15. Origin绘图 默认字体设置
  16. Jackson ImmunoResearch普通羊驼血清说明书
  17. 项目管理需要建立团队文化
  18. 华北地区博友链接集合(陆续增加中)
  19. CheckBox选中状态改变
  20. 详解两类AI芯片架构和关键技术

热门文章

  1. FCFS算法java实现
  2. 原型图工具Axure RP 8/Axure RP 9 免登录最新版授权码(博主亲测有效)
  3. 无限试用30天phpstorm
  4. 前端歌谣的刷题之路-第一百二十六题-浮动
  5. Python:短网址
  6. 如何在不清空原有配置的情况下恢复路由器密码?巨强!
  7. java 一年有多少周_java中如何计算一年总共有多少周
  8. 杰理之修改提高摄像头源视频输出帧率,确定摄像头源输出高帧率【篇】
  9. 师者,传道授业解惑也
  10. Android入门--实现选择并编辑图片设置成头像