【Pytorch】17. 卷积

MLP和CNN

我们之前用到的数据集是MNIST,这是一个很规整的数据集,但是实际情况中我们经常会遇到不那么clean的数据,比方说数字在网格的任何位置,或者颜色有变化。这对MLP多层感知机来说就很复杂了。这类图片对于CNN来说就很简单了

在这里插入图片描述

举个例子,这里是一个4×4的图片,如果是MLP的话,需要将图片进行flatten,然后中间有隐藏层,稠密相连,也就是dense connection,
在这里插入图片描述

仔细看NLP,就会发现有很多多余的相连,每个隐藏节点都需要与原始图像的每个像素相连吗?或许不是,将原图分成四个部分,分别用不同的颜色表示。那么每个隐藏节点可能只与这四个区域中的某个区域的像素相连,每个隐藏节点只看到原始图像的1/4。这就是局部连接 locally connected,比密集连接(dense connected)少了很多参数。

在这里插入图片描述

而且这样的方式还有一个好处,比方说下图,不管这个猫🐱出现在哪里,局部相连的方式工作量都不会太大,这慢慢的就朝着卷积层的概念走入了。

在这里插入图片描述

MLP和CNN的区别

在这里插入图片描述

过滤器和卷积层

卷积层可以保留空间信息,也就是2D的信息,而MLP只能看到1D的信息。

图像经过卷积层,卷积层(convolutional layer)有很多过滤器(filters),也叫做卷积核(convolutional kernels)

在这里插入图片描述

经过过滤的图像具有不同的外观,过滤器提取到了不同的特征
在这里插入图片描述

图像频率

我们很容易理解声音频率的含义。高频是指音调很高的声音,例如小鸟唧唧声或小提琴的声音。低频是指音调很低的声音,例如浑厚的嗓音或低音鼓。声音频率实际上是指声波的振动速度;振动通常用周期 (Hz) 衡量,高音调由高频声波组成。下图显示了低频和高频声波示例。y 轴是振幅,表示声压,对应于听到的声音响度;x 轴是时间。

在这里插入图片描述

(上图)低频声波(下图)高频声波。

高频和低频

同样,图像频率是指变化速率。那么,图像变化是什么意思呢?图像在空间里发生变化。高频图像是指强度变化很大,亮度从一个像素到另一个像素变化很快。低频图像是指亮度相对一致或变化很慢。举个例子。
在这里插入图片描述

高频和低频图像大多数图像既有高频部分,又有低频部分。在上图中,丝巾和条纹衬衫部分是高频图案;此部分非常快速地从一个亮度变成另一个亮度。在此图的更上方,我们看到天空和背景变化很缓慢,称为平滑的低频图案。

高频部分还对应于图像中的对象边缘,有助于我们分类这些对象。

高通滤波器

高通滤波器的目的就是把图片中明暗变化比较明显的部分显现出来,例如下图方框中的部分

在这里插入图片描述

经过滤波之后,这张图片就会变成右边这样,那些明暗变化不明显的部分,就变黑了,明暗变化明显的部分就显现出来了
在这里插入图片描述

接下来介绍原理,这里用来滤波的核是一个矩阵,也就是一个卷积核,以检测边缘的高通滤波器为例,3×3的矩阵,和为0,这很关键,因为这类滤波器就是计算相邻像素的差异。这样可以把那些明暗没有变化的区域的值变为0,
在这里插入图片描述

代码:用边缘滤波器对图像进行滤波

这里用到了opencv的库,OpenCV 是一个计算机视觉和机器学习软件库,包括很多常见的图像分析算法,可以帮助我们构建很多很棒的自定义计算机视觉应用。首先,它提供了一系列工具,可以帮助我们处理图像和选择感兴趣部分。

从 Github 克隆代码库,再打开 convolutional-neural-networks > conv-visualization 文件夹里的 notebook custom_filters.ipynb。你可以使用 git clone https://github.com/udacity/deep-learning-v2-pytorch.git 下载代码库

卷积操作用cv2.filter2D

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

import cv2
import numpy as np

%matplotlib inline

# Read in the image
image = mpimg.imread('data/curved_lane.jpg')

plt.imshow(image)



# Convert to grayscale for filtering
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

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



# Create a custom kernel

# 3x3 array for edge detection
sobel_y = np.array([[ -1, -2, -1], 
                   [ 0, 0, 0], 
                   [ 1, 2, 1]])

## TODO: Create and apply a Sobel x operator
sobel_x = np.array([[ -1, 0, -1], 
                   [ -2, 0, 2], 
                   [ -1, 0, 1]])

# Filter the image using filter2D, which has inputs: (grayscale image, bit-depth, kernel)  
filtered_image = cv2.filter2D(gray, -1, sobel_y)

plt.imshow(filtered_image, cmap='gray')

本系列笔记来自Udacity课程《Intro to Deep Learning with Pytorch》

全部笔记请关注微信公众号【阿肉爱学习】,在菜单栏点击“利其器”,并选择“pytorch”查看

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值