【机器学习入门】人工神经网络(二)卷积和池化

本文详细介绍了深度学习中的卷积神经网络,包括卷积层的局部性和平移不变性,以及LeNET和AlexNet中的卷积与池化思想。通过实例代码展示了卷积操作的过程,比较了平均降采样和最大池化在LENET和AlexNet中的应用。
摘要由CSDN通过智能技术生成

系列文章目录

第1章 专家系统
第2章 决策树
第3章 神经元和感知机
识别手写数字——感知机
第4章 线性回归
第5章 逻辑斯蒂回归和分类
第5章 支持向量机
第6章 人工神经网络(一)



前言

李飞飞等人在2006年发起并建立了ImageNet数据集,这是一个包含上千万张图片、数千不同类别物体的数据集,处理计算机视觉任务的深度神经网络通常在则会个数据集上进行训练。Geoffrey Everest Hinton等人的AlexNet 是最早广为人知的深度神经网络模型之一。
这里重点介绍LENET、AlexNet的卷积和池化的思想。


一、卷积

神经连接的局部性

AlexNet神经网络模型由8层构成,其中,前5层是卷积层,只有后面3层是全连接层。全连接层是前馈神经网络最为一般的形式,神经元在层与层之间建立完全连接,即一层中的每个神经元都以前一层所有神经元的输出作为输入。
当处理图像等高维信息的时候,全连接层需要很多权值,因为神经元要与每个像点连接。这不利于神经元提取图像的局部信息,而提取图像局部特征是深度神经网络前几层的主要任务。最初几层神经元应该聚焦图像的局部特征,逐渐扩大单个神经元知的图像范围,逐层提高信息抽象的程度,这样,最终就可以在输出层整合整幅图像,每到一个用于图像分类或者物体检测的输出值。卷积层的出现满足了这种需求,它将神元的连接限制在局部,每个神经元只与对应位置的矩形区域内的输入神经元进行连接比如,当计算3×3的卷积时,卷积层的每个神经元仅与前一层对应位置局部的3x个神经元发生连接。

什么叫作卷积?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

平移不变性

除了局部性之外,卷积层的另外一个特征是平移不变性。图像特征本身具有平移不变性,局部特征的位置不是特征本身的内在属性。比如,无论一只猫出现在图像中的任何位置,都不影响我们认知它是一只猫。
为了实现平移不变性,卷积层中不同位置的神经元共享同一组连接权值,这组连接权值称作卷积核。比如,3×3的卷积核是一个3×3的矩阵。图像卷积操作就是用一个卷积核在图像上进行平移扫描,计算局部图像块与卷积核的“点积”,即对应位置元素乘积的和。
向量点积与向量间的余弦距离是成正比的,反映了向量之间的相似程度。图像卷积操作的结果实际上也反映了图像局部与卷积核的相似程度,与卷积核相似的局部特征就这样被提取出来。为了提取出不同的局部特征,在神经网络模型中,每个卷积层通常包含若干个不同的卷积核,每个卷积核扫描输入图像产生一个二维矩阵作为输出,不同卷积核产生的二维矩阵堆叠在一起,形成一个三维张量(tensor),构成了整个卷积层的输出,张量的每一层叫作一个通道(channel)。
在这里插入图片描述

卷积是一种常用的信号处理方法,图像的卷积操作是二维卷积运算的离散形式。一维卷积的连续形式在泛函分析中定义为两个函数的运算。一个函数f是待处理的信号(比如声波、图像等),一个函数g是卷积核,卷积(f*g)是一个新的信号(也是一个函数)。**卷积的结果相当于把函数g平移到各处,然后计算与函数f对应位置乘积的积分。**卷积运算能够在输入信号上提取出与卷积核具有高度相关性的信号。
( f ∗ g ) ( t ) = ∫ − ∞ + ∞ f ( x ) g ( t − x ) d x (f*g)(t)=\int_{-\infty }^{+ \infty } f(x)g(t-x)dx (fg)(t)=+f(x)g(tx)dx

