动手实现卷积层以及卷积图像的可视化

简介: 动手实现卷积层以及卷积图像的可视化

前言


 在卷积神经网络中不可避免的就是卷积层了,卷积层作为卷积神经网络中及其重要的一环,在本章中将着重介绍卷积层以及卷积图像的可视化。



What is Conv


  卷积可以看作是输入核卷积核之间的内积运算,是两个实值函数之间的一种数学运算。在卷积运算中,通常使用卷积核将输入数据进行运算得到输出作为特征映射。


大家详细的具体运算法则可参考大学数学教材中介绍卷积一章中内容,这里不再重复叙述。


  卷积神经网络中通过输入卷积核来进行卷积操作,使输入单元(图像或特征映射)和输出单元(特征映射)之间的连接是稀疏的,这样能够减少需要训练参数的数量,从而加快网络的计算速度。


  卷积操作的参数共享特点,主要体现在模型中同-组参数可以被多 个函数或操作共同使用。在卷积神经网络中,针对不同的输入会利用同样的卷积核来获得相应的输出。这种参数共享的特点是只需要训练一个 参数集,而不需对每个位置学习一个参数集合。


由于卷积核尺寸可以远远小于输人尺寸,即减少需要学习的参数的数量,并且针对每个卷积层可以使用多个卷积核获取输人的特征映射,对数据(尤其是图像)具有很强的特征提取和表示能力,并且在卷积运算之后,使得卷积神经网络结构对输人的图像具有平移不变的性质。




How to use Conv


   在Pytorch中针对不同场景,分别有不同的卷积类,在torch.nn模块中供大家调用。


功能
torch.nn.Conv1d() 对输入的一维信号进行1D卷积
torch.nn.Conv2d() 对输入的二维信号进行2D卷积
torch.nn.Conv3d() 对输入的三维信号进行3D卷积
torch.nn.ConvTranspose1d() 对输入的一维信号进行1D转置卷积
torch.nn.ConvTranspose2d() 对输入的一维信号进行2D转置卷积
torch.nn.ConvTranspose3d() 对输入的一维信号进行3D转置卷积

  


处理图像中常用的为torch.nn.Conv2d(),内部参数排列注释如下:


in_channels: 输入图像的通道数(整数)


out_channels: 输出特征映射的数量


kernel_size: 卷积核大小


stride: 卷积的步长(默认为1)


padding: 输入两边填充(默认为0,可更改)


dilation: 步幅(该参数可调控卷积大小,默认为1)


groups: 输入到输出的阻塞连接数


bias: True:添加偏置;否则不添加\




Example


程序流程:


  1. 读取图像


  1. 转为灰度图


  1. 转为Numpy


  1. 将数组转化为张量


  1. 构造一个卷积结构


  1. 对灰度图进行卷积操作


  1. 对卷积图像进行压缩



原图:

image.png卷积后图

image.png

image.png



Demo


import cv2
import numpy
import numpy as np
import torch
import torch.nn as nn
MyImage = cv2.imread("3.jpg")
MyImage_gray = cv2.cvtColor(MyImage, cv2.COLOR_BGR2GRAY)
MyImage_gray_np = np.array(MyImage_gray, dtype=np.float32)
image_h, image_w = MyImage_gray_np.shape
MyImage_gray_re = MyImage_gray.reshape(1, 1, image_h, image_w)
MyImage_gray_t = torch.tensor(MyImage_gray_re, dtype=torch.float32)
print(MyImage_gray_t.shape)
kersize = 5
ker = torch.ones(kersize, kersize, dtype=torch.float32) * -1
ker[2, 2] = 24
ker = ker.reshape((1, 1, kersize, kersize))
conv2d = nn.Conv2d(1, 2, (kersize, kersize), bias=False)
conv2d.weight.data[0] = ker
image_conv2d_out = conv2d(MyImage_gray_t)
image_conv2d_out_img = image_conv2d_out.data.squeeze()
out_img = numpy.array(image_conv2d_out_img, dtype=np.float32)
cv2.imshow("out_img", out_img[1])
cv2.waitKey(0)





相关文章
|
7月前
|
机器学习/深度学习 存储 自然语言处理
卷积神经元网络CNN基础
卷积神经元网络CNN基础
74 1
|
7月前
|
机器学习/深度学习 存储 TensorFlow
【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)
【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)
225 0
|
2月前
|
机器学习/深度学习 PyTorch API
深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)
深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)
|
6月前
|
机器学习/深度学习
【从零开始学习深度学习】21. 卷积神经网络(CNN)之二维卷积层原理介绍、如何用卷积层检测物体边缘
【从零开始学习深度学习】21. 卷积神经网络(CNN)之二维卷积层原理介绍、如何用卷积层检测物体边缘
|
机器学习/深度学习 算法
什么是卷积?(含如何实现卷积源码)
什么是卷积?(卷积简单实现源码)
126 0
什么是卷积?(含如何实现卷积源码)
|
机器学习/深度学习 编解码 数据可视化
深度学习基础入门篇9.1:卷积之标准卷积:卷积核/特征图/卷积计算、填充、感受视野、多通道输入输出、卷积优势和应用案例讲解
深度学习基础入门篇9.1:卷积之标准卷积:卷积核/特征图/卷积计算、填充、感受视野、多通道输入输出、卷积优势和应用案例讲解
深度学习基础入门篇9.1:卷积之标准卷积:卷积核/特征图/卷积计算、填充、感受视野、多通道输入输出、卷积优势和应用案例讲解
|
机器学习/深度学习 编解码 数据可视化
深度学习基础入门篇[9.2]:卷积之1*1 卷积(残差网络)、2D/3D卷积、转置卷积数学推导、应用实例
深度学习基础入门篇[9.2]:卷积之1*1 卷积(残差网络)、2D/3D卷积、转置卷积数学推导、应用实例
深度学习基础入门篇[9.2]:卷积之1*1 卷积(残差网络)、2D/3D卷积、转置卷积数学推导、应用实例
|
机器学习/深度学习 存储 编解码
深度学习基础入门篇[9.3]:卷积算子:空洞卷积、分组卷积、可分离卷积、可变性卷积等详细讲解以及应用场景和应用实例剖析
深度学习基础入门篇[9.3]:卷积算子:空洞卷积、分组卷积、可分离卷积、可变性卷积等详细讲解以及应用场景和应用实例剖析
209 0
|
机器学习/深度学习 编解码 算法
【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积
PNASNet模型是Google公司的AutoML架构自动搜索所产生的模型,它使用渐进式网络架构搜索技术,并通过迭代自学习的方式,来寻找最优网络结构。即用机器来设计机器学习算法,使得它能够更好地服务于用户提供的数据。该模型在ImageNet数据集上Top-1准确率达到82.9%,Top-5准确率达到96。2%,是目前最好的图片分类模型之一。
212 0
|
机器学习/深度学习 PyTorch 算法框架/工具
【Pytorch神经网络实战案例】09 使用卷积提取图片的轮廓信息(手动模拟Sobel算子)
【Pytorch神经网络实战案例】09 使用卷积提取图片的轮廓信息(手动模拟Sobel算子)
228 0