深度学习,一种数据重于算法的思维转换

本文最后更新于:2022年7月26日 下午

深度学习所处的知识象限

深度学习:对于可统计的、但不可推理的(即象限Ⅲ),可通过神经网络这种特定的机器学习方法,达到性能提升的目的

image-20220210123457396

深度学习在本质上,就是层数非常多的人工神经网络,深度学习属于统计学习的范畴,统计机器学习的对象,其实就是数据。

简单来说,深度学习就是一种包含多个隐含层(层数越多即为越深)的多层感知机,深度学习将“特征提取”和“分类”合二为一,即达成所谓的端到端。

深度学习的感性认知

把初恋期当作输入,磨合期当中调参,稳定期当作输出

书画琴棋诗酒花,
当年件件不离他。
而今七事都更变,
柴米油盐酱醋茶。

这首诗说的是在过日子的洗礼中,各种生活琐事的变迁,恋爱是过日子的一部分,双方需要不断磨合。

image-20220210123914573

调参:磨合。磨合中的权重取舍,就相当于深度学习中隐含层的参数调整

深度学习发展简史

无法承受参数之重的全连接前馈网络

image-20220210124635185

1968年,大卫·休伯尔在实验中发现两个有趣的现象

image-20220210124829159

  1. 神经元局部感知

  2. 动物大脑皮层是分级、分层处理信息的

image-20220210124937424

它对人工智能的启发意义在于:

  1. 不必考虑使用神经元的”全连接“模式
  2. 神经网络拟合的复杂函数可分级、分层次来完成

1980年,日本学者福岛邦彦:神经认知机,是一个使用无监督学习训练的神经网络模型,也是卷积神经网络的雏形

image-20220210125503603

1989年,Yann LeCun:利用BP算法重大改进 卷积神经网络

LeCun把自己研究的网络命名为LeNet,主要用于字符识别

image-20220210130039836

20世纪90年代,俄罗斯统计学家V.Vapnik提出支持向量机(SVM)

2006年,深度学习的开山之作

image-20220210130338057

两个重要结论:

  1. 多层的神经网络具有优秀的特征学习能力,能够学习到数据更本质的特征
  2. 多层神经网络的初始化参数可通过逐层预训练获得

卷积神经网络

所谓卷积是指一个函数和另一个函数在某个维度上的“叠加累计”作用。

深度学习”层“的内涵

深度学习中的所谓“层”:就是对数据实施某种加工的过程。我们可以把神经网络层理解为数据过滤器。数据从输入端进来,经过转换,以另一种更有用的模式出去,这个过程叫做数据蒸馏(data distillation)

将复杂高维数据展平的隐喻

图像处理中的卷积

计算机看到的是数字矩阵

image-20220210134419017

卷积运算

1D卷积运算

image-20220210134655334

二维图像数据的卷积

image-20220210134735340

3D卷积运算

image-20220210134808763

卷积在传统图像处理中的应用

image-20220210134842290

用python实现对图像的卷积(滤波)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import matplotlib.pyplot as plt
import pylab
import cv2
import numpy as np

img = plt.imread("dog.jpg") #在这里读取图片

plt.imshow(img) #显示读取的图片
pylab.show()

fil = np.array([[ -1,-1, 0], #这个是设置的滤波,也就是卷积核
[ -1, 0, 1],
[ 0, 1, 1]])

res = cv2.filter2D(img,-1,fil) #使用opencv的卷积函数

plt.imshow(res) #显示卷积后的图片
# plt.imsave("dog.jpg",res)
pylab.show()

image-20220210144934290

卷积神经网络的结构

image-20220210150601321

image-20220210150540452

卷积层

卷积的目的:作为特征提取器

用卷积来代替全连接

卷积层是构建卷积神经网络的核心层,它产生了网络中大部分的计算量。注意是计算量而不是参数量。

卷积层的作用:

  1. 滤波器的作用或者说是卷积的作用。卷积层的参数是有一些可学习的滤波器集合构成的。每个滤波器在空间上(宽度和高度)都比较小,但是深度和输入数据一致。直观地来说,网络会让滤波器学习到当它看到某些类型的视觉特征时就激活,具体的视觉特征可能是某些方位上的边界,或者在第一层上某些颜色的斑点,甚至可以是网络更高层上的蜂巢状或者车轮状图案。

  2. 可以被看做是神经元的一个输出。神经元只观察输入数据中的一小部分,并且和空间上左右两边的所有神经元共享参数(因为这些数字都是使用同一个滤波器得到的结果)。

  3. 降低参数的数量。这个由于卷积具有“权值共享”这样的特性,可以降低参数数量,达到降低计算开销,防止由于参数过多而造成过拟合。

