爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Caffe源码中Pooling Layer文件分析

      首页 知识中心 软件开发 文章详情页

      Caffe源码中Pooling Layer文件分析

      2024-09-24 06:31:22 阅读次数:155

      layer

      Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/vision_layers文件中PoolingLayer类,在最新版caffe中,PoolingLayer类被单独放在了include/caffe/layers/pooling_layer.hpp文件中,这两个文件中PoolingLayer类的内容及实现是完全一致的:

      1.  include文件:

      (1)、<caffe/blob.hpp>

      (2)、<caffe/layer.hpp>

      (3)、<caffe/proto/caffe.pb.h>

      2.  类PoolingLayer:池化层,Layer类的子类

      Pooling layer的主要作用是降维,缩小feature map,图像降采样,方法有:

      (1)、均值采样:取区域平均值作为降采样值;

      (2)、最大值采样:取区域最大值作为降采样值;

      (3)、随机采样:取区域内随机一个像素值。

      <caffe/layers/pooling_layer.hpp>文件的详细介绍如下:

       

      #ifndef CAFFE_POOLING_LAYER_HPP_
      #define CAFFE_POOLING_LAYER_HPP_
      
      #include <vector>
      
      #include "caffe/blob.hpp"
      #include "caffe/layer.hpp"
      #include "caffe/proto/caffe.pb.h"
      
      namespace caffe {
      /**
       * @brief Pools the input image by taking the max, average, etc. within regions.
       *
       * TODO(dox): thorough documentation for Forward, Backward, and proto params.
       */
      // 池化层,Layer类的子类,图像降采样,有三种Pooling方法:Max、Avx、Stochastic
      template <typename Dtype>
      class PoolingLayer : public Layer<Dtype> {
       public:
      // 显示构造函数
        explicit PoolingLayer(const LayerParameter& param) : Layer<Dtype>(param) {}
      // 参数初始化,通过类PoolingParameter获取成员变量值,包括:
      // global_pooling_、kernel_h_、kernel_w_、pad_h_、pad_w_、stride_h_、stride_w_
        virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top);
      // 调整top blobs的shape,并有可能会reshape rand_idx_或max_idx_;
      // 获取成员变量值,包括:channels_、height_、width_、pooled_height_、pooled_width_
        virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top);
      // 获得Pooling layer的类型: Pooling
        virtual inline const char* type() const { return "Pooling"; }
      // 获得Pooling layer所需的bottom blobs的个数: 1
        virtual inline int ExactNumBottomBlobs() const { return 1; }
      // 获得Pooling layer所需的bottom blobs的最少个数: 1
        virtual inline int MinTopBlobs() const { return 1; }
        // MAX POOL layers can output an extra top blob for the mask;
        // others can only output the pooled inputs.
      // 获得Pooling layer所需的bottom blobs的最多个数: Max为2,其它(Avg, Stochastic)为1
        virtual inline int MaxTopBlobs() const {
          return (this->layer_param_.pooling_param().pool() ==
                  PoolingParameter_PoolMethod_MAX) ? 2 : 1;
        }
      
       protected:
      // CPU实现Pooling layer的前向传播,仅有Max和Ave两种方法实现
        virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top);
      // GPU实现Pooling layer的前向传播,Max、Ave、Stochastic三种方法实现
        virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top);
      // CPU实现Pooling layer的反向传播,仅有Max和Ave两种方法实现
        virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
            const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
      // GPU实现Pooling layer的反向传播,Max、Ave、Stochastic三种方法实现
        virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
            const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
      
      // Caffe中类的成员变量名都带有后缀"_",这样就容易区分临时变量和类成员变量
        int kernel_h_, kernel_w_; // 滤波器(卷积核)大小
        int stride_h_, stride_w_; // 步长大小
        int pad_h_, pad_w_; // 图像扩充大小
        int channels_; // 图像通道数
        int height_, width_; // 图像高、宽
      // 池化后图像高、宽
      // pooled_height_ = (height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1
      // pooled_width_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_)) + 1
        int pooled_height_, pooled_width_;
        bool global_pooling_; // 是否全区域池化(将整幅图像降采样为1*1)
        Blob<Dtype> rand_idx_; // 随机采样索引,Pooling方法为STOCHASTIC时用到并会Reshape
        Blob<int> max_idx_; // 最大值采样索引,Pooling方法为MAX时用到并会Reshape
      };
      
      }  // namespace caffe
      
      #endif  // CAFFE_POOLING_LAYER_HPP_
      在caffe.proto文件中,有一个message是与pooling layer 相关的,如下:
      message PoolingParameter { // Pooling层参数类
        enum PoolMethod { // 枚举类型,Pooling的方法:Max(最大值采样)、AVE(均值采样)、STOCHASTIC(随机采样)
          MAX = 0;
          AVE = 1;
          STOCHASTIC = 2;
        }
        optional PoolMethod pool = 1 [default = MAX]; // The pooling method, pooling方法
        // Pad, kernel size, and stride are all given as a single value for equal
        // dimensions in height and width or as Y, X pairs.
        optional uint32 pad = 4 [default = 0]; // The padding size (equal in Y, X),图像扩充大小(添加图像边界的像素大小)
        optional uint32 pad_h = 9 [default = 0]; // The padding height,图像扩充大小,Y
        optional uint32 pad_w = 10 [default = 0]; // The padding width,图像扩充大小,X
        optional uint32 kernel_size = 2; // The kernel size (square),滤波器(卷积核、滑动窗)的大小(高=宽)
        optional uint32 kernel_h = 5; // The kernel height,滤波器(卷积核、滑动窗)的高
        optional uint32 kernel_w = 6; // The kernel width,滤波器(卷积核、滑动窗)的宽
        optional uint32 stride = 3 [default = 1]; // The stride (equal in Y, X),滑动步长(高=宽),卷积核卷积时平移的步幅
        optional uint32 stride_h = 7; // The stride height,滑动步长,高
        optional uint32 stride_w = 8; // The stride width,滑动步长,宽
        enum Engine {
          DEFAULT = 0;
          CAFFE = 1;
          CUDNN = 2;
        }
        optional Engine engine = 11 [default = DEFAULT]; //
        // If global_pooling then it will pool over the size of the bottom by doing
        // kernel_h = bottom->height and kernel_w = bottom->width
        optional bool global_pooling = 12 [default = false]; // 是否是全区域池化
      }
      pooling layer的测试代码如下:
      #include "funset.hpp"
      #include <string>
      #include <vector>
      #include "common.hpp"
      
      int test_caffe_layer_pooling()
      {
      	caffe::Caffe::set_mode(caffe::Caffe::CPU); // set run caffe mode
      
      	// set layer parameter
      	caffe::LayerParameter layer_param;
      	layer_param.set_phase(caffe::Phase::TRAIN);
      
      	// cv::Mat -> caffe::Blob
      	std::string image_name = "E:/GitCode/Caffe_Test/test_data/images/a.jpg";
      	cv::Mat mat1 = cv::imread(image_name, 1);
      	if (!mat1.data) {
      		fprintf(stderr, "read image fail: %s\n", image_name.c_str());
      		return -1;
      	}
      	mat1.convertTo(mat1, CV_32FC3);
      	std::vector<cv::Mat> mat2;
      	cv::split(mat1, mat2);
      	std::vector<int> mat_reshape{ 1, (int)mat2.size(), mat2[0].rows, mat2[0].cols };
      
      	caffe::Blob<float> blob;
      	blob.Reshape(mat_reshape);
      	size_t size = mat2[0].rows * mat2[0].cols;
      	float* data = new float[mat2.size() * size];
      	memcpy(data, mat2[0].data, size * sizeof(float));
      	memcpy(data + size, mat2[1].data, size * sizeof(float));
      	memcpy(data + 2 * size, mat2[2].data, size * sizeof(float));
      	blob.set_cpu_data(data);
      
      	for (int method = 0; method < 2; ++method) {
      		// set pooling parameter
      		caffe::PoolingParameter* pooling_param = layer_param.mutable_pooling_param();
      		if (method == 0) pooling_param->set_pool(caffe::PoolingParameter::MAX);
      		else pooling_param->set_pool(caffe::PoolingParameter::AVE);
      		pooling_param->set_kernel_size(3);
      		pooling_param->set_pad(2);
      		pooling_param->set_stride(2);
      		pooling_param->set_global_pooling(false);
      
      		std::vector<caffe::Blob<float>*> bottom_blob{ &blob }, top_blob{ &caffe::Blob<float>()/*, &caffe::Blob<float>() */ };
      
      		// test PoolingLayer function
      		caffe::PoolingLayer<float> pooling_layer(layer_param);
      		pooling_layer.SetUp(bottom_blob, top_blob);
      		fprintf(stderr, "top blob info: channels: %d, height: %d, width: %d\n",
      			top_blob[0]->channels(), top_blob[0]->height(), top_blob[0]->width());
      
      		pooling_layer.Forward(bottom_blob, top_blob);
      
      		int height = top_blob[0]->height();
      		int width = top_blob[0]->width();
      		const float* p = top_blob[0]->cpu_data();
      		std::vector<cv::Mat> mat3{ cv::Mat(height, width, CV_32FC1, (float*)p),
      			cv::Mat(height, width, CV_32FC1, (float*)(p + height * width)),
      			cv::Mat(height, width, CV_32FC1, (float*)(p + height * width * 2)) };
      		cv::Mat mat4;
      		cv::merge(mat3, mat4);
      		mat4.convertTo(mat4, CV_8UC3);
      		if (method == 0) image_name = "E:/GitCode/Caffe_Test/test_data/images/forward0.jpg";
      		else image_name = "E:/GitCode/Caffe_Test/test_data/images/forward1.jpg";
      		cv::imwrite(image_name, mat4);
      
      		for (int i = 0; i < bottom_blob[0]->count(); ++i)
      			bottom_blob[0]->mutable_cpu_diff()[i] = bottom_blob[0]->cpu_data()[i];
      		for (int i = 0; i < top_blob[0]->count(); ++i)
      			top_blob[0]->mutable_cpu_diff()[i] = top_blob[0]->cpu_data()[i];
      
      		std::vector<bool> propagate_down{ true };
      		pooling_layer.Backward(top_blob, propagate_down, bottom_blob);
      
      		height = bottom_blob[0]->height();
      		width = bottom_blob[0]->width();
      		p = bottom_blob[0]->cpu_diff();
      		std::vector<cv::Mat> mat5{ cv::Mat(height, width, CV_32FC1, (float*)p),
      			cv::Mat(height, width, CV_32FC1, (float*)(p + height * width)),
      			cv::Mat(height, width, CV_32FC1, (float*)(p + height * width * 2)) };
      		cv::Mat mat6;
      		cv::merge(mat5, mat6);
      		mat6.convertTo(mat6, CV_8UC3);
      		if (method == 0) image_name = "E:/GitCode/Caffe_Test/test_data/images/backward0.jpg";
      		else image_name = "E:/GitCode/Caffe_Test/test_data/images/backward1.jpg";
      		cv::imwrite(image_name, mat6);
      	}
      
      	delete[] data;
      	return 0;
      }

      图像结果(Lena.jpg)如下:前向传播、反向传播,前两幅为Max,后两幅为Avg方法
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/fengbingchun/article/details/60962777,作者:fengbingchun,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Nginx查找耗时的接口

      下一篇:C#中的多线程

      相关文章

      2024-06-25 09:53:21

      iOS开发CoreAnimation解读之三——几种常用Layer的使用解析

      CAEmitterLayer是CoreAnimation框架中的粒子发射层,在以前的一片博客中有详细的介绍和范例,这里不再重复

      2024-06-25 09:53:21
      iOS , layer
      2024-05-17 07:20:42

      jquery ajax 使用layer的超时提示

      jquery ajax 使用layer的超时提示

      2024-05-17 07:20:42
      ajax , jquery , layer
      2024-05-15 10:05:21

      Layui 内置方法 - layer.tips(tips层 )

      type:4的深度定制,它会智能定位,即灵活地判断它应该出现在哪边,默认是在元素右边弹出。

      2024-05-15 10:05:21
      layer
      2024-04-25 09:39:52

      Layui 内置方法 - layer.tab(tab层)

      Layui 内置方法 - layer.tab(tab层)

      2024-04-25 09:39:52
      layer
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5235063

      查看更多

      最新文章

      iOS开发CoreAnimation解读之三——几种常用Layer的使用解析

      2024-06-25 09:53:21

      查看更多

      热门文章

      iOS开发CoreAnimation解读之三——几种常用Layer的使用解析

      2024-06-25 09:53:21

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      iOS开发CoreAnimation解读之三——几种常用Layer的使用解析

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号