卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于处理和识别具有网格结构的数据,如图像和视频。CNN在计算机视觉领域取得了巨大的成功,广泛应用于图像分类、目标检测、人脸识别等任务。
CNN的主要结构其实就三个部分,卷积层,激励层,池化层,我们接下来主要介绍这三个部分
卷积层中核心的东西叫做滤波器,他是一个有形状的矩阵,滤波器的作用是提取图片的特征,我们可以设置滤波器的数量,不同滤波器得到的图片包含图片的不同特征
这张图显示了一个滤波器的某时刻的运作过程,最左边的是原图,中间是滤波器,最右边是结果,它会进行一个内积运算,图中也展示了这个过程
我们可以这样思考,不同的滤波器与图片进行的内积结果不同,如果是一个提取轮廓的滤波器,我们可以理解原图中的轮廓特征经过滤波后会得到保留,而背景特征等信息就会逐渐消失
其实激励层不算一个层,它是作为卷积层的激活函数,它有以下几个优点
池化层简而言之是用来降低特征图尺寸,保留重要特征的,提取区域就是池化层的大小,主要的池化层有两种,平均池化与最大池化
平均池化
顾名思义,平均池化就是取区域中的平均值
这幅图中池化层的大小是(2x2)
最大池化
最大池化就是取区域中的最大值
这幅图中池化层的大小也是(2x2)
以下是使用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)
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()
可以看到不同的特征更加的显著(无关特征逐渐消失),这样模型能更好地学习到不同的特征,以进行图像识别等任务