感受野(重点理解):

在处理图像这样的高维度输入时,让每个神经元都与前一层中的所有神经元进行全连接是不现实的。相反,我们让每个神经元只与输入数据的一个局部区域连接。该连接的空间大小叫做神经元的感受野(receptive field),它的尺寸是一个超参数(其实就是滤波器的空间尺寸)。在深度方向上,这个连接的大小总是和输入量的深度相等。需要再次强调的是,我们对待空间维度(宽和高)与深度维度是不同的:连接在空间(宽高)上是局部的,但是在深度上总是和输入数据的深度一致,这一点会在下面举例具体说明。

preview

在图 2 中展现的卷积神经网络的一部分,其中的红色为输入数据,假设输入数据体尺寸为[32x32x3](比如CIFAR-10的RGB图像),如果感受野(或滤波器尺寸)是5x5,那么卷积层中的每个神经元会有输入数据体中[5x5x3]区域的权重,共5x5x3=75个权重(还要加一个偏差参数)。注意这个连接在深度维度上的大小必须为3,和输入数据体的深度一致。其中还有一点需要注意,对应一个感受野有75个权重,这75个权重是通过学习进行更新的,所以很大程度上这些权值之间是不相等(也就对于同一个卷积核,它对于与它连接的输入的每一层的权重都是独特的,不是同样的权重重复输入层层数那么多次就可以的)。在这里相当于前面的每一个层对应一个传统意义上的卷积模板,每一层与自己卷积模板做完卷积之后,再将各个层的结果加起来,再加上偏置,注意是一个偏置,无论输入输入数据是多少层,一个卷积核就对应一个偏置。

激活层

激活层:非线性变换 –> 提升神经网络的表达能力

image-20220210152721404

池化层

通常在连续的卷积层之间会周期性地插入一个池化层。它的作用是逐渐降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。

image-20220210152926415

池化带来的好处:平移不变性(Invariance)

全连接层

全连接层:为分类服务

image-20220210153059331

CNN的反向传播(BP)过程:

image-20220210153306379

神经网络的过拟合

过拟合是指,模型过于表征训练数据,导致在其他数据集上表现下降

image-20220210153403043

image-20220210153458273

基于卷积神经网络的手写数字识别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue May 12 12:56:10 2020
参考代码:https://www.tensorflow.org/tutorials/quickstart/advanced
"""
# (1)读入数据
import os
import tensorflow as tf
import keras as K
# mnist = tf.keras.datasets.mnist
class DataSource():
def __init__(self):
# mnist数据集存储的位置,如何不存在将自动下载
data_path = os.path.abspath(os.path.dirname(__file__)) + '/data/mnist.npz'
# (x_train, y_train), (x_test, y_test) = datasets.mnist.load_data(path=data_path)
(x_train, y_train), (x_test, y_test) = K.datasets.mnist.load_data()
# 6万张训练图片,1万张测试图片
# train_images = train_images.reshape((60000, 28, 28, 1))
# test_images = test_images.reshape((10000, 28, 28, 1))
x_train = x_train[..., tf.newaxis]
x_test = x_test[..., tf.newaxis]
# 像素值映射到 0 - 1 之间
x_train, x_test = x_train / 255.0, x_test / 255.0

self.train_images, self.train_labels = x_train, y_train
self.test_images, self.test_labels = x_test, y_test

data = DataSource()

# (2)搭建模型
import tensorflow as tf
# from tensorflow.keras import datasets, layers, models
from tensorflow.python.keras import layers, models

class CNN():
def __init__(self):
model = models.Sequential()
# 第1层卷积,卷积核大小为3*3,32个,28*28为待训练图片的大小
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
# 第2层卷积,卷积核大小为3*3,64个
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 第3层卷积,卷积核大小为3*3,64个
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# 增加一个平坦层,拉平数据
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

model.summary()

self.model = model

cnn = CNN()

image-20220210155057781

image-20220210155148881

参考资料

人工智能极简入门-张玉宏 第七章

图像处理中滤波器(卷积核) - Liu_xiang - 博客园 (cnblogs.com)

用python实现对图像的卷积(滤波) - swuxyj - 博客园 (cnblogs.com)

卷积神经网络(CNN)详解 - 知乎 (zhihu.com)