文档章节

以index访问Tensor元素+ 反池化 unpool TensorFlow代码

刘小米_思聪
 刘小米_思聪
发布于 2018/01/14 04:12
字数 1397
阅读 2415
收藏 0

转载必须著名出处和链接,否则追究法律责任

首先,来到本文的读者肯定跟我一样觉得Unpool操作非常重要,因为在Autoencoder 等需要用反向神经网络来实现invert反转来构建原始数据,例如我们可以用倒过来的卷机神经网络从特征generate出一些椅子的图片,而且生成的图片跟之前的图片一定使不同的。倒过来的神经网络架构图及应用例子如下图的例子,左边给出特征的描述找到对应的特征,最后生成椅子图片。就像是一个脑洞大开的你,输入照片描述:宋仲基聚光的小眼睛,雷佳音丧萌丧萌的眉毛,潘粤明呆萌乖巧的腿....,然后就能给你生成一批符合这些描述的照片。

目前Tensorflow对卷积的反向有现成的函数可以调用,解卷积tf.nn.conv2d_transpose大家可以自行查找。不幸的是unpool操作,也就是max-pool的反向操作并没有现成的函数,本文不仅将已有的方法做一下总结,并将代码放出来,供大家参考。在实现的时候,我翻了很多中英文的在线问答都没有解决方案,因为Tensor cannot be accessed by index,只有 numpy array才可以用index访问,而我们知道tensor 转 numpy array的唯一方式就是执行它,比如sess.run(Tensor),或者Tessor.eval(),因为Tensor实际上像个容器,没有内容,只有执行一下才有数据,而run Tensor的这件事在我们训练模型定义层结构的时候是不符合逻辑的,当你有好多层,需要定义一个反卷积层服务于整个网络的训练,你不可能单独为某一层拿到sess和feed_dic。大家也可以自己试试,欢迎留言讨论。据我们所知,本博文是首次给出Tensorflow unpool代码,希望对大家有帮助。

1. 文献中关于Unpool的两种方法

  • 方法1: we perform unappealing by simply replacing each entry map by an s*s block with the entry value in the top corner and zeros elsewhere. This increases the width and the height of the feature map s times. We used s=2 in our networks. 如果max-pool是将一个2*2的方格里最大值拿出,那么反向池化可以将该值赋给2*2的左上角元素,其它置为0.

                           

                                     

https://arxiv.org/pdf/1506.02351.pdf

2. 代码实现

2.1 如何实现 Access tensor by index   修改/读取 Tensor的某个元素

为了完成代码,第一个摆在我们面前的事实就是:tensor cannot be accessed by index。而我们必须要做的就是,Access tensor by index   修改/读取 Tensor中的某个元素,我们把这一节单独拿出来,是因为这个问题相信是很多其它需要通过index访问tensor的代码都会遇到的。

解决方案:既然不能用 tensor[1][2]来读取index为(1,2)的元素(这里tensor是一个创建的tensor对象的名字)那么我们可以借助其它方式巧妙的完成它,也就是拆分为两个步骤:指定index来读取tensor的值 (tf.expand_dims),为tensor 指定index的位置赋指定的值(使用tf.SparseTensor(indices, values, shape))这两个方法大家如果要用,自行百度/google很多通俗易懂的博文可以参考。

2.  最后,放上实现上述方法1 反池化的 代码


def unpool2(pool, ksize, stride, padding = 'VALID'):
    """
    simple unpool method

    :param pool : the tensor to run unpool operation
    :param ksize : integer
    :param stride : integer
    :return : the tensor after the unpool operation

    """
    pool = tf.transpose(pool, perm=[0,3,1,2])
    pool_shape = pool.shape.as_list()
    if padding == 'VALID':
        size = (pool_shape[2] - 1) * stride + ksize
    else:
        size = pool_shape[2] * stride
    unpool_shape = [pool_shape[0], pool_shape[1], size, size]
    unpool = tf.Variable(np.zeros(unpool_shape), dtype=tf.float32)
    for batch in range(pool_shape[0]):
        for channel in range(pool_shape[1]):
            for w in range(pool_shape[2]):
                for h in range(pool_shape[3]):
                    diff_matrix = tf.sparse_tensor_to_dense(tf.SparseTensor(indices=[[batch,channel,w*stride,h*stride]],values=tf.expand_dims(pool[batch][channel][w][h],axis=0),dense_shape = [pool_shape[0],pool_shape[1],size,size]))
                    unpool = unpool + diff_matrix

相信有了这个代码,方法2大家实现起来就很容易了。

但是这种方法非常慢,非常非常慢,所以实现反池化的过程,可以用下面的方法代替:

# PI is the 4-dimension Tensor from above layer
unpool1 = tf.image.resize_images(PI, size = [resize_width, resize_width], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)  

另外还有两种unpool的方法:

def max_unpool_2x2(x, output_shape):
    out = tf.concat_v2([x, tf.zeros_like(x)], 3)
    out = tf.concat_v2([out, tf.zeros_like(out)], 2)
    out_size = output_shape
    return tf.reshape(out, out_size)

# max unpool layer 改變輸出的 shape 為兩倍
# output_shape_d_pool2 = tf.pack([tf.shape(x)[0], 28, 28, 1])
# h_d_pool2 = max_unpool_2x2(h_d_conv2, output_shape_d_pool2)
def max_unpool_2x2(x, shape):
    inference = tf.image.resize_nearest_neighbor(x, tf.pack([shape[1]*2, shape[2]*2]))
    return inference

 

其他参考:

https://github.com/jon-sch/tensorflow/commit/16cd223508fa234cd4ae0f2fa4d63ee812d6cada

https://ithelp.ithome.com.tw/articles/10188326

 

© 著作权归作者所有

刘小米_思聪
粉丝 58
博文 60
码字总数 43955
作品 0
西安
其他
私信 提问
TensorFlow应用实战-5- TensorFlow基础知识

从helloworld开始 代码: TensorFlow的编程模式 命令式编程: 容易理解,命令语句基本没优化: C,java, C++, Python 符号式编程: 涉及较多的嵌入和优化,运行速度有同比提升 计算流图。c和d是可...

天涯明月笙
2018/04/10
0
0
一步步上手TensorFlow——基础知识

之前发过了几篇关于机器学习的帖子,使用的框架多为TensorFlow。 TensorFlow 是一个用于人工智能的开源神器。作为常用的机器学习框架,可被用于语音识别或图像识别等多项机器学习和深度学习领...

BlackBlog__
2018/05/14
0
0
tensorflow 一些概念

为什么 c = tf.matmul(a, b) 不立即执行矩阵相乘? 在 TensorFlow 的 Python API 中, a , b , and c 都是 Tensor 对象. 一个 Tensor 对象是一个操作(ope ration)结果的字符别名,它实际上并不...

阿豪boy
2017/07/30
99
0
如何将TensorFlow Serving的性能提高超过70%?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/88967608...

AI科技大本营
03/30
0
0
Tensorflow源码解析6 -- TensorFlow本地运行时

1 概述 TensorFlow后端分为四层,运行时层、计算层、通信层、设备层。运行时作为第一层,实现了session管理、graph管理等很多重要的逻辑,是十分关键的一层。根据任务分布的不同,运行时又分...

扬易
02/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部