1. 背景
接上次的报告
想要利用deep learning 去预测两个点之间最短路径上的前向或者说是parent or father(当然路径可能不止一条,前向肯定也不是唯一一个,这里后面再说)
因为在用一些求shortest path 算法时,都会利用保存当前点的前向最后得到路径, 或许每个点都训练一个模型,这样根据前向节点,可以把路径一步一步迭代出来。。。当然这是比较愚蠢的做法。。。不过前期先试一试
和导师交流了想法,决定先用grid这个比较规则的形状(就当做棋盘吧),因为每个点最多有四条边,上下左右或者东南西北bala。。。可以让他们代表四个通道类似与图像的RBG三个通道。这里我grid选400个点的,尺寸也就是20 × 20 × 4。
4个通道,我令 north 为第 0 个维度, 顺时针, east 为第 1 个维度, south 第 2 个, west 第 3 个,边存在的方向,值为 1 , 边不存在的方向,值为 inf
起点就选(0,0),你可以想象一下面前有一个棋盘,但是这个棋盘有的边是不存在的,但是所有点是全联通的,选取左上角为起点,现在要用BFS遍历这个棋盘,保存每个节点的距离和前向, 这样得到的路径就是一个从起点到每个其他点的最短路的树。
2. 实验
step1: 生成数据
随机生成 1 million grids(20*20*4),有边的值为1, 没有边的值为inf,BFS遍历得到前向节点,具体看代码
step2: 用CNN模型训练,4个卷积层,一个全连接层,lable用的是随机选取的终点,这里我选取第151个点,结果训练三个minibatch基本上accuracy就收敛了,然后一直波动。
先是用的400个分类标签,后来觉得应该四个标签就够了,虽然训练完得到的accuracy都差不多。
3. 总结
考虑到每个节点的前向一般只有四种可能(边界不算),grid密度大的情况下猜到的几率还是很大的,因此我又生成了两万个边密度0.7的数据,训练结果accuracy较0.8的降低了
4. 后续
和导师交流了一下,觉得应该用反卷积(deconvolution),这样可以输出一个channel(点标号从0~399) 20*20 ,或者两个channel(点用坐标表示)也是20×20,这里输出的是每个点的前向,这样可以得到一个最短树
accuracy的衡量可以用得到的最短树,计算出到某一点的距离,用之前生成数据里的距离作比较,因为路径可能不止一条,比距离显得更有意义一些。
PS:这里生成grid的边并不是无向的。。这里应该是无向的,在下次实验中会解决这个问题。
代码:
生成数据:
"""
2017-7-21
experiment 1
try to use CNN to predict the parents in SSSP
generate 1000000 20*20*4 grids(4 means each nodes maybe have 4 degree, 20 means the number of nodes
shape as below:
north
the start<-##########
##########
west##########east
##########
##########
south
Checking whether a grid is connected or not by BFS, and save the connected one along with parents in the single source shortest paths
"""
import numpy as np
import random
import Queue
np.set_printoptions(threshold=np.inf)
# not exist a edge
inf = 0x3fffffff
#set grid's size
N = 20
#[north, east, south, west] if exist a