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”查看