机器学习入门(十)卷积神经网络

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

卷积神经网络

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

各层的作用如下:

  • 输入层:输入图像等信息
  • 卷积层:对图像矩阵与过滤器矩阵进行对应相乘再求和运算,转化得到新的矩阵。作用是快速定位图像中某些边缘特征。
  • 池化层:防止过拟合,将数据维度减小
  • 全连接层:汇总卷积层和池化层得到的图像的边缘特征和信息
  • 输出层:根据全连接层的信息得到概率最大的结果

卷积层

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

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

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

池化层

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

  • 最大池化

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

  • 平均池化

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

示例

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

ini 复制代码
#set up the cnn model
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Flatten, Dense

model = 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 layer
model.add(Flatten())
#FC layer
model.add(Dense(units=128,activation='relu'))
model.add(Dense(units=1,activation='sigmoid'))
#configure the model
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
model.summary()
#train the model
model.fit(training_set,epochs=20)
# make prediction on multiple images
import matplotlib as mlp
font2 = {'family' : 'SimHei',
'weight' : 'normal',
'size'   : 20,
}
mlp.rcParams['font.family'] = 'SimHei'
mlp.rcParams['axes.unicode_minus'] = False
from matplotlib import pyplot as plt
from matplotlib.image import imread
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.models import load_model
a = [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()

效果如下所示:

参考

相关推荐
Blossom.11818 分钟前
量子通信技术:原理、应用与未来展望
大数据·人工智能·深度学习·安全·机器学习·计算机视觉·量子计算
lucky_lyovo1 小时前
机器学习-KNN算法
人工智能·算法·机器学习
搏博2 小时前
无人机集成毫米波雷达与双目视觉的融合感知系统深度解析
python·深度学习·学习·机器学习·动态规划·无人机
IT古董2 小时前
【漫话机器学习系列】269.K-Means聚类算法(K-Means Clustering)
算法·机器学习·kmeans
A林玖3 小时前
【机器学习】支持向量机(SVM)
人工智能·机器学习·支持向量机
山顶听风3 小时前
分类算法 Kmeans、KNN、Meanshift 实战
机器学习·分类·kmeans
xsddys5 小时前
极大似然估计与机器学习
人工智能·机器学习
Listennnn6 小时前
LVLM-AFAH论文精读
人工智能·深度学习·机器学习
Jozky866 小时前
世界模型+大模型+自动驾驶 论文小汇总
人工智能·机器学习·自动驾驶
熊猫在哪7 小时前
野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit Lite2
人工智能·python·嵌入式硬件·深度学习·神经网络·目标检测·机器学习