-
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); } } } }
更多相关内容 -
main_池化28*28*1_mnistpython_
2021-10-02 09:55:26原始数据集的图片大小为28*28*1,一轮卷积操作与5个滤波器卷积,步长设置为1,得到24*24*5的卷积层。通过maxpooling后得到大小为12*12*5的池化层。展开后连接一个全连接层做分类器。因为该任务为多分类任务,输出层... -
1x1卷积和池化操作
2021-08-07 10:47:371x1卷积和池化操作 1. 本质 1x1卷积和池化操作的本质是压缩feature mapping(输入层) 1x1卷积通过改变feature mapping(输入层)的通道数量,具体操作是减少通道数量实现压缩 池化操作通过改变feature mapping...1x1卷积和池化操作
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,并且stride=2,padding=0,一般池化操作padding=0
- 和卷积的区别,卷积需要卷积核对输入层进行对应相乘再相加得到输出层的一个点,而池化直接对输入层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 nout=stridenin+2⋅padding−filter+1
- 池化是逐通道进行的,所以池化前后通道数量没变化。而一次卷积操作对所有通道都运算,这就是为什么卷积核的通道数核和输入层通道数相同。
4.1x1卷积减少计算量和参数量
参考: -
卷积神经网络CNN的池化层和1*1的卷积核的作用
2020-04-26 12:29:40卷积神经网络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) 卷积层和池化层**
2018-08-28 15:50:06卷积神经网络(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的窗口选出最大的数作为输出矩阵的相应元素的值。 -
pytorch学习笔记-最大池化的使用
2022-01-22 18:47:08作用:保留输入特征,同时减小数据量。 输入图像: 1 2 ... 池化核:3*3,kernel_size=3 输出图像:ceil_mode=True 2 3 5 1 ceil_mode=False 2 输入: from turtle import s -
卷积神经网络学习路线(三)| 盘点不同类型的池化层、1*1卷积的作用和卷积核是否一定越大越好?
2019-12-09 23:20:51前言 这是卷积神经网络学习路线的第三篇,这一篇开始盘点一下池化层的不同类型和1*1卷积 -
池化、池化与卷积异同、zero-padding
2021-01-17 12:54:501 池化(pooling)层的理解池化,也即降采样(subsample),降低数据的大小。池化(pooling)2 池化方法常用的池化方法是:最大值池化(max_pooling),平均值池化。其中,最常用的是最大值池化。3 池化过程通过使用一个池化... -
PyTorch的自适应池化Adaptive Pooling实例
2020-12-23 05:57:38自适应池化Adaptive Pooling是PyTorch含有的一种池化层,在PyTorch的中有六种形式: 自适应最大池化Adaptive Max Pooling: torch.nn.AdaptiveMaxPool1d(output_size) torch.nn.AdaptiveMaxPool2d(output_size) ... -
Inception V1架构详情和卷积池化概念
2019-08-14 09:21:34Inception 架构详情:inception V1 具有22层。包括池化层的话是 27 层,该模型在最后一个 inception 模块处使用全局平均池化,线性输出。 -
对Pytorch中Tensor的各种池化操作解析
2021-01-20 04:07:13对一个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.,... -
卷积神经网络学习笔记与心得(4)池化
2018-02-25 20:38:00上图中卷积核提取的是竖直方向上的连续像素,但是,被增强的像素只占了结果的1/3,对于多层网络,其余重要性较低的信息也被传入了下一层网络,造成了不必要的浪费,因此需要用池化对卷基层得到的结果做聚合统计。... -
CNN0926_一维卷积_matlab1D-CNN
2021-09-11 06:10:45一维卷积代码,基本的网络结构,输入 卷积 池化 卷积 池化 输出,可实现分类的功能 -
高效池化-JAVA-HttpClient工具类
2021-05-19 15:18:571.高效简单池化的HttpClient工具类,提供单元测试用列。 2.支持基于SpringBoot 2.1.x的自动装载模块,引用依赖即可使用。 3.公司几十个项目都使用该工具类访问第三方的Http/Https+json协议接口。 4.经过上市公司多个... -
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020-12-23 06:26:39如题:只需要给定输出特征图的大小就好,其中通道数前后不发生变化。具体如下: AdaptiveAvgPool2d CLASStorch.nn.AdaptiveAvgPool2d(output_size)[SOURCE] Applies a 2D adaptive average pooling over an input ... -
MaxPooling 最大池化简单实现
2020-12-22 04:01:22#!/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 -
PyTorch学习笔记(三)定义各种卷积池化线性激活层
2020-12-21 09:52:39写在前面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... -
最大池化:选择kernel_size为3x3而不是2x2的原因
2019-10-25 11:21:58https://blog.csdn.net/tigerda/article/details/78800552 ●Theano中对Max-pooling的解释 Max-poolingisusefulinvisionfortworeasons: 1、Byeliminatingnon-maximalvalues,itreducescomputationforupp... -
卷积神经网络的卷积及池化(pooling)
2021-07-15 14:10:20如何理解卷积神经网络中的卷积及池化(pooling) 1. 卷积 卷积层是用一个固定大小的矩形区去席卷原始数据,将原始数据分成一个个和卷积核大小相同的小块,然后将这些小块和卷积核相乘输出一个卷积值(注意这里是一个... -
matlab模拟池化过程
2022-03-02 13:14:04matlab模拟池化过程 -
深度学习基础(1)——卷积、池化、全连接
2020-09-08 19:05:44文章目录 卷积 池化层 全连接层 Stride 卷积 层数计算 在下图中左侧是一个32x32x3的图像,其中3代表RGB。每个卷积核是5x5x3,每个卷积核生成一个特征图(feature map)。下图里面有6个5x5x3的卷积核,所以输出6个... -
5.4 池化层
2021-01-07 03:00:59如果我们构造的卷积核输出Y[i, j]=1,那么说明输入中X[i, j]和X[i, j+1]数值不一样。这可能意味着物体边缘通过这两个元素之间。但实际图像里,我们感兴趣的物体不会总出现在固定位置:即使我们连续拍摄同一个物体也... -
1×1的卷积/交叉通道池化(cross channel pooling)
2019-06-12 10:05:331*1卷积第一次在Network in Network中提出,在这篇论文中,作者的目标是在不简单地堆叠更多层的情况下生成更深层的网络,它用1x1和3x3的混合卷积的较小感知器层代替少数滤波器,也就是说,它可以被看作是“变宽”而... -
池化技术总结
2021-01-13 23:28:19然而,池化如何回传梯度呢,池化回传梯度的原则是什么呢,最大池化与平均池化的区别是什么呢,什么时候选择最大池化、什么时候选择平均池化呢。 主要用的池化操作有平均池化、最大池化、全局平均池化,全局自适应... -
tensorflow实现1维池化操作
2019-09-24 13:04:32参考: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
2018-03-08 16:35:051.边界检测示例 假如你有一张如下的图像,你想让计算机搞清楚图像上有什么物体,你可以做的事情是检测图像的垂直边缘和水平边缘。 如下是一个6*6的灰度图像,构造一个3*3的矩阵,在卷积神经网络中通常称之为... -
图像最大池化
2020-03-15 12:55:56最大池化 池化:把图片使用均等大小网格分割,并求网格内代表值的操作 最大池化:将网格中的最大值作为这个网格的代表值 二. 使用4*4网格对图像进行最大池化操作 import cv2 import numpy as np # max ... -
pytorch 池化层——最大值池化nn.MaxPool2d() nn.MaxPool1d()
2020-02-22 01:06:01pytorch 池化层——最大值池化nn.MaxPool 2dnn.MaxPool1d nn.MaxPool1d函数参数例子计算过程nn.MaxPool2d函数参数例子计算过程 nn.MaxPool1d 函数 class torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, ...