二、卷积处理图像的效果代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :demo1 
@File    :Convolutional1.py
@IDE     :PyCharm 
@Author  :Yue
@Date    :2024-03-23 22:34 
'''


import numpy as np
import matplotlib.pyplot as plt

# 读取图像,取3个彩色通道中的一个
try:
    img = plt.imread('H:\\dog.jpg')
    if img is not None:
        plt.imshow(img)
        plt.show()
except Exception as e:
    print("在读取图像时发生错误:", e)
img = img[:,:,0]

# 准备卷积核
kernels = [
    np.array([[-1,0,-1] ,[-1,0,-1] ,[-1,0,-1]]),
    np.array([[-1,-1,-1] ,[0,0,0] ,[1,1,1]]),
    np.array([[1,-2,-2] ,[1,1,-2] ,[1,1,1]]),
    np.array([[1,1,1] ,[1,1,-2] ,[1,-2,-2]])
]

# 绘制原图像和卷积结果
for i in range(5):
    plt.subplot(1,5,i+1)
    if i == 0:
        plt.imshow(img, cmap=plt.cm.gray)
        plt.axis('off')
        continue

    # 计算卷积, 当采用 n*n的卷积核计算时
    # 在没有补齐的情况下 ,卷积核结果比原图各列 各少n-1
    # 简便起见,这里展示没有补齐的情况
    # 引入补齐后,边缘处的卷积也可以计算,卷积结果与原始尺寸相当
    kernel = kernels[i-1]
    conv = np.zeros((img.shape[0]-2, img.shape[1]-2))
    for x in range(conv.shape[1]):
        for y in range(conv.shape[0]):
            # 截取原图中对应位置 与 卷积大小相同的块
            clip = img[y:y+3 , x:x+3]
            # 图像块 与 卷积核对应元素相乘然后求和
            conv[y,x] = np.sum(clip * kernel)

    # 显示卷积结果
    plt.imshow(conv ,cmap=plt.cm.RdBu)
    plt.axis('off')
plt.show()
  1. .导入库:
    首先,代码导入了numpy和matplotlib.pyplot库,这两个库在处理图像和绘图方面非常有用。
  2. 读取图像:
    使用try-except块尝试读取位于’H:\dog.jpg’路径的图像文件。如果图像成功读取(img不为None),则使用plt.imshow()显示图像,并使用plt.show()显示图像窗口。如果读取过程中发生错误,错误信息将被打印到控制台。
  3. 提取图像的一个通道:
    由于读取的图像是彩色的,包含多个通道(通常是RGB),代码通过img = img[:,:,0]选择了第一个通道(蓝色通道),并将其转换为灰度图像。
  4. 准备卷积核:
    代码定义了一个名为kernels的列表,其中包含了四个不同的3x3卷积核。这些卷积核将用于后续的图像卷积操作。
  5. 绘制原图像和卷积结果:
    使用for循环迭代不同的卷积核,并在每次迭代中执行以下步骤:
  6. 使用plt.subplot()创建一个子图。
    如果是第一个迭代(即显示原图像),则使用plt.imshow()显示灰度图像,并关闭坐标轴。
    对于其他迭代,首先创建一个全零的数组conv,该数组的大小比原图像小,因为卷积核的大小是3x3。
    然后,代码通过两个嵌套的for循环遍历conv数组的每个元素,并使用原图像中相应的3x3区域与当前卷积核进行卷积操作。卷积操作是通过元素乘法和求和来完成的。
    最后,卷积完成后,使用plt.imshow(conv, cmap=plt.cm.RdBu)显示卷积结果。这里,cmap=plt.cm.RdBu参数将颜色映射设置为RdBu(红色到蓝色),这是一种常用于显示正负值的颜色映射。plt.axis(‘off’)关闭了坐标轴的显示。
  7. 显示所有图像:
    在循环结束后,调用plt.show()来显示所有子图。这将创建一个窗口,其中包含原始图像和每个卷积核处理后的图像。

结果如下图所示,使用红蓝色谱显示卷积结果,深红色和深蓝色分别表示绝对值较大的负值或正值,绝对值接近0颜色较浅。卷积结果的深色部分显示出了与卷积核数值分布一致的方向性:
在这里插入图片描述
上面的代码里需要重点理解这一部分,是对卷积操作的计算(这里用一个简单的例子就可以推算出来,img和conv之间的索引关系):
在这里插入图片描述

二、池化

池化层的作用

图像信号经过卷积后,尺寸不会发生明显缩小。然而,我们需要将信息不断汇聚到更少的神经元,这样一方面能够使单个神经元感知更大的范围,另一方面也可以提取更加抽象的图像特征。
池化层可以帮助我们对卷积层得到的信息进行整合和压缩。经过一个 c × c c\times c c×c的池化层,就相当于把每 c × c c\times c c×c个像素点压缩成1个像素点,信号数量就压缩到了 1 / ( c × c ) 1/(c\times c) 1/(c×c)
压缩方法通常是选取最大值,因此也叫作Max Pooling。经过若干组卷积、池化、卷积、池化这样的交替处理,我们就可以把图像信息逐渐抽象为维度较小的信号,然后用全连接层产生图像分类、物体识别、位置检测的结果。这个过程与生物视觉神经系统有很多相似之处。

平均降采样与最大池化

LENET中采用平均降采样,而AlexNet中采用的最大池化的方法,来看一下二者的区别。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述


总结

本节介绍了卷积和池化的概念,介绍了LeNet与AlexNet,AlexNet的改进。通过一个简单的图像处理,演示了卷积的代码。

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值