pytorch之卷积模块
卷积

卷积在 pytorch 中有两种方式,一种是 torch.nn.Conv2d(),一种是torch.nn.functional.conv2d(),这两种形式本质都是使用一个卷积操作这两种形式的卷积对于输入的要求都是一样的,首先需要输入是一个 torch.autograd.Variable() 的类型,大小是 (batch, channel, H, W),其中 batch 表示输入的一批数据的数目,第二个是输入的通道数,一般一张彩色的图片是 3,灰度图是 1,而卷积网络过程中的通道数比较大,会出现几十到几百的通道数,H 和 W 表示输入图片的高度和宽度,比如一个 batch 是 32 张图片,每张图片是 3 通道,高和宽分别是 50 和 100,那么输入的大小就是 (32, 3, 50, 100)

导入一些能够用到的模块

import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
import torch.nn.functional as F
from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('./1.jpg').convert('L') # 读入一张灰度图的图片
im = np.array(im, dtype='float32') # 将其转换为一个矩阵

#print(im.shape[0],im.shape[1])     448*448
# 可视化图片
plt.imshow(im.astype('uint8'), cmap='gray')
1
2
3
4
5
6
7
8
9
10
11
12
13
14

将图片矩阵转化为 pytorch tensor,并适配卷积输入的要求

im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
1
定义一个算子对其进行轮廓检测
使用 nn.Conv2d

conv1 = nn.Conv2d(1, 1, 3, bias=False) # 定义卷积

sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值

edge1 = conv1(Variable(im)) # 作用在图片上
edge1 = edge1.data.squeeze().numpy() # 将输出转换为图片的格式
1
2
3
4
5
6
7
8
可视化边缘检测之后的结果

plt.imshow(edge1, cmap='gray')
1

使用 F.conv2d

sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
weight = Variable(torch.from_numpy(sobel_kernel))

edge2 = F.conv2d(Variable(im), weight) # 作用在图片上
edge2 = edge2.data.squeeze().numpy() # 将输出转换为图片的格式
plt.imshow(edge2, cmap='gray')
1
2
3
4
5
6
7

可以看到两种形式能够得到相同的效果,使用 nn.Conv2d() 相当于直接定义了一层卷积网络结构,而使用 torch.nn.functional.conv2d() 相当于定义了一个卷积的操作,所以使用后者需要再额外去定义一个 weight,而且这个 weight 也必须是一个 Variable,而使用 nn.Conv2d() 则会帮我们默认定义一个随机初始化的 weight,如果需要修改,那么取出其中的值对其修改,如果不想修改,那么可以直接使用这个默认初始化的值,非常方便
实际使用中基本都使用 nn.Conv2d() 这种形式

池化层
卷积网络中另外一个非常重要的结构就是池化,这是利用了图片的下采样不变性,即一张图片变小了还是能够看出了这张图片的内容,而使用池化层能够将图片大小降低,非常好地提高了计算效率,同时池化层也没有参数。池化的方式有很多种,比如最大值池化,均值池化等等,在卷积网络中一般使用最大值池化。

在 pytorch 中最大值池化的方式也有两种,一种是 nn.MaxPool2d(),一种是 torch.nn.functional.max_pool2d(),他们对于图片的输入要求跟卷积对于图片的输入要求是一样了 举例说明

使用 nn.MaxPool2d

pool1 = nn.MaxPool2d(2, 2)
print('before max pool, image shape: {} x {}'.format(im.shape[2], im.shape[3]))
small_im1 = pool1(Variable(im))
small_im1 = small_im1.data.squeeze().numpy()
print('after max pool, image shape: {} x {} '.format(small_im1.shape[0], small_im1.shape[1]))
plt.imshow(small_im1, cmap='gray')
1
2
3
4
5
6
before max pool, image shape: 448 x 448
after max pool, image shape: 224 x 224

F.max_pool2d

print('before max pool, image shape: {} x {}'.format(im.shape[2], im.shape[3]))
small_im2 = F.max_pool2d(Variable(im), 2, 2)
small_im2 = small_im2.data.squeeze().numpy()
print('after max pool, image shape: {} x {} '.format(small_im1.shape[0], small_im1.shape[1]))
plt.imshow(small_im2, cmap='gray')
1
2
3
4
5

跟卷积层一样,实际使用中,一般使用 nn.MaxPool2d()

在实际应用中加入基层激活函数以及卷积层池化层的应用

im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
conv1 = nn.Conv2d(1, 1, 3, bias=False) # 定义卷积

sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值

edge1 = conv1(Variable(im)) # 作用在图片上
x=F.relu(edge1)
x=F.relu(x)
x=F.relu(x)#加入三层激活函数
pool1 = nn.MaxPool2d(2, 2)
x = pool1(Variable(x))
x = pool1(Variable(x))#加入两层池化
#edge2 = x.data.squeeze().numpy()
x = x.data.squeeze().numpy()
print(x.shape)#输出大小

plt.imshow(x, cmap='gray')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

--------------------- 
作者:朴素.无恙 
来源:CSDN 
原文:https://blog.csdn.net/weixin_40123108/article/details/83510592 
版权声明:本文为博主原创文章,转载请附上博文链接!

