zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用Enablebuffering多次读取Asp Net Core 请求体
    Windows Forms和WPF在Net Core 3.0框架下并不会支持跨平台
    .Net Core IIS下无Log4Net日志输出,命令行下却有(dotnet运行)
    ElasticSearch7.x Bool查询Java API
    ElasticSearch7.X Java client
    Spark RDD转DataFrame
    spark写mysql
    spark读取mysql
    Spark2.x写Hbase1-2.x
    Spark2.x读Hbase1-2.x
  • 原文地址:https://www.cnblogs.com/linyanli/p/13042514.html
Copyright © 2011-2022 走看看