14 深度学习-卷积

1.简述人工智能、机器学习和深度学习三者的联系与区别。

 

人工智能

机器学习

深度学习

联系

人工智能是最早出现的,也是最大、最外侧的同心圆;其次是机器学习,稍晚一点;最内侧,是深度学习,也是当今人工智能大爆炸的核心驱动。

人工智能>机器学习>深度学习

区别

 为机器赋予人的智能,是目的,是结果,适用图像分类、人脸识别

 一种实现人工智能的方法,应用领域是计算机视觉

 一种实现机器学习的技术,适合处理大数据

2. 全连接神经网络与卷积神经网络的联系与区别。

 

全连接神经网络

卷积神经网络

含义

全连接神经网络(DNN)是最朴素的神经网络,它的网络参数最多,计算量最大。

卷积神经网络是一种深度前馈人工神经网络,已成功地应用于图像识别。

联系

结构相似,输入输出以及训练的流程也基本一致。

区别

每层隐藏层的每个神经元都和相邻隐藏层的所有神经元相连接。

不是全连接的,隐藏层的每个神经元只是和上一个隐藏层某一小片相连。

卷积神经网络可以更好的处理图像数据。

 3.理解卷积计算。

以digit0为例,进行手工演算。

from sklearn.datasets import load_digits #小数据集8*8

digits = load_digits()

0 0 5 13 9 1 0 0
0 0 13 15 10 15 5 0
0 3 15 2 0 11 8 0
0 4 12 0 0 8 8 0
0 5 8 0 0 9 8 0
0 4 11 0 1 12 7 0
0 2 14 5 10 12 0 0
0 0 6 13 10 0 0 0

(参考:https://blog.csdn.net/leviopku/article/details/80327478

通常用外部api进行卷积的时候,会面临mode选择,full、same、valid,这三种不同模式是对卷积核移动范围的不同限制。

扫描图片时划过像素的个数影响卷积后长度,默认1个像素。

公式:新图片尺寸=[(原图片尺寸-卷积核尺寸+2*像素数)/步长]+1(先取整数再+1)

可以指定步长(精细度) 

已知原图片尺寸为8*8,设卷积核尺寸是3x3,步长是1。

卷积核为:

(1)Full

 

橙色部分为image, 蓝色部分为filter。full模式的意思是,从filter和image刚相交开始做卷积,白色部分为填0。

结果:8*8->10*10 变大

(2)Same:保留边界处的卷积结果

 

当filter的中心(K)与image的边角重合时,开始做卷积运算,可见filter的运动范围比full模式小了一圈。

注意:这里的same还有一个意思,卷积之后输出的feature map尺寸保持不变(相对于输入图片)。当然,same模式不代表完全输入输出尺寸一样,也跟卷积核的步长有关系。

same模式也是最常见的模式,因为这种模式可以在前向传播的过程中让特征图的大小保持不变,调参师不需要精准计算其尺寸变化(因为尺寸根本就没变化)。
结果:8*8->8*8 不变

(3)Valid:只进行有效的卷积,对边界数据不处理

 

 当filter全部在image里面的时候,进行卷积运算,可见filter的移动范围较same更小了。

结果:8*8->6*6 变小

4.理解卷积如何提取图像特征。

读取一个图像;

以下矩阵为卷积核进行卷积操作;

显示卷积之后的图像,观察提取到什么特征。

卷积API

scipy.signal.convolve2d

tf.keras.layers.Conv2D

 1 from PIL import Image
 2 import numpy as np
 3 from scipy.signal import convolve2d
 4 import matplotlib.pyplot as plt
 5 
 6 # 读取一个图像
 7 I = Image.open(r'C:UserslenovoPicturesSaved Pictures3.jpg')
 8 L = I.convert('L')
 9 
10 img=np.array(I)  # img原图 
11 imgg=np.array(L) # imgg灰度图
12 
13 # 以下矩阵为卷积核进行卷积操作
14 k1=np.array([[1,0,-1],[1,0,-1],[1,0,-1]])       # 垂直边缘检测
15 k2=np.array([[1,1,1],[0,0,0],[-1,-1,-1]])       # 水平边缘检测
16 k3=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])  # 检测中间
17 
18 # imgg:二维数组,k1:卷积核,boundary:边界填充方式,mode卷积类型
19 img1 = convolve2d(imgg,k1,boundary='symm',mode='same')
20 img2 = convolve2d(imgg,k2,boundary='symm',mode='same')
21 img3 = convolve2d(imgg,k3,boundary='symm',mode='same')
22 
23 # 显示卷积之后的图像
24 plt.matshow(img)   
25 plt.matshow(imgg)  
26 plt.matshow(img1)  
27 plt.matshow(img2)  
28 plt.matshow(img3)  

原图


灰度图

垂直边缘检测                                       水平边缘检测                                        中心边缘检测

垂直边缘检测:可以看出图片中物体的垂直方向边界特征被提取出来,而其他的特征被弱化了。

水平边缘检测:可以看出图片中物体的水平方向边界特征被提取出来,而其他的特征被弱化了。

中心边缘检测:可以看出图片中物体的中心边界特征被提取出来,而四周边界的特征被弱化了。

5. 安装Tensorflow,keras

参考:https://blog.csdn.net/u011119817/article/details/88309256

用conda安装可以判断所有安装包的版本间的兼容性。

6. 设计手写数字识别模型结构,注意数据维度的变化。

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPool2D

model = tf.keras.Sequential()

model.add(Conv2D(…))

model.add(MaxPool2D(…))

...

#可以上传手动演算的每层数据结构的变化过程。model.summary() 

 1 # 导入相关包
 2 # sequential设计层数
 3 from tensorflow.keras.models import Sequential
 4 from tensorflow.keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPool2D
 5 
 6 #建立模型
 7 model=Sequential()
 8 
 9 ks=(3,3)   # 卷积核大小
10 ips=(16,16,1)
11 
12 #一层卷积
13 model.add(
14     Conv2D(filters=32,          # 卷积核的个数
15            kernel_size=ks,     # 卷积核大小
16            padding='same',     # 保证卷积核大小,不够不算
17            input_shape=ips,    
18            activation='relu')) # activation: 激活函数,'relu','sigmoid'等
19 
20 #池化层1
21 model.add(MaxPool2D(pool_size=(2,2)))
22 model.add(Dropout(0.25))
23 
24 #二层卷积
25 model.add(
26     Conv2D(filters=64,kernel_size=ks,padding='same',activation='relu'))
27 #池化层2
28 model.add(MaxPool2D(pool_size=(2,2)))
29 model.add(Dropout(0.25))
30 
31 #三层卷积
32 model.add(
33     Conv2D(filters=128,kernel_size=ks,padding='same',activation='relu'))
34 #池化层3
35 model.add(MaxPool2D(pool_size=(2,2)))
36 model.add(Dropout(0.25))
37 
38 
39 model.add(Flatten()) #平坦层
40 model.add(Dense(128,activation='relu')) #dense全连接层
41 model.add(Dropout(0.25))
42 model.add(Dense(10,activation='softmax')) #激活函数  softmax分类
43 
44 model.summary()

参考:

https://www.jianshu.com/p/afe485aa08ce

https://blog.csdn.net/junjun150013652/article/details/82217571

原文地址:https://www.cnblogs.com/linyanli/p/13042514.html