• 【YOLO3代码详解系列08】平均池化
2020-05-23 14:36:47

## 1 avgpool_layer.h

#ifndef AVGPOOL_LAYER_H
#define AVGPOOL_LAYER_H
#include "image.h"
#include "cuda.h"
#include "layer.h"
#include "network.h"

typedef layer avgpool_layer;

image get_avgpool_image(avgpool_layer l);

// 构造平均池化层函数
avgpool_layer make_avgpool_layer(int batch, int w, int h, int c);

void resize_avgpool_layer(avgpool_layer *l, int w, int h);

// 平均池化层前向传播函数
void forward_avgpool_layer(const avgpool_layer l, network net);

// 平均池化层后向传播函数
void backward_avgpool_layer(const avgpool_layer l, network net);

#ifdef GPU
void forward_avgpool_layer_gpu(avgpool_layer l, network net);
void backward_avgpool_layer_gpu(avgpool_layer l, network net);
#endif

#endif



## 2 avgpool_layer.c

#include "avgpool_layer.h"
#include "cuda.h"
#include <stdio.h>

// 构造平均池化层
avgpool_layer make_avgpool_layer(int batch, int w, int h, int c)
{
fprintf(stderr, "avg                     %4d x%4d x%4d   ->  %4d\n",  w, h, c, c);
avgpool_layer l = {0};
l.type = AVGPOOL;
l.batch = batch;
l.h = h;
l.w = w;
l.c = c;
l.out_w = 1; //平均池化后宽度为1
l.out_h = 1; //平均池化后高度为1
l.out_c = c;
l.outputs = l.out_c;
l.inputs = h*w*c;
int output_size = l.outputs * batch;
l.output =  calloc(output_size, sizeof(float));
l.delta =   calloc(output_size, sizeof(float));
l.forward = forward_avgpool_layer;
l.backward = backward_avgpool_layer;

#ifdef GPU
l.forward_gpu = forward_avgpool_layer_gpu;
l.backward_gpu = backward_avgpool_layer_gpu;
l.output_gpu  = cuda_make_array(l.output, output_size);
l.delta_gpu   = cuda_make_array(l.delta, output_size);
#endif

return l;
}

void resize_avgpool_layer(avgpool_layer *l, int w, int h)
{
l->w = w;
l->h = h;
l->inputs = h*w*l->c;
}

// 平均池化层前向传播
void forward_avgpool_layer(const avgpool_layer l, network net)
{
int b,i,k;

for(b = 0; b < l.batch; ++b){
for(k = 0; k < l.c; ++k){
int out_index = k + b*l.c;
l.output[out_index] = 0;
for(i = 0; i < l.h*l.w; ++i){
int in_index = i + l.h*l.w*(k + b*l.c);
l.output[out_index] += net.input[in_index];
}
l.output[out_index] /= l.h*l.w;
}
}
}

// 平均池化层后向传播
void backward_avgpool_layer(const avgpool_layer l, network net)
{
int b,i,k;

for(b = 0; b < l.batch; ++b){
for(k = 0; k < l.c; ++k){
int out_index = k + b*l.c;
for(i = 0; i < l.h*l.w; ++i){
int in_index = i + l.h*l.w*(k + b*l.c);
net.delta[in_index] += l.delta[out_index] / (l.h*l.w);
}
}
}
}

更多相关内容
• 原始数据集的图片大小为28*28*1，一轮卷积操作与5个滤波器卷积，步长设置为1，得到24*24*5的卷积层。通过maxpooling后得到大小为12*12*5的池化层。展开后连接一个全连接层做分类器。因为该任务为多分类任务，输出层...
• 1x1卷积和池化操作 1. 本质 1x1卷积和池化操作的本质是压缩feature mapping（输入层） 1x1卷积通过改变feature mapping（输入层）的通道数量，具体操作是减少通道数量实现压缩 池化操作通过改变feature mapping...

# 1. 本质

• 1x1卷积和池化操作的本质是压缩feature mapping（输入层或者叫表示层）
• 1x1卷积通过改变feature mapping（输入层或者叫表示层）的通道数量，具体操作是减少通道数量实现压缩
• 池化操作通过改变feature mapping（输入层或者叫表示层）的尺寸（宽和高）

# 2. 1x1卷积操作

假设这是一个28×28×192的输入层，如果通道数量很大，该如何把它压缩为28×28×32维度的层呢？你可以用32个大小为1×1的过滤器，严格来讲每个过滤器大小都是1×1×192维，因为过滤器中通道数量必须与输入层中通道的数量保持一致。32个过滤器（卷积核）分别对应输出层32个通道，一个过滤器得到一个通道的结果。

# 3.池化操作

