卷积神经网络(CNN)是一种深度学习算法,专为处理图像和视频而设计。它能够接收图像作为输入,提取并学习图像的特征,并基于这些特征对图像进行分类。这种算法的灵感来自于人类大脑中负责处理外界视觉信息的部分——视觉皮层。视觉皮层由多个层次组成,每个层次通过提取图像或视觉信息中的信息来执行特定的功能。最终,所有层次收集到的信息结合起来,用于解释或对图像或视觉进行分类。
与此类似,CNN利用各种滤波器,每个滤波器从图像中提取特定信息,如边缘和不同形状(垂直、水平、圆形)。这些提取的特征结合起来,有助于识别图像。
可能有人会问:为什么不能使用人工神经网络(ANN)来实现同样的目的?这是因为ANN在处理图像时存在一些缺点:
CNN模型的工作分为两个步骤:特征提取和分类。特征提取阶段,各种滤波器和层次应用于图像以提取信息和特征。一旦这个过程完成,提取的数据就移动到下一个阶段,即分类,根据问题的靶变量对数据进行分类。
典型的CNN模型结构如下:
顾名思义,这是输入图像,可以是灰度或RGB。每张图像由像素组成,像素值范围从0到255。需要将它们归一化,即转换为0到1之间的范围,然后再将其传递给模型。
卷积层将滤波器应用于输入图像以提取或检测其特征。滤波器多次处理图像,创建一个特征图,有助于对输入图像进行分类。
在上述图像中,有一个6*6大小的输入图像,并对其应用了一个3*3的滤波器来检测某些特征。在这个例子中,只应用了一个滤波器,但在实际应用中,会应用许多这样的滤波器来从图像中提取信息。
池化层紧随卷积层之后,减少了特征图的维度,有助于保留输入图像的重要信息和特征,同时也减少了计算时间。
到目前为止,已经完成了特征提取步骤,现在来进行分类部分。全连接层(如在ANN中使用的)用于将输入图像分类为标签。这一层将从前几步(即卷积层和池化层)提取的信息连接到输出层,并最终将输入分类为所需的标签。
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import MaxPool2D
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Dense
# 加载数据
(X_train,y_train) , (X_test,y_test)=mnist.load_data()
# 重塑数据
X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], X_train.shape[2], 1))
X_test = X_test.reshape((X_test.shape[0],X_test.shape[1],X_test.shape[2],1))
# 归一化像素值
X_train=X_train/255
X_test=X_test/255
# 定义模型
model=Sequential()
# 添加卷积层
model.add(Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)))
# 添加池化层
model.add(MaxPool2D(2,2))
# 添加全连接层
model.add(Flatten())
model.add(Dense(100,activation='relu'))
# 添加输出层
model.add(Dense(10,activation='softmax'))
# 编译模型
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
# 拟合模型
model.fit(X_train,y_train,epochs=10)