掘金 人工智能 04月29日 10:27
机器学习入门(十)卷积神经网络
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了卷积神经网络(CNN)的基本概念和结构,CNN在处理图像等具有空间结构的数据时表现优异。文章详细阐述了CNN的核心组成部分,包括卷积层和池化层。卷积层通过过滤器在输入矩阵上进行卷积操作,提取图像的边缘特征,并介绍了步幅和填充的概念。池化层则用于特征提取,减小过拟合和降低维度,常用的方法有最大池化和平均池化。此外,文章还提供了一个使用Keras库构建CNN模型进行猫狗识别的示例代码,展示了CNN在图像识别中的应用。

🧱**卷积层:** 卷积层是CNN的核心,通过过滤器在输入矩阵上滑动进行卷积操作,提取图像的边缘特征。步幅(stride)决定了过滤器移动的距离,填充(padding)则用于解决边缘特征丢失的问题。

💧**池化层:** 池化层用于特征提取,减小过拟合和降低维度。最大池化提取窗口中的最大值作为特征,平均池化则使用窗口中所有值的平均值。

🐱🐶**猫狗识别示例:** 文章提供了一个使用Keras库构建CNN模型进行猫狗识别的示例代码,展示了如何使用卷积层、池化层、Flatten层和全连接层构建一个简单的图像分类器。

在上一篇文章机器学习入门(九)多层感知机中,我们了解了最基础和最简单的神经网络结构 MLP ,这篇文章将介绍卷积神经网络,也叫CNN。在处理图像等具有空间结构的数据时,CNN通常比MLP表现得更好,而在处理结构化数据时,MLP可能更为合适。

卷积神经网络

相对于最经典的 MLP 神经网络,卷积神经网络增加了卷积层和池化层两层。CNN 的结构如下图所示,图片来源这里

各层的作用如下:

卷积层

从卷积神经网络的名字就可以看出,卷积层是最重要的一层。如下图所示(图片来源这里),我们通过过滤器(图中的3维矩阵)在输入矩阵(图中的4维矩阵)中不断移动,每一次移动都进行一次乘积的求和,该过程会得到一个新的二维矩阵,此二维矩阵也被称为特征图(Feature Map)。这整个过程就是就叫做卷积。

卷积层有两个重要的参数,分别为步幅(stride)和填充(padding)。过滤器移动的距离就是步幅,如下图所示,分别为 stride == 1 和 stride == 2的情况

填充(padding)可以解决每次计算的时候,边缘只被计算一次,而中间被多次计算,导致丢失边缘特征问题。如下所示(图片来源这里):

池化层

池化层的作用简单来说就是将得到的特征图进行特征提取,将其中最具有代表性的特征提取出来。这样做的目的是为了减小过拟合和降低维度。常用的提取到最有代表性的特征的方法有:最大池化和平均池化。

最大池化就是每次取窗口中所有值的最大值。如下图所示(图片来源这里):

平均池化使用窗口中所有值的平均值,如下图所示(图片来源这里):

示例

我们可以通过 keras 库来使用 CNN 模型,完成猫狗的识别,代码示例如下:

#set up the cnn modelfrom keras.models import Sequentialfrom keras.layers import Conv2D, MaxPool2D, Flatten, Densemodel = Sequential()#卷积层model.add(Conv2D(32,(3,3),input_shape=(50,50,3),activation='relu'))#池化层model.add(MaxPool2D(pool_size=(2,2)))#卷积层model.add(Conv2D(32,(3,3),activation='relu'))#池化层model.add(MaxPool2D(pool_size=(2,2)))#flattening layermodel.add(Flatten())#FC layermodel.add(Dense(units=128,activation='relu'))model.add(Dense(units=1,activation='sigmoid'))#configure the modelmodel.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])model.summary()#train the modelmodel.fit(training_set,epochs=20)# make prediction on multiple imagesimport matplotlib as mlpfont2 = {'family' : 'SimHei','weight' : 'normal','size'   : 20,}mlp.rcParams['font.family'] = 'SimHei'mlp.rcParams['axes.unicode_minus'] = Falsefrom matplotlib import pyplot as pltfrom matplotlib.image import imreadfrom keras.preprocessing.image import load_imgfrom keras.preprocessing.image import img_to_arrayfrom keras.models import load_modela = [i for i in range(1,10)]fig = plt.figure(figsize=(10,10))for i in a:    img_name = str(i)+'.jpg'    img_ori = load_img('./cnn_data/' + img_name, target_size=(50, 50))    img = img_to_array(img_ori)    img = img.astype('float32')/255    img = img.reshape(1,50,50,3)    result = (model.predict(img) > 0.5).astype(int).flatten()    img_ori = load_img('./cnn_data/' + img_name, target_size=(250, 250))    plt.subplot(3,3,i)    plt.imshow(img_ori)    plt.title('预测为:狗狗' if result[0] == 1 else '预测为:猫咪')plt.show()

效果如下所示:

参考

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

卷积神经网络 CNN 图像识别
相关文章