pytorch学习日记之图片的简单卷积、池化

news2024/11/14 3:44:50

导入图片并转化为张量

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
mymi = Image.open("pic/123.png")
# 读取图像转化为灰度图片转化为numpy数组
myimgray = np.array(mymi.convert("L"), dtype=np.float32)
# 可视化图片
plt.figure(figsize=(10, 10))
plt.imshow(myimgray, cmap=plt.cm.gray)
plt.show()

# 将数组转化成张量
imh, imw = myimgray.shape
myimgray_t = torch.from_numpy(myimgray.reshape(1, 1, imh, imw))
print(myimgray_t.shape)

可视化图片内容如下图所示:
在这里插入图片描述

对灰度图像进行卷积提取图像轮廓

kersize = 5  # 定义边缘检测卷积核,并将维度处理为1*1*5*5
ker = torch.ones(kersize, kersize, dtype=torch.float32)*-1
ker[2, 2] = 24
ker = ker.reshape((1, 1, kersize, kersize))
# 进行卷积操作
# 设置卷积层,输入数为1,特征映射的数量为2,卷积核大小为之前边缘检测卷积核大小
# 卷积步长为默认1,输入填充数量为0,步幅默认为1,偏置为False
conv2d = nn.Conv2d(1, 2, (kersize, kersize), bias=False)
# 设置卷积时使用的核,第一个核使用边缘检测
conv2d.weight.data[0] = ker
# 对灰度图像进行卷积操作
imconv2dout = conv2d(myimgray_t)
# 对卷积后的输出进行维度压缩
imconv2dout_im = imconv2dout.data.squeeze()
print("卷积后的尺寸:", imconv2dout_im.shape)

# 可视化卷积后的图像
plt.figure(figsize=(20, 10))
plt.subplot(1, 2, 1)
plt.imshow(imconv2dout_im[0], cmap=plt.cm.gray)
plt.subplot(1, 2, 2)
plt.imshow(imconv2dout_im[1], cmap=plt.cm.gray)
plt.show()

边缘检测后得到的图像如下图所示:
在这里插入图片描述

池化操作:

这一步骤主要是为了对特征进行进一步处理,池化层可以起到对数据进一步浓缩,从而缓解计算时对内存的需求。池化会选取一定大小区域,将该区域的额像素值使用一个代表元素表示。如果使用该区域的平均值代替则称为平均池化,如果使用最大值代替则称为最大池化,这两种方式的计算如下图所示:
在这里插入图片描述

最大池化代码以及结果:

# 对卷积后的图像进行最大池化
maxpool2 = nn.MaxPool2d(2, stride=2)
pool2_out = maxpool2(imconv2dout)
pool2_out_im = pool2_out.squeeze()
print("最大池化后的尺寸", pool2_out.shape)
# 可视化最大池化后的结果
plt.figure(figsize=(20, 10))
plt.subplot(1, 2, 1)
plt.imshow(pool2_out_im[0].data, cmap=plt.cm.gray)
plt.subplot(1, 2, 2)
plt.imshow(pool2_out_im[1].data, cmap=plt.cm.gray)
plt.show()

在这里插入图片描述
其中torch.nn.MaxPool2d(kernel_size,stride,padding=0,dilation=1,return_indices=False,ceil_mode=False)中包含了池化的一些参数设置,
kernel_size表示最大值池化的窗口大小,
stride是最大值池化窗口移动的步长,默认值是kernel_size,
padding为输入矩阵的每条边补充0的层数,主要作用是保持数据矩阵的大小减少信息损失(之前看的印象可能有点不对),
dilation是控制窗口中元素步幅的参数,
return_indices如果为True则返回最大值的索引,
ceil_mode如果等于True,计算输出信号大小的时候,会使用向上取整,默认是向下取整。
torch.nn.MaxPool2d()输入为:在这里插入图片描述
输出为:在这里插入图片描述
其中在这里插入图片描述

平均池化代码及结果:

# 卷积后的结果进行平均值池化
avgpool2 = nn.AvgPool2d(2, stride=2)
pool2avg_out = avgpool2(imconv2dout)
pool2avg_out_im = pool2avg_out.squeeze()
print(pool2avg_out.shape)

