TensofFlow学习记录:全局均值池化

全局均值池化就是在平均池化层中使用同等大小的过滤器将其特征保存下来。这种结构用来代替深层网络结构最后的全连接输出层。这个方法也是《Network In Network》论文中所论述的。以下为《Network In Network》论文中关于全局均值池化的翻译,原文请点击这里传统卷积神经网络在网络的较低层执行卷积。对于分类任务,最后一个卷积层得到的特征图被向量化然后送入全连接层,接一个softm...
摘要由CSDN通过智能技术生成
全局均值池化就是在平均池化层中使用同等大小的过滤器将其特征保存下来。这种结构用来代替深层网络结构最后的全连接输出层。这个方法也是《Network In Network》论文中所论述的。

以下为《Network In Network》论文中关于全局均值池化的翻译,原文请点击这里

传统卷积神经网络在网络的较低层执行卷积。对于分类任务,最后一个卷积层得到的特征图被向量化然后送入全连接层,接一个softmax逻辑回归层。这种结构将卷积结构与传统神经网络分类器连接起来,卷积层作为特征提取器,得到的特征用传统方式进行分类。
但是,全连接层容易过拟合,从而阻碍了整个网络的泛化能力。后来dropout被Hinton等人提出,用于正则化,在训练过程中随机地将全连接层的一半激活值置零,改善了它的泛化能力并且很大程度地预防了过拟合。
在本文中,我们提出了另一个策略,叫做全局平均池化层,用它来替代CNN中的全连接层。想法是在最后一个mlpconv层生成一个分类任务中相应类别的特征图。我们没有在特征图最顶端增加全连接层,而是求每个特征图的平均值,得到的结果向量直接输入softmax层。

(论文原话:The idea is to generate one feature map for each correspondingcategory of the classification task in the last mlpconv layer. Instead of adding fully connected layerson top of the feature maps, we take the average of each feature map, and the resulting vector is feddirectly into the softmax layer.)。

GAP(Global Average Pooling)相比全连接层的优点在于通过增强特征图与类别间的对应关系使卷积结构保留的更好,使特征图分类是可信的得到很好的解释;另一个优点是GAP层中没有参数设置,因此避免了过拟合;此外,GAP汇聚了空间信息,所以对输入的空间转换更鲁棒。

我们可以看到GAP作为一个正则化器,加强了特征图与概念(类别)的可信度的联系。这是通过mlpconv层实现的,因为他们比GLM更好逼近置信图(conficence maps)。
在《Network In Network》论文中作者利用其进行了1000物体分类问题,最后设计了一个4层的MLPConv+全局均值池化网络,如下图所示:

在这里插入图片描述

这里解释以下最后一个MLPConv层,它接受来自上一层输出的特征图,规格为13*13*384,在本MLPConv层中的卷积核规格为3*3*1024*1000,3代表卷积核的宽度和高度,1024表示卷积核的通道数,1000代表卷积核的数量,经过MLPConv层后得到的特征图规格为6*6*1000,表示有1000个特征图,每个特征图的维度为6*6,最后将这1000个特征图每个计算平局值,得到1000个数字,将这1000个数字送进Softmax函数。

实测:建立一个带有全局平均池化层的卷积神网络

建立一个用全局平均池化层取代全连接层的卷积神网络,该神经网络有3个卷积层,每个卷积层内卷积核的大小均为5*5,步长均为1,除了最后一个卷积层外,前面两个卷积层的后面都接一个池化层,每个池化层的核大小均为2*2,步长均为2。最后一个卷积层过后得到一个通道数为10的输出,将这个输出输入到全局平均池化层中,得到10个数字,再对这10个数字送进Softmax函数,其结果代表最终分类。

先编写Cifar10_data.py文件,用来预处理和读取图片

导入相关库和定义一些需要用到的变量

import os
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import numpy as np
import time
import math

num_classes = 10 #一共有10个类别

num_examples_pre_epoch_for_train = 50000 #50000个样本用于训练
num_examples_pre_epoch_for_eval = 10000  #10000个样本用于测试

max_steps = 4000    #训练4000步
batch_size = 100    #每次训练100个样本
num_examples_for_eval = 10000
data_dir = "C:/Users/Administrator/Desktop/Tensorflow/cifar-10-batches-bin"  #下载的样本的路径


class CIFAR10Record(object):    #定义一个空类,用于返回读取的Cifar-10数据
    pass

接着定义一个read_cifar10()函数用于读取文件队列中的数据

def read_cifar10(file_queue):    #file_queue为图片路径
    result = CIFAR10Record()     #创建一个CIFAR10Record对象

    label_bytes = 1            #标签占一个字节
    result.height = 32         #图像高为32像素
    result.width = 32          #图像宽为32像素
    result.depth = 3           #因为是RGB三通道,所以深度为3

    image_bytes = result.height * result.width * result.depth  #结果为3072,即一幅图像的大小为3072字节
    record_bytes = label_bytes + image_bytes                  #加上标签,即一个样本一共有3073字节

    reader = tf.FixedLengthRecordReader(record_bytes=record_bytes)  #使用FixedLengthRecordReader类创建一个用于读取固定长度字节数信息的对象(针对bin文件而言)
    result.key, value = reader.read(file_queue) #使用该类的read()方法读取指定路径下的文件
    #这里得到的value就是record_bytes长度的包含多个label数据和image数据的字符串
    record_bytes = tf.decode_raw(value, tf.uint8) 
    #decode_raw()可以将字符串解析成图像对应的像素数组
    #strided_slice(input,begin,end)用于对输入的input截取[begin,end)区间的数据
    result.label = tf.cast(tf.strided_slice(record_bytes, [0], [label_bytes])
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值