这里简要总结一下tensorflow实现卷积操作的几种写法,定义方式有很多。例如使用一个9x9的卷积核将一个三通道图像转换成64通道的feature,遇到过的有以下一些:
直接定义就写
这种写法简单粗暴,一边定义卷积核、偏置和卷及操作一边写,优点是操作灵活,但是代码量太大尤其是重复单元较多的时候,一个例子如下:
1 | weight = tf.get_variable('weight',[9,9,3,64], initializer=tf.truncated_normal_initializer(stddev=0.01))#定义权重 |
对卷积中的各部分做封装再写
不过上面这样实现卷积仍然过于复杂,如果每层都这么弄那么代码量会非常大,因此可以对权重定义等做封装,如下所示:
1 | def weight_variable(shape,name): #定义权重 |
这样每层都可以用三行代码就搞定了,相比于原来的六层代码少写了很多,当然借助tensorflow的slim库,代码量还可以减少的更多。
通过slim库再写
emsp; slim库对卷积的封装程度非常高的,导入slim库,一行就能搞定
1 | out = slim.conv2d(input,64,kernel_size=[9,9]) |
这个操作可以说是很简洁了,就连偏置和激活函数都省略了,当然灵活度也降低了很多,slim默认加上bias,激活函数默认使用relu,具体定义接口如下:
1 | def convolution(inputs, |
现在使用多了,还是偏向于使用slim,毕竟方便,当然以后还是要慢慢转pytorch,感觉调试更友好啊。