• 这里的feature mapping（表示层）大小池化后由4x4变成了2x2
• 池化直接在feature mapping（输入层或者叫表示层）上进行操作
• 和卷积的区别，卷积需要卷积核对输入层进行对应相乘再相加得到输出层的一个点，而池化直接对输入层2x2大小的范围操作
• 和卷积的相同点，计算公式是一样的 n o u t = n i n + 2 ⋅ p a d d i n g − f i l t e r s t r i d e + 1 n_{out} = \frac {n_{in} + 2 \cdot padding - filter } {stride} +1
• 池化是逐通道进行的，所以池化前后通道数量没变化。而一次卷积操作对所有通道都运算，这就是为什么卷积核的通道数核和输入层通道数相同。

# 4.1x1卷积减少计算量和参数量

参考：

http://ai-start.com/dl2017/html/lesson4-week2.html

展开全文
• 卷积神经网络CNN的池化层和1*1的卷积核的作用 （1）池化层|Pooling Layer： 目前，有两种广泛使用的池化操作——平均池化（average pooling）和最大池化（max pooling），其中最大池化是两者中使用最多的一个操作，...

## 卷积神经网络CNN的池化层和1*1的卷积核的作用

（1）池化层|Pooling Layer：
目前，有两种广泛使用的池化操作——平均池化（average pooling）最大池化（max pooling），其中最大池化是两者中使用最多的一个操作，其效果一般要优于平均池化。池化层用于在卷积神经网络上减小特征空间维度，但不会减小深度，1乘1的卷积核来担任减小深度的角色。当使用最大池化层时，采用输入区域的最大数量，而当使用平均池化时，采用输入区域的平均值。下图就是采用最大池化的方法维度从4乘4减小到了2乘2，但并不会减小深度（也就是通道数）

说明：一般普遍采用的都是2乘2的卷积核，并且步长是2，这样就达到了维度减小一半的目的

参考链接：https://blog.csdn.net/qq_21950671/article/details/88808152

（2）1×1卷积理解
假设当前输入张量维度为6×6×32，卷积核维度为1×1×32，取输入张量的某一个位置（如图黄色区域）与卷积核进行运算。实际上可以看到，如果把1×1×32卷积核看成是32个权重W，输入张量运算的1×1×32部分为输入x，那么每一个卷积操作相当于一个Wx过程，多个卷积核就是多个神经元，相当于一个全连接网络。
综上，可以将1×1卷积过程看成是将输入张量分为一个个输入为1×1×32的x，他们共享卷积核变量（对应全连接网络的权重）W的全连接网络

1×1卷积核作用就是通过控制卷积核的数量达到通道数大小的放缩而池化层只能改变高度和宽度，无法改变通道数

参考链接：https://www.cnblogs.com/CZiFan/p/9490565.html

展开全文
• 卷积神经网络（CNN） 卷积层和池化层 ...通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图（使用两个filter将得到两个特征图）；通常使用多层卷积层来得到更深层次的特征图。 输入图...

卷积神经网络（CNN） 卷积层和池化层
（1）卷积层：用来进行特征提取，假设输入图像是32*32*3，3是它的深度（即R,G，B），卷积层是一个5*5*3的filter（感受野/滤波器）。感受野的深度必须和输入图像的深度相同。通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图（使用两个filter将得到两个特征图）；通常使用多层卷积层来得到更深层次的特征图。
输入图像和filter的对应位置元素相乘再求和，最后再加上b（偏置值）
输入大小为:W1*H1*D1
需要指定的参数：fiter个数（K）。filter大小（F），步长（S），边界填充（P）
输出：W2=(W1-F+2P)/S+1
H2=(H1-F+2P)/S+1
D2=K(每个filter训练出一个feature map)
（2）池化层：池化层夹在连续的卷积层中间，用户压缩数据和参数的量，减少过拟合。池化层用的方法有Max pooling 和average pooling，而实际用的较多的是Max pooling。如图所示：

直接将每个2*2的窗口选出最大的数作为输出矩阵的相应元素的值。