pytorch之卷积模块、池化、激活函数(可视化)相关推荐

  1. PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)

    PyTorch框架学习十--基础网络层(卷积.转置卷积.池化.反池化.线性.激活函数) 一.卷积层 二.转置卷积层 三.池化层 1.最大池化nn.MaxPool2d 2.平均池化nn.AvgPool2 ...

  2. 一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实......

    编辑丨量子位 做计算机视觉,离不开CNN. 可是,卷积.池化.Softmax--究竟长啥样,是怎样相互连接在一起的? 对着代码凭空想象,多少让人有点头皮微凉.于是,有人干脆用Unity给它完整3D可视 ...

  3. 图像平均池化 利用pytorch对图像进行池化

    一. 池化简介 平均池化:将图片按照固定大小网格分割,网格内的像素值取网格内所有像素的平均值. 池化:使用均等大小的网格将图片分割,并求网格内代表值的过程. 池化是卷积神经网络(convolution ...

  4. 【数据挖掘】卷积神经网络 ( 池化 | 丢弃 | 批量规范化 | 卷积神经网络完整流程示例 | 卷积 | 池化 | 全连接 | 输出 | 卷积神经网络总结 )

    文章目录 I . 池化 II . 丢弃操作 III . 批量规范化 IV . 卷积神经网络 完整流程示例 ( 1 ) : 原始输入图 V . 卷积神经网络 完整流程示例 ( 2 ) : 卷积层 C1C ...

  5. 卷积和池化matlab 实现,UFLDL新版教程与编程练习(七):Convolution and Pooling(卷积和池化)...

    UFLDL是吴恩达团队编写的较早的一门深度学习入门,里面理论加上练习的节奏非常好,每次都想快点看完理论去动手编写练习,因为他帮你打好了整个代码框架,也有详细的注释,所以我们只要实现一点核心的代码编写工 ...

  6. 使用CNN实现图像分类——理解卷积神经网络(卷积、池化、全连接)

    1. 卷积神经网络(CNN)简介 19世纪60年代,科学家通过对猫的视觉皮层细胞研究发现,每一个视觉神经元只会处理一小块区域的视觉图像,即感受野(Receptive Field).卷积神经网络的概念即 ...

  7. conv_output_length 在全连接之前获取定义的卷积和池化的输出维度

    文章目录 1.问题描述 2.Dense定义在`build`的时候提前获得卷积.池化的输出尺寸 关键代码:build 关键代码:call 全部代码 1.问题描述 自定义Keras类的时候,在build方 ...

  8. [CNN] 卷积、反卷积、池化、反池化

    之前一直太忙,没时间整理,这两天抽出点时间整理一下卷积.反卷积.池化.反池化的内容,也希望自己对一些比较模糊的地方可以理解的更加清晰. 一.卷积 1.卷积的简单定义 卷积神经网络中的卷积操作可以看做是 ...

  9. 深度学习笔记 5 卷积、池化

    目录 1. 卷积 1.1 卷积的目的 1.2 卷积的基本属性 1.3 卷积的特点 2. 卷积分类与计算 2.1 标准卷积 2.2 反卷积(转置卷积) ​2.3 空洞卷积 2.4 深度可分离卷积 2.5 ...

最新文章

  1. SQLite的sqlite_master表
  2. dnscat使用——整体感觉这个工具不完善,失败率很高,传文件时候没有完整性校验,我自己测试时通过域名转发失败,可能是其特征过于明显导致...
  3. weblogic从入门到飞起(部署应用、日志)(六)
  4. Git的commit之后的撤销revert
  5. mysql单表备份语句
  6. 「服务端」node服务的监控预警系统架构
  7. php 筛选数组,2020-07-24 php 通过数组键值对筛选数组
  8. Spring Cloud微服务之Gateway网关(十三)
  9. Java8新特性(Integer,Long,Byte,Short)
  10. java dispose事件_Android-在 ViewModel 中使用 AutoDispose2 解决 RxJava 的内存泄露问题
  11. 运维派送红包福利,参与就有!
  12. 华为路由器支持ftp服务器,华为路由器FTP配置详解
  13. KITTI Benchmark原理_距离误差百分数
  14. nodejs koa2 mysql_springboot动态加载sigar - SegmentFault 思否
  15. 分享一个无意间发现的躺赚网络创业小项目!
  16. 沉没的王国---揭秘滇东自杞国(5)
  17. IT互联网行业猎头的年终总结:结束后开始
  18. Java实现微信红包随机金额算法
  19. 嵌入式UWB定位测距设备开发实战(4)硬件之元器件选型
  20. Echarts实现饼图+饼图中心文字显示

热门文章

  1. 中国民航大学计算机学院宿舍,中国民航大学计算机科学与技术学院研究生导师简介-谢丽霞_清华大学宿舍...
  2. c语言区间,C 语言实例 – 循环输出区间范围内的奇数/偶数 | 菜鸟教程
  3. 12bit的图像如何向8bit转化_【福联影像】10bit显示器比8bit专业在哪?想告别色彩断层必须要了解...
  4. PTA 基础编程题目集 7-19 支票面额 C语言
  5. Python3 字符串
  6. vue从创建到完整的饿了么(12)miste.vue
  7. FileOutPutStream in 创新实训 自然语言交流系统
  8. 抽屉效果----mmdrawercontroller和viewdeck
  9. Unobtrusive JavaScript 不唐突的JavaScript的七条准则
  10. GTK+图形化应用程序开发学习笔记