# 可视化平均池化后的结果
plt.figure(figsize=(20, 10))
plt.subplot(1, 2, 1)
plt.imshow(pool2avg_out_im[0].data, cmap=plt.cm.gray)
plt.subplot(1, 2, 2)
plt.imshow(pool2avg_out_im[1].data, cmap=plt.cm.gray)
plt.show()

在这里插入图片描述
可以观察到,特征图像比最大化池化要淡化一点。

自适应平均池化代码及结果

下面使用nn.AdaptiveAvgPool2d()函数对卷积后的输出进行自适应平均值池化并可视化:


# 卷积后的结果进行自适应平均值池化
AdaAvgpool2 = nn.AdaptiveAvgPool2d(output_size=(100, 100))
# output_size参数指定输出特征映射的尺寸
pool2ada_out = AdaAvgpool2(imconv2dout)
pool2ada_out_im = pool2ada_out.squeeze()
print(pool2ada_out.shape)

# 可视化自适应平均值池化后的结果
plt.figure(figsize=(20, 10))
plt.subplot(1, 2, 1)
plt.imshow(pool2ada_out_im[0].data, cmap=plt.cm.gray)
plt.subplot(1, 2, 2)
plt.imshow(pool2ada_out_im[1].data, cmap=plt.cm.gray)
plt.show()

在这里插入图片描述
池化后特征映射尺寸变小,图像更加模糊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GNURadio RTL-SDR之FM接收

环境配置与准备: PC操作系统: Windows10 64位系统。RTL-SDR: 包括射频主板和天线。Radioconda:GNURadio windows方案之一,安装radioconda-2023.02.24-Windows-x86_64,官方下载和操作指导: InstallingGR - GNU Radioht…

spring框架--全面详解(学习笔记)

目录 1.Spring是什么 2.Spring 框架特点 3.Spring体系结构 4.Spring开发环境搭建 5.spring中IOC和DI 6.Spring中bean的生命周期 7.Spring Bean作用域 8.spring注解开发 9.Spring框架中AOP(Aspect Oriented Programming) 10.AOP 实现分类 11.A…

并发编程之死锁问题介绍

一、本文概览 死锁问题在并发编程中是一个非常致命的问题,问题一旦产生,只能通过重启机器、修改代码来修复问题,下面我们通过一小段文章内容介绍下死锁以及如何死锁的预防 二、什么是死锁? 在介绍死锁之前,先来明确下什…

对象分配策略

对象创建后,究竟何去何从,对象在堆中又会经历哪些过程,本篇就会详细解释对象创建后直到对象被回收的整个过程。之前博主已经写过Minor GC、Major GC、Full GC的区别,而本篇也主要根据这几个GC开展。 对象回收过程流程如下图所示: 正常的对象生存过程&a…

NetSuite Saved Search中When Ordered By Field 与 Keep Dense_Rank辨析

今朝的题目是一个隐藏的宝藏话题,Saved Search中我们极少用的一个功能--When Ordered By Field和Keep Dense_Rank。 假如你碰到一个需求,要求是:“在销售历史中按照客户别,取最早交易日期的销售金额,以识别VIP客户”。…

QML Animation动画详解

1.Animation简介 Animation类型提供了四个属性: alwaysRunToEnd:该属性接收布尔类型的参数。该属性保存动画是否运行到完成才停止。当loops属性被设置时,这个属性是最有用的,因为动画将正常播放结束,但不会重新启动。…

PMP值得考吗?

第一,PMP的价值体现 1、PMP是管理岗位必考证书。 多数企业会选择优先录用持PMP证书的管理人才,PMP成为管理岗位的必考证书。PMP在很多外企和国内中大型企业非常受重视,中石油、中海油、华为等等都会给内部员工做培训。 这些机构对项目管理…

超简单 华为OD机试用Python实现 -【无向图染色问题 or 红黑图】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲无向图染色问题 or 红黑图题目描述输入描述输出描述说明示例一输入输出示例二输入输出Python 代码实现华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog…