展开全文
• 作用：保留输入特征，同时减小数据量。 输入图像： 1 2 ... 池化核：3*3，kernel_size=3 输出图像：ceil_mode=True 2 3 5 1 ceil_mode=False 2 输入： from turtle import s
• 前言 这是卷积神经网络学习路线的第三篇，这一篇开始盘点一下池化层的不同类型和1*1卷积
• 1 池化(pooling)层的理解池化，也即降采样(subsample)，降低数据的大小。池化(pooling)2 池化方法常用的池化方法是：最大值池化(max_pooling)，平均值池化。其中，最常用的是最大值池化。3 池化过程通过使用一个池化...
• Inception 架构详情：inception V1 具有22层。包括池化层的话是 27 层，该模型在最后一个 inception 模块处使用全局平均池化，线性输出。
• 对一个C*H*W的三维输入Tensor, 池化输出为C*H*N, 即按照H轴逐行对W轴平均池化 >>> a = torch.ones(2,3,4) >>> a[0,1,2] = 0 >>>> a tensor([[[1., 1., 1., 1.], [1., 1., 0., 1.], [1., 1., 1., 1.]], [[1., 1.,...
• 上图中卷积核提取的是竖直方向上的连续像素，但是，被增强的像素只占了结果的1/3，对于多层网络，其余重要性较低的信息也被传入了下一层网络，造成了不必要的浪费，因此需要用池化对卷基层得到的结果做聚合统计。...
• 一维卷积代码，基本的网络结构，输入 卷积 池化 卷积 池化 输出，可实现分类的功能
• 1.高效简单池化的HttpClient工具类,提供单元测试用列。 2.支持基于SpringBoot 2.1.x的自动装载模块，引用依赖即可使用。 3.公司几十个项目都使用该工具类访问第三方的Http/Https+json协议接口。 4.经过上市公司多个...
• #!/usr/bin/env python2 # -*-coding:utf8-*- import numpy as np ... height = feature_map.shape[1] width = feature_map.shape[2] # 确定最后的输出形状 out_height = np.uint16((height - size) // stri
• 写在前面1. 卷积与转置卷积1.1 卷积层1.2 转置卷积层2. 池化与去池化2.1 池化层2.2 去池化层3. 线性连接4. 激活函数4.1 sigmoid4.2 tanh4.3 ReLU4.4 ReLU 的修改版们 0. 写在前面 本文记录一下使用 PyTorch 建立...
• ## 卷积池化后的大小

千次阅读 2018-06-10 10:19:17
‘SAME’ ...第一层卷积为32个5*5卷积核，其shape为[5,5,1,32]，其步长strides为[1,1,1,1]，紧接着是第一层的2*2的max_pooling，其形状为[1,2,2,1]，其步长strides为[1,2,2,1]; 第二层卷积为6...
• https://blog.csdn.net/tigerda/article/details/78800552 ●Theano中对Max-pooling的解释 Max-poolingisusefulinvisionfortworeasons: 1、Byeliminatingnon-maximalvalues,itreducescomputationforupp...
• 如何理解卷积神经网络中的卷积及池化(pooling) 1. 卷积 卷积层是用一个固定大小的矩形区去席卷原始数据，将原始数据分成一个个和卷积核大小相同的小块，然后将这些小块和卷积核相乘输出一个卷积值（注意这里是一个...
• ## matlab模拟池化过程

千次阅读 2022-03-02 13:14:04
matlab模拟池化过程
• 文章目录 卷积 池化层 全连接层 Stride 卷积 层数计算 在下图中左侧是一个32x32x3的图像，其中3代表RGB。每个卷积核是5x5x3，每个卷积核生成一个特征图（feature map）。下图里面有6个5x5x3的卷积核，所以输出6个...
• 如果我们构造的卷积核输出Y[i, j]=1，那么说明输入中X[i, j]和X[i, j+1]数值不一样。这可能意味着物体边缘通过这两个元素之间。但实际图像里，我们感兴趣的物体不会总出现在固定位置：即使我们连续拍摄同一个物体也...
• 1*1卷积第一次在Network in Network中提出，在这篇论文中，作者的目标是在不简单地堆叠更多层的情况下生成更深层的网络，它用1x1和3x3的混合卷积的较小感知器层代替少数滤波器，也就是说，它可以被看作是“变宽”而...
• 然而，池化如何回传梯度呢，池化回传梯度的原则是什么呢，最大池化与平均池化的区别是什么呢，什么时候选择最大池化、什么时候选择平均池化呢。 主要用的池化操作有平均池化、最大池化、全局平均池化，全局自适应...
• 参考：https://github.com/tensorflow/tensorflow/issues/9442 https://www.tensorflow.org/versions/r1.5/api_docs/python/tf/layers/MaxPooling1D 转载于:https://www.cnblogs.com/HITSZ/p/8711658.html...
• 1.边界检测示例 假如你有一张如下的图像，你想让计算机搞清楚图像上有什么物体，你可以做的事情是检测图像的垂直边缘和水平边缘。  如下是一个6*6的灰度图像，构造一个3*3的矩阵，在卷积神经网络中通常称之为...
• ## 图像最大池化

千次阅读 2020-03-15 12:55:56
最大池化 池化：把图片使用均等大小网格分割，并求网格内代表值的操作 最大池化：将网格中的最大值作为这个网格的代表值 二. 使用4*4网格对图像进行最大池化操作 import cv2 import numpy as np # max ...
• pytorch 池化层——最大值池化nn.MaxPool 2dnn.MaxPool1d nn.MaxPool1d函数参数例子计算过程nn.MaxPool2d函数参数例子计算过程 nn.MaxPool1d 函数 class torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, ...

...