深度学习第3天:CNN卷积神经网络

简介: 深度学习第3天:CNN卷积神经网络



介绍

卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于处理和识别具有网格结构的数据,如图像和视频。CNN在计算机视觉领域取得了巨大的成功,广泛应用于图像分类、目标检测、人脸识别等任务。


CNN的主要结构

CNN的主要结构其实就三个部分,卷积层,激励层,池化层,我们接下来主要介绍这三个部分

卷积层

卷积层中核心的东西叫做滤波器,他是一个有形状的矩阵,滤波器的作用是提取图片的特征,我们可以设置滤波器的数量,不同滤波器得到的图片包含图片的不同特征

这张图显示了一个滤波器的某时刻的运作过程,最左边的是原图,中间是滤波器,最右边是结果,它会进行一个内积运算,图中也展示了这个过程

我们可以这样思考,不同的滤波器与图片进行的内积结果不同,如果是一个提取轮廓的滤波器,我们可以理解原图中的轮廓特征经过滤波后会得到保留,而背景特征等信息就会逐渐消失

激励层

其实激励层不算一个层,它是作为卷积层的激活函数,它有以下几个优点

  1. 非线性变换: ReLU 引入了非线性变换,使得 CNN 能够学习更复杂的函数和特征。线性变换的叠加仍然是线性的,而引入非线性激活函数如 ReLU 可以打破这种线性性,使得网络更有能力逼近复杂的函数。
  2. 稀疏激活性: ReLU 对于正数的输入直接输出,而对于负数的输入则输出零。这种性质使得神经网络中的许多神经元变得非常稀疏,只有在输入为正数时才被激活。这有助于减少模型的参数数量,提高计算效率,并减轻过拟合的风险。
  3. 特征的稀疏性: ReLU 可以帮助网络更加稀疏地表示学到的特征。通过将负数的激活设为零,ReLU 有助于将不重要的特征过滤掉,保留对任务有贡献的特征。
  4. 解决梯度消失问题: 相较于一些传统的激活函数(如 sigmoid 和 tanh),ReLU 更容易处理梯度消失的问题。在反向传播过程中,ReLU 的梯度对于正数输入是常数,而对于负数输入是零,这有助于在深层网络中更好地传递梯度,避免梯度消失的问题。

池化层

池化层简而言之是用来降低特征图尺寸,保留重要特征的,提取区域就是池化层的大小,主要的池化层有两种,平均池化与最大池化

平均池化

顾名思义,平均池化就是取区域中的平均值

这幅图中池化层的大小是(2x2)

最大池化

最大池化就是取区域中的最大值

这幅图中池化层的大小也是(2x2)

Kears搭建CNN

搭建代码

以下是使用Keras搭建CNN的代码

# 导入必要的库
from keras.layers import Conv2D, MaxPooling2D
from keras.models import Sequential
 
 
# 构建一个简单的卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))

先导入Keras中的库,接着构建神经网络,Conv2D构建了一个卷积层,有32个滤波器,每个滤波器的大小是(3,3),MaxPooling2D代表使用最大池化层,池化层大小为(2,2)

直观感受卷积的作用

在这一部分我们通过可视化来直观感受一下卷积神经网络的作用

1.图片导入与处理

# 加载一张彩色图像
image_path = "hou.jpg"
img = load_img(image_path, target_size=(224, 224))
img_array = img_to_array(img)
img_array = img_array / 255.0  # 归一化
 
 
# 将图片扩展维度以符合模型的输入要求
img_array = np.expand_dims(img_array, axis=0)
  • 导入图片
  • 将图片格式转化为224x224
  • 获取图片矩阵
  • 归一化, 归一化不会改变原本的图像像素比例,目的是使模型训练过程中更容易收敛
  • 拓展维度以适应Keras模型的输入要求

2.构建网络

# 构建一个简单的卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3), padding='same'))
model.add(MaxPooling2D((2, 2)))

我们这里就构建一层卷积层,池化层,正常任务中应该多一点,我们先仅了解卷积的作用

3.可视化

# 创建一个新的模型,只包含卷积层部分
convolution_model = Model(inputs=model.input, outputs=model.layers[-1].output)
 
# 获取卷积层的输出
conv_output = convolution_model.predict(img_array)
 
