深度学习-图像分类任务

深度学习

任务抽象

数据集:D={x1, x2,…,xm},d个属性 xi=(xi1,xi2,xi3,…,xid)ϵχ(输入空间)ϵ样本空间Ð
训练集:{(x1,y1), (x2,y2),…(xm,ym)},yiϵγ(标记空间、输出空间)
学习/训练  f: χ→γ,对于二分任务γ={0,1},对于多分类|γ|>2,对于回归任务γ=R。
监督学习:分类与回归;无监督学习:聚类。
泛化能力、独立同分布。

天下没有免费午餐

在这里插入图片描述
在这里插入图片描述

DL

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

基于TensorFlow图像数据的深度网络标注、建模与训练

卷积网络

在这里插入图片描述

传统的神经网络使用矩阵乘法来建立输入与输出的连接关系。其中,参数矩阵中每一个单独的参数都描述了一个输入单元与一个输出单元间的交互。这意味着每一个输出单元与每一个输入单元都产生交互。然而,卷积网络具有稀疏交互(sparse interactions)(也叫做稀疏连接(sparse connectivity)或者稀疏权重(sparse weights))的特征。这是使核的大小远小于输入的大小来达到的。举个例子,当处理一张图像时,输入的图像可能包含成千上万个像素点,但是我们可以通过只占用几十到上百个像素点的核来检测一些小的有意义的特征,例如图像的边缘。这意味着我们需要存储的参数更少,不仅减少了模型的存储需求,而且提高了它的统计效率。这也意味着为了得到输出我们只需要更少的计算量。这些效率上的提高往往是很显著的。如果有m个输入和n个输出,那么矩阵乘法需要mn个参数并且相应算法的时间复杂度为O(mn)(对于每一个例子)。如果我们限制每一个输出拥有的连接数为k,那么稀疏的连接方法只需要kn个参数以及O(kn)的运行时间。在很多实际应用中,只需保持k比m小几个数量级,就能在机器学习的任务中取得好的表现。

边缘检测

在这里插入图片描述

边缘检测的效率。右边的图像是通过先获得原始图像中的每个像素,然后减去左边相邻像素的值而形成的。这个操作给出了输入图像中所有垂直方向上的边缘的强度,对目标检测来说是有用的。两个图像的高度均为280个像素。输入图像的宽度为320个像素,而输出图像的宽度为319个像素。这个变换可以通过包含两个元素的卷积核来描述,使用卷积需要3192803 = 267;960次浮点运算(每个输出像素需要两次乘法和一次加法)。为了用矩阵乘法描述相同的变换,需要一个包含320280319280个或者说超过80亿个元素的矩阵,这使得卷积对于表示这种变换更有效40亿倍。直接运行矩阵乘法的算法将执行超过160亿次浮点运算,这使得卷积在计算上大约有60,000倍的效率。当然,矩阵的大多数元素将为零。如果我们只存储矩阵的非零元,则矩阵乘法和卷积都需要相同数量的浮点运算来计算。矩阵仍然需要包含2319280 = 178;640个元素。将小的局部区域上的相同线性变换应用到整个输入上,卷积是描述这种变换的极其有效的方法。

池化

在这里插入图片描述

池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如,最大池化(max pooling)函数(Zhou and Chellappa,1988)给出相邻矩形区域内的最大值。其他常用的池化函数包括相邻矩形区域内的平均值、L2范数以及基于据中心像素距离的加权平均函数。
不管采用什么样的池化函数,当输入作出少量平移时,池化能够帮助输入的表示近似不变(invariant)。对于平移的不变性是指当我们对输入进行少量平移时,经过池化函数后的大多数输出并不会发生改变。图9.8用了一个例子来说明这是如何实现的。局部平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。例如,当判定一张图像中是否包含人脸时,我们并不需要知道眼睛的精确像素位置,我们只需要知道有一只眼睛在脸的左边,有一只在右边就行了。但在一些其他领域,保存特征的具体位置却很重要。例如当我们想要寻找一个由两条边相交而成的拐角时,我们就需要很好地保存边的位置来判定它们是否相交。

可视化

在这里插入图片描述

其他

seed

在tensorflow中,很多函数中都会有seed参数,意为"种子"。这里seed实际上代表着随机数的序号。该序号与每个随机数相对应,相当于随机数固定存放在数组中,而seed参数则相当于随机数在数组中的下标索引。如果设置了seed的值,则每次执行程序所产生的随机数或者随机序列均相等,即都为同一个随机数或者随机序列。原因是,每次执行程序都会产生同一个位置处(seed的值)的随机数或者随机序列。如果没有设置seed参数的取值,那么每次执行程序所产生的随机数或者随机序列均不等。

Flatten层

Flatten层用来将输入"压平",即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。
从vgg16网络中可以看出,但是在后来的网络中用GlobalAveragePooling2D代替了flatten层,可以从vgg16与inceptionV3网络对比看出。从参数的对比可以看出,显然这种改进大大的减少了参数的使用量,避免了过拟合现象。

Dense

Dense即全连接层

ReLU

在这里插入图片描述

conv2d中padding=same规则介绍

padding属性的意义是定义元素边框和元素内容之间的空间。

在tf.nn.conv2d函数中,当变量padding为VALID和SAME,函数具体是怎么计算的呢?其实是有公式的。为了方便演示,先定义几个变量:

输入的尺寸高和宽定义成:in_height,in_width
卷积核的高和宽定义成filter_height、filter_width
输入的尺寸中高和宽定义成output_height、out_width
步长的高宽方向定义成strides_height、strides_width.
一 VALID情况:边缘不填充

输入宽和高的公式分别为:

output_width=(in_width-filter_width+1)/strides_width #(结果向上取整)
output_height=(in_height-filter_height+1)/strides_height #(结果向上取整)
二 SAME情况:边缘填充
# 输出的宽和高将与卷积核没关系,具体公式如下:
output_width=in_width/strides_width #(结果向上取整)
 
output_height=in_height/strides_height #(结果向上取整)
 
# 这里有一个很重要的知识点——补零的规则,见如下公式:
pad_height=max((out_height-1)*strides_height+filter_height-in_height,0)
 
pad_width=max((out_width-1)*strides_width+filter_width-in_width,0)
 
pad_top=pad_height/2
 
pad_bottom=pad_height-pad_top
 
pad_left=pad_width/2
 
pad_right=pad_width-pad_left


上面公式中
pad_height:代表高度方向上要填充0的行数。
pad_width:代表宽度方向要填充0的列数。
pad_top、pad_bottom、pad_left、pad_right分别代表上、下、左、右这4个方向填充0的行、列数。
*填充为偶数时,左右和上下对称填充,奇数时优先填充右侧和下侧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值