卷积代码实现

article/2025/10/7 3:37:09

卷积在pytorch中有两种方式,一种是torch.Conv2d(),一种是torch.nn.functional.conv2d(),这两种形式本质都是使用一个卷积操作,下面举例来说明一下这两种卷积方式

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
%matplotlib inline
im=Image.open('./cat.png').convert('L') #读入一张灰度的图片
im=np.array(im,dtype='float32') #将其转换为一个矩阵

 

#将图片矩阵转化为 pytorch torch,并适配卷积输入的要求
im=torch.from_numpy(im.reshape((1,1,im.shape[0],im.shape[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()#将输出转换为图片的格式

下面我们可视化边缘检测之后的结果

#使用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')

 

可以看到两种形式能够得到相同的效果,不同的地方相信你也看到了,使用 `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]))

before max pool, image shape: 224 x 224

after max pool, image shape: 112 x 112

可以看到图片的大小减小了一半,那么图片是不是变了呢?我们可以可视化一下

可以看到图片几乎没有变化,说明池化层只是减小了图片的尺寸,并不会影响图片的内容

# 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')

 before max pool, image shape: 224 x 224

after max pool, image shape: 112 x 1

12

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


http://chatgpt.dhexx.cn/article/0ZlYaCSO.shtml

相关文章

最通俗的语言讲解卷积码、码树图、状态图以及维特比译码

什么是卷积码? 卷积码是由伊利亚斯发明的一种非分组码,它更加倾向于纠错,对于实际的性能优于分组码,运算较为简单。 将卷积码记为(n,k,N),码率定义为k/n n是n个比特 k是k个信息位 N是N个信息段 卷积码编码器 组成&#xff1a…

卷积,卷积神经网络,图卷积神经网络中的“卷积”如何理解?

[] 1. 对卷积最朴素的理解 首先我们在教材上看到的卷积公式是 ∫ f ( τ ) g ( x − τ ) d τ \int f(\tau)g(x-\tau)d\tau ∫f(τ)g(x−τ)dτ。对于这个公式的理解,网上有很多讲解视频,都是用一些具体的例子来帮助我们理解卷积的过程。推荐b站上的视…

实现卷积的几种代码方式

目录 摘要 卷积(convolution) 1、pytorch实现 2、对input展开矩阵相乘 3、对kernel展开以及矩阵相乘 转置卷积 1、API实现 2、对kernel矩阵转置矩阵相乘 总结 摘要 卷积的基本元素有着input size、kernel size、stride、padding、group以及dil…

卷积卷积神经网络

文章目录 一、关于卷积(convolution)的直观感受二、卷积在不同领域的应用三、卷积神经网络(CNN)的诞生四、卷积神经网络(CNN)(1)为什么需要卷积层(2)池化&…

MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)

卷积码原理介绍 1.基本概念 首先卷积码是一种纠错码,让我们先从大格局出发,去认识卷积码。如图1所示我是先从通信原理书上了解了卷积码的概念,再结合网上部分资料,勉强搞懂,感觉主要需要掌握卷积码编码器、状态图、网…

通信原理学习笔记4:信道编码、分组码、卷积码、现代信道编码(Turbo码、LDPC码、Polar码)

信道编码 / 前向纠错码FEC 思想是在数据中增加冗余信息,即校验码元 / 监督码元,从而检错、纠错 信道编码的优劣评判 首先,最基本的是要追求低差错率 实现纠错很简单,只要多添加冗余信息就好;但实际中,我…

韩信点兵算法:

韩信点兵问题:韩信点兵不足百人,3人一行排列多一人,7人一行排列少两人,5人一行正好, 输出韩信究竟点了多少兵。 使用 math 类的DivRem 方法进行运算。 static void Main(string[] args){///韩信点兵不足百人&#xff…

韩信点兵

韩信点兵&#xff1a; 韩信带1500名兵士打仗&#xff0c;战死四五百人&#xff0c;站3人一排&#xff0c;多出2人&#xff1b;站5人一排&#xff0c;多出4人&#xff1b;站7人一排&#xff0c;多出6人。韩信马上说出人数&#xff1a;1049。 代码实现&#xff1a; <span styl…

韩信点兵(python)

韩信点兵 全部士兵按每行8人站立&#xff0c;剩余7人 全部士兵按每行7人站立&#xff0c;剩余6人 问题&#xff1a;已知每一营士兵人数在1000~2000之间&#xff0c;如何利用循环判断表示出代码逻辑 for num in range (1000,2000):if num % 87 and num %76 and num%65\and num%5…

经典算法--韩信点兵

韩信点兵是一道古代的数学题&#xff0c;题意&#xff1a;韩信点兵不足百人&#xff0c;三人一排多1人&#xff0c;七人一排少2人&#xff0c;五人一排正好。问韩信带兵多少&#xff1f; /*** 韩信点兵&#xff1a;* 韩信带兵不足百人&#xff0c;3人一排多1人&#xff0c;7人一…

枚举算法:韩信点兵。

韩信点兵。韩信在点兵的时候&#xff0c;为了知道有多少名士兵&#xff0c;同时又能保住军事机密&#xff0c;便让士兵排队报数。 按从1至5报数&#xff0c;最末一个士兵报的数为1。 再按从1至6报数&#xff0c;最末一个士兵报的数为5。 再按1至7报数&#xff0c;最末一个士兵报…

java工作流activity_activity 工作流学习(一)

启动流程实例 什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系) 为了演示:在流程图中指定办理人是谁,现在是写死的,表示只能张三能提交请假申请。后面会讲解如何动态指定。 //根据流程定义的Id启动一个流程实…

工作流:一文让你学会使用flowable工作流

1.请假流程图 下图是 一个请假申请的简单流程图 &#xff08;1&#xff09;申请人通过发起流程进行请假申请&#xff0c;给经理发送一个待审批事项&#xff1b; &#xff08;2&#xff09;经理在待办列表选择事项&#xff0c;进行审批&#xff0c;approved同意或者rejected驳回…

jeesite工作流使用

问题&#xff1a;jeesite工作流如何使用&#xff1f; 背景&#xff1a;公司没人熟悉工作流&#xff0c;现在要上线办公系统&#xff0c;请假&#xff0c;加班&#xff0c;报销&#xff0c;预审批&#xff0c;用印&#xff0c;付款等工作流要写&#xff0c;之前有简单版本&…

工作流的大致开发流程

前段时间公司在做一个oa的项目&#xff0c;用到了flowable工作流&#xff0c;刚开始的时候还在纠结于是用activity还是flowable&#xff0c;后来查了相关资料发现flowable的作者之前就是开发activity的作者&#xff0c;只不过后来自己出去又搞了一套就叫做flowable&#xff0c;…

flowable工作流所有业务概念

1.什么是工作流审批 根据本人的理解&#xff0c;就是审批流程管理。 2.什么是flowable 1.官方解释 官方解释如下&#xff1a; Flowable 项目提供了一套核心的开源业务流程引擎&#xff0c;这些引擎紧凑且高效。它们为开发人员、系统管理员和业务用户提供工作流和业务流程管…

微服务与工作流

本文主要想谈一谈工作流在微服务系统中的使用以及工作流能够为微服务系统带来的好处。 通过查找资料可得&#xff0c;微服务的编排主要分为两种形式&#xff0c;一种是“choreography”&#xff0c;有人将其翻译成微服务的编排&#xff1b;另一种是“orchestration”,有人将其翻…

Camunda工作流引擎入门

文档集合 1、camunda文档&#xff1a;https://docs.camunda.org/get-started/quick-start/ 2、camunda资源下载&#xff1a;https://camunda.com/download/ 3、camunda示例github仓库&#xff1a;https://github.com/camunda/camunda-bpm-examples 4、camunda 代码仓库&…

工作流设计详解

工作流 概念&#xff1a; workflow流程性通知和审批控制&#xff0c;业务流程中、发送、提供附加信息或进行附加业务处理&#xff0c;两个或两个以上的人为共同目标&#xff0c;连续以并行或串行的方式完成某一业务。 工作流 设计&#xff1a; 按照业务规划流程图&#xff0…

什么是工作流?为什么程序员要用它?

每一个程序员&#xff0c;在接触到工作流的时候&#xff0c;都会有这么一个疑问——我用一般的方法可以实现&#xff0c;为什么还要用工作流&#xff1f; 我曾经也问过这个问题&#xff0c;不过现在稍微有点明白了。别着急要答案&#xff0c;看过下面的例子&#xff0c;或许你…