Js高级API

Decorator装饰器 针对属性 / 方法的装饰器 // decorator 外部可以包装一个函数,函数可以带参数function Decorator (type) {/*** 这里是真正的decorator* description: 装饰的对象的描述对象* target:装饰的属性所述类的原型,不是实例后的类。如果装饰…

Python每日一练(20230226)

1. 合并列表中字典字段 如下两个列表,需要将oldList转化为newList,去掉相同字段的字典,并且去掉的参数里面的值要相加。 oldList [{0-0: 0, 0-1: 0, 0-2: 0, 0-3: 1972}, {3-3: 203, 3-2: 0, 3-1: 0, 3-0: 0}, {0-0: 0, 0-1: 0, 0-2: 0, 0…

Git ---- IDEA集成 GitHub

Git ---- IDEA集成 GitHub1. 设置 GitHub 账号2. 分享工程到 GitHub3. push 推送本地库到远程库4. pull 拉取远程库到本地库5. clone 克隆远程库到本地1. 设置 GitHub 账号 新版的 IDEA 选择之后会自动登录,就不需要设置 token 了。 如果是老版的 IDEA 的话&…

随想录二刷Day06——链表

文章目录链表6. 删除链表的倒数第 N 个结点7. 链表相交8. 环形链表 II链表 6. 删除链表的倒数第 N 个结点 19. 删除链表的倒数第 N 个结点 思路: 用双指针的方法,fast 和 slow 之间保持距离为 n,只需要遍历一次即可完成删除任务。 为了方便…

操作系统笔记-第一章

文章目录操作系统概述1. 操作系统的概念1.1 操作系统的地位1.2 操作系统的作用1.3 操作系统的定义2. 操作系统的历史2.1 操作系统的产生2.1.1 手动操作阶段(20世纪40年代)2.1.2 批处理阶段(20世纪50年代)2.1.3 执行系统阶段&#…

aws console 使用fargate部署aws服务快速跳转前端搜索栏

测试过程中需要在大量资源之间跳转,频繁的点击不如直接搜索来的快,于是写了一个搜索框方便跳转。 前端的静态页面可以通过s3静态网站托管实现,但是由于中国区需要备案的原因,可以使用ecs fargate部署 步骤如下: 编写…

Springboot打包成jar发布

打包的方式 打包成jar包打包成war包 区别:jar包内置了tomcat、netty等服务器,更改只需要修改pom.xml的坐标即可,war不内置服务器,需要上传到服务器tomcat解压后运行 如何打包? 打包成jar,pom.xml中设置打…

Linux基础命令-df显示磁盘的使用情况

文章目录 文章目录 df 命令介绍 语法格式 基本参数 参考实例 1)以人类可读形式显示磁盘空间的使用情况 2)显示磁盘的inode信息 3)显示磁盘和文件系统类型 4)指定显示文件系统 5)显示所有磁盘空间中的内容 …

C++11多线程编程 三:锁资源管理和条件变量

C11多线程编程 一:多线程概述 C11多线程编程 二:多线程通信,同步,锁 C11多线程编程 三:锁资源管理和条件变量 3.1 手动实现RAii管理mutex资源锁自动释放 自己写的代码一般都是自己上锁,自己进行释放&…

【fly-iot飞翔物联】(2):如何从0打造自己的物联网平台,使用开源的技术栈搭建一个高性能的物联网平台,目前在设计阶段。

目录前言1,fly-iot飞翔物联2,mqtt-broker 服务3, 管理后台产品/设备设计4,数据存储目前使用mysql,消息存储到influxdb中5,规则引擎使用 ekuiper6, 总结和其他的想法前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details…

3-2 创建一个至少有两个PV组成的大小为20G的名为testvg的VG

文章目录1. 在vmware添加多块20G的硬盘,并创建分区2. 创建一个至少有两个PV组成的大小为20G的名为testvg的VG,要求PE大小为16M,而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录3. 新建用户archlinux,要求其家目录为/users/archlinu…

华为OD机试题,用 Java 解【字符串变换最小字符串】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…