前言
在卷积神经网络中不可避免的就是卷积层了,卷积层作为卷积神经网络中及其重要的一环,在本章中将着重介绍卷积层以及卷积图像的可视化。
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
程序流程:
- 读取图像
- 转为灰度图
- 转为Numpy
- 将数组转化为张量
- 构造一个卷积结构
- 对灰度图进行卷积操作
- 对卷积图像进行压缩
原图:
卷积后图
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)