Tensorflow笔记——channel shuffle的实现

Tensorflow笔记——channel shuffle的实现

 

Channel shuffle:

因为groupconvolution会导致channel具有局部性,这样对模型的泛化能力有点弱,影响模型的准确率,因此加入channel shuffle,对groupconvolotion的卷积结果进行channel的shuffle,将输出的channel进行重新分组.

具体演示如下:

假设输入的feature maps有9个channels,groups = 3,分成三组:

@ @ @ # # #

 

第一步进行reshape:

@ @ @
# # #
$ $ $

 

第二步对得到的矩阵进行矩阵转置操作:

@ #
@ #
@ #

 

最后再一次进行reshape操作:

@ # @ # @ #

 

完成channel shuffle!

下面是tensorflow的实现代码:输入的X是tensor, groups是你要进行的分组数(上面的演示为3)

函数注释:

x.get_shape().as_list() # get_shape()得到的是tensor的大小,返回的是一个元祖,as_list()则将元祖变为list

tf.shape()返回的是一个tensor。要想知道是多少,必须通过sess.run()

tf.convert_to_tensor # 将python的数据类型转换成TensorFlow可用的tensor数据类型,可以是tensor,numpy arrays(numpy 的数组),python list(python 列表)

 

def shuffle_unit(self,x, groups):
    with tf.variable_scope('shuffle_unit'):
        n, h, w, c = x.get_shape().as_list()
        x = tf.reshape(x, shape=tf.convert_to_tensor([tf.shape(x)[0], h, w, groups, c // groups]))
        x = tf.transpose(x, tf.convert_to_tensor([0, 1, 2, 4, 3]))
        x = tf.reshape(x, shape=tf.convert_to_tensor([tf.shape(x)[0], h, w, c]))
    return x

你可能感兴趣的:(Tensorflow笔记)