CNN高级进阶

1.卷积的过程:
使用tensorflow框架
参考网址:
https://blog.csdn.net/mao_xiao_feng/article/details/78004522#commentBox
具体程序
涉及到tf2.0版本和1.0版本的区别
调试程序遇到的问题解决:
参考网址:
https://blog.csdn.net/hubojing/article/details/103499450?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control
module ‘tensorflow’ has no attribute ‘XXX’
出错原因:在tensorflow2.0下使用了tensorflow1.x的API。
解决方法:讲
import tensorflow as tf
改为:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
即可成功

2.tensorflow中strides的参数具体解释:
参考网址:
https://blog.csdn.net/deeplearningfeng/article/details/78551071

conv1 = tf.nn.conv2d(input_tensor,conv1_weights,strides=[1,1,1,1],padding=‘SAME’)
这是一个常见的卷积操作,其中strides=【1,1,1,1】表示滑动步长为1,padding=‘SAME’表示填0操作
当我们要设置步长为2时,strides=【1,2,2,1】,很多同学可能不理解了,这四个参数分别代表了什么,查了官方函数说明一样不明不白,今天我来解释一下。

四个元素规定前后必须为1,中间两个数表示水平滑动和垂直滑动步长值
strides在官方定义中是一个一维具有四个元素的张量,其规定前后必须为1,这点大家就别纠结了,所以我们可以改的是中间两个数,中间两个数分别代表了水平滑动和垂直滑动步长值,于是就很好理解了。

在卷积核移动逐渐扫描整体图时候,因为步长的设置问题,可能导致剩下未扫描的空间不足以提供给卷积核的,大小扫描 比如有图大小为55,卷积核为22,步长为2,卷积核扫描了两次后,剩下一个元素,不够卷积核扫描了,这个时候就在后面补零,补完后满足卷积核的扫描,这种方式就是same。如果说把刚才不足以扫描的元素位置抛弃掉,就是valid方式。

2.tensorflow中padding
参考网址:
https://blog.csdn.net/qq_33251995/article/details/85071571?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control

当使用tensorflow创建卷积神经网络时,肯定要用到卷积层和池化层,tendorflow关于建立卷积层和池化层的API都有padding这个参数,如下所示:

  • tf.nn.conv2d(input,filter,strides,padding)

  • tf.nn.max_pool(input,ksize,strides,padding)

padding有两种可选值:‘VALID’和‘SAME’。

取值为‘VALID’时padding=0,并不会对输入(input)做填充;
取值为‘SAME’时padding>0,将会对输入(input)做填充,填充值都是0值。
(SAME表示在扫描的时候,如果遇到卷积核比剩下的元素要大时,这个时候需要补0进行最后一次的行扫描或者列扫描)
在这里插入图片描述

下面我将分别对卷积池化中padding取值为‘VALID’和‘SAME’的区别做详细的解释。
一、卷积 tf.nn.conv2d(input,filter,strides,padding)

在tf.nn.conv2d中,padding是在图片周围做填充。

padding='VALID’时不会对图片做填充;
在这里插入图片描述
使用VALID方式,feature map的尺寸为
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))=(5-3+1)/1 = 3

out_width = ceil(float(in_width - filter_width + 1) / float(strides[2])) = (5-3+1)/1 = 3

所以,feature map的尺寸为3*3

padding='SAME’时情况比较特殊

For the SAME padding, the output height and width are computed as:

out_height = ceil(float(in_height) / float(strides[1]))

out_width = ceil(float(in_width) / float(strides[2]))

注意!,这里还要分为两种情况:stride=1和stride>1
1.当且仅当stride=1时,padding='SAME’意味着卷积后的输出与输入size保持一致。例如input的size是5×5,kernel(filter)的size是3×3,令padding='SAME’时(此时padding=1,即在input周围填充了一圈0),output的size将会与input的size保持一致为5×5。
在这里插入图片描述
当我们使用tensorflow时,取padding='SAME’时,它自动为我们算出padding的值。既然是详解,那么我们来算一下取padding='SAME’时,padding的值应该取几?先说结论:假如kernel的size是k×k,那么padding=(k-1)/2。
解释:o=(i+2p-k+1)
o为output的size,i为input的size,k为kernal的size,p为padding的取值。以上图为例,i=5,padding=1,k=3,kernel还要向右移动4步加上开始总共生成5个像素(即output的第一行),o就等于5。(如果对卷积过程比较熟悉应该不难理解)
2.当stride>1时,还是直接上公式:
o=((i+2p-k)/s+1)

是不是发现s=1就是上面的公式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值