print(conv_output.shape)
 
# 可视化卷积层输出的多个特征图
for i in range(12):
    plt.subplot(4, 3, i+1)
    plt.imshow(conv_output[0, :, :, i], cmap='viridis')
    plt.axis('off')
plt.show()

经过卷积后,我们得到32张图片(有32个滤波器),我们展示前12张

得到以下图片

可以看到得到了图片的不同特征,边缘,纹理,光照,形状,轮廓等(经过多层卷积,这些特征会更加显著)

4.完整代码

这一部分我们搭建三层卷积层的完整代码,再看看效果

import numpy as np
from keras.models import Model
from keras.preprocessing.image import load_img, img_to_array
from keras.layers import Conv2D, MaxPooling2D
from keras.models import Sequential
import matplotlib.pyplot as plt
 
# 构建一个简单的卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
 
# 加载一张彩色图像
image_path = "hou.jpg"
img = load_img(image_path, target_size=(224, 224))
img_array = img_to_array(img)
img_array = img_array / 255.0  # 归一化
 
 
# 将图片扩展维度以符合模型的输入要求
img_array = np.expand_dims(img_array, axis=0)
 
# 创建一个新的模型,只包含卷积层部分
convolution_model = Model(inputs=model.input, outputs=model.layers[-1].output)
 
# 获取卷积层的输出
conv_output = convolution_model.predict(img_array)
 
print(conv_output.shape)
 
# 可视化卷积层输出的多个特征图
for i in range(12):
    plt.subplot(4, 3, i+1)
    plt.imshow(conv_output[0, :, :, i], cmap='viridis')
    plt.axis('off')
plt.show()

可以看到不同的特征更加的显著(无关特征逐渐消失),这样模型能更好地学习到不同的特征,以进行图像识别等任务

结语

  • 卷积神经网络主要用来处理图像,视频等,因为它有提取特征的作用
  • 一般通过改变层的数量,滤波器个数,池化层形状等参数调整神经网络的性能

感谢阅读,觉得有用的话就订阅下本专栏吧

相关文章
|
7天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
123 55
|
17天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
100 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
4天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于yolov4深度学习网络的公共场所人流密度检测系统matlab仿真,带GUI界面
本项目使用 MATLAB 2022a 进行 YOLOv4 算法仿真,实现公共场所人流密度检测。通过卷积神经网络提取图像特征,将图像划分为多个网格进行目标检测和识别,最终计算人流密度。核心程序包括图像和视频读取、处理和显示功能。仿真结果展示了算法的有效性和准确性。
50 31
|
11天前
|
机器学习/深度学习 算法 信息无障碍
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如"How are you"、"I am fine"、"I love you"等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。
|
14天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##
|
14天前
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
65 5
|
6天前
|
机器学习/深度学习 网络架构 计算机视觉
深度学习在图像识别中的应用与挑战
【10月更文挑战第21天】 本文探讨了深度学习技术在图像识别领域的应用,并分析了当前面临的主要挑战。通过研究卷积神经网络(CNN)的结构和原理,本文展示了深度学习如何提高图像识别的准确性和效率。同时,本文也讨论了数据不平衡、过拟合、计算资源限制等问题,并提出了相应的解决策略。
42 19
|
6天前
|
机器学习/深度学习 传感器 人工智能
探索深度学习在图像识别中的应用与挑战
【10月更文挑战第21天】 本文深入探讨了深度学习技术在图像识别领域的应用,并分析了当前面临的主要挑战。通过介绍卷积神经网络(CNN)的基本原理和架构设计,阐述了深度学习如何有效地从图像数据中提取特征,并在多个领域实现突破性进展。同时,文章也指出了训练深度模型时常见的过拟合问题、数据不平衡以及计算资源需求高等挑战,并提出了相应的解决策略。
45 7
|
17天前
|
机器学习/深度学习 自动驾驶 算法
深度学习在图像识别中的应用
本文将探讨深度学习技术在图像识别领域的应用。我们将介绍深度学习的基本原理,以及如何利用这些原理进行图像识别。我们将通过一个简单的代码示例来演示如何使用深度学习模型进行图像分类。最后,我们将讨论深度学习在图像识别领域的未来发展趋势和挑战。