11.人工智能原理-卷积神经网络:图像识别实战

目录

       一、卷积运算

       二、池化层

       三、编程实验

       四、总结

       五、往期内容


一、卷积运算

       上节课我们已经了解到卷积操作是怎么一回事,那接下来我们就看看如何把卷积运算融入到我们的神经网络之中。我们还是以上节的“5”为例:

       这是一张8*8的灰度图,用一个3*3的卷积核对它进行卷积,输出一个6*6的结果,我们把这个做卷积运算的一层称为卷积层。卷完以后我们把结果拆成一个数组,送入到后面的全连接层神经网络中。

       那么问题来了,卷积核中的各个值是多少呢?实际上,我们不必管它,随机初始化这些值就好,卷积核的值也是通过训练学习来的,通过训练找到合适的卷积核去提取不同的特征。

💡那么如何卷积核反向传播调整参数呢?

       minst数据集是10分类的问题,所以输出层有10个神元。

       卷积的过程:卷积核依次和这些小图(局部数据)对应元素相乘再相加得到一个值,可以类比之前讲的普通神经元。神经元的线性函数再加一个偏置项B,然后通过激活函数进行非线性运算,这才是卷积层的最终输出。

https://img-blog.csdnimg.cn/0f8216bd046546ba8c2ed8203d8f4db8.png#pic_center

       这样我们就把一个卷积层拆成了4个普通的神经元,我们就可以像之前在普通神经元中那样,很轻松地继续把误差代价反向传播下去。

注意以下几个细节:

1.首先这四个神经元的输出是根据卷积的过程排列而成的二维的结构,所以我们在送入全连接层时需要手动进行平铺

2.然后这四个神经元的输入并不相同,实际上是同一个图片的不同区域

3.最后这四个神经元的权值参数并不是独立的,它们都来自同一个卷积核,所以实际上它们的权值参数(包括偏置项b)是一样的,我们只是把一个东西强行拆开平铺成4个。也就是说这四个神经元复用了同一套权重参数,这就是所谓的参数共享

相比之下,如果使用全连接层,需要特别多的参数:

 而卷积层,因为共享参数,只需要10个参数:

       实际上真实的图片往往比较大,比如8*8的图片,为了得到4个输出,这样的一个全连接层需要260个参数,但如果还是使用3*3的卷积核的卷积层,那么还是只有10个参数。再比如minst的数据集是28*28的图片,需要3140个参数,而如果是我们拍摄的高清大图,那这个参数将变得很大很大,而网络参数越多,也就意味着训练将变得困难和缓慢,但使用3*3卷积核的卷积层还是只需要10个参数。

 为什么卷积核的参数可以共享?

       利用卷积可以提取比如轮廓、纹理这样特征。假如通过训练之后,这个卷积盒变成了一个提取垂直边缘的卷积核,那么一个图像不论是在左上角还是在右下角,还是在其他什么地方,提取垂直边缘的方式都是一样的,所以我们的垂直参数可以共享。所以说卷积核的参数并不是我们事先设置好的,而是像普通神经元的权能参数一样,通过训练学习而来。

        实际上想要提取多少特征就搞多少卷积核。

将这3个卷积核卷出来的3个结果(三维的张量)中数据铺开,成为一个一维的向量,然后在后面构造全连接层神经网络,把这个铺平的向量作为数据输入其中。

       但在送入全连接层之前,那我们还能不能继续去卷这个六乘六乘三的数据?

       在卷积网络发展的早期,深度学习领域巨头人物LeCun1988年提出了一种经典的卷积神经网络结构:LeNet-5LeNet-5就卷了两次,之后再输入全连接层。

 我们怎么去卷这个六乘六乘三的三维数据?

我们都知道灰度图片是一个通道的,而彩色图片有三个通道的:

此时我们的卷积运算也需要在三维上运算:

二、池化层

可以看出,LeNet-5就卷了两次之后再送入全连接层,里面还多了2个池化层。

我们从这个数据的左上角开始,框出 2 * 2 区域,相加取平均值,这就是所谓平均池化 (当然也可以取最大值,称为最大池化

 加入池化层能很好地提取主要特征,在很多经典的卷积神经网络中,往往都会在卷积层之后加上池化层,但这并不是必须的。还有一点,池化操作因为是固定的套路,所以在反向传播中它并没有任何需要学习的参数。

三、编程实验

1.我们简单的复现一下LeNet-5网络LeNet-5.py

LeNet-5网络

 卷积(32*32变成28*28)

Conv2D()函数中padding填充模式 :

 1.卷积-Same模式:

       卷积之前,根据卷积盒的大小,先在原始图像的四周填充几圈全是零的像素点,比如卷积盒是5*5,那么就填充2圈,这样原始图片就从28*28被填充成为了32*32,被5*5的卷积和卷完之后,仍然是28*28,形状保持不变,这种卷积模式,就是"Same模式"。它的名字说明了一切,卷积后和之前是一样的。

在这里插入图片描述

 2.卷积-Valid模式:

在这里插入图片描述

       原始图像是28*28的,那被5*5的卷积和卷完之后,就变成24*24的,变小了。那实际上在深度神经网络中,往往有很多层,后面我们发现,卷积层也会有很多层,这就意味着这个原始图像会越卷越小,越卷越小,那随之而来的就是卷完之后信息损失越来越多。

# 导入数据集
from keras.datasets import mnist#导入Keras数据集minst
from keras.models import Sequential #堆叠神经网络序列的载体
from keras.layers import Dense #全连接层,一层神经网络
from keras.optimizers import SGD  #引入keras.optimizers调整学习率
import matplotlib.pyplot as plt #绘图
from keras.utils import to_categorical# one-hot编码转化
from keras.layers import Conv2D# 导入2D卷积层
from keras.layers import AveragePooling2D# 导入二维平均池化层
from keras.layers import Flatten# 数组平铺

(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
# 减少差距,加快梯度下降,归一化操作
# 彩色图片为3通道,这里是28,28,1,代表28*28*1,为1通道的28*28的图片
X_train = X_train.reshape(60000, 28, 28, 1) / 255.0
X_test = X_test.reshape(10000, 28, 28, 1) / 255.0

#把0-9的数值转化为one-hot编码
Y_train = to_categorical(Y_train, 10)
Y_test = to_categorical(Y_test, 10)

#创建堆叠神经网络序列的载体Sequential
model = Sequential()
# 卷积层部分
model.add(
    Conv2D(
        filters=6,  # 卷积核/过滤器数量
        kernel_size=(5, 5),  # 卷积核尺寸,5*5
        strides=(1, 1),  # 步长,向右步长1,向下步长1
        input_shape=(28, 28, 1),  # 输入形状,灰度图形状28*28*1
        padding='valid',  # 填充模式(越卷越小)
        activation='relu'  # 激活函数
    )
)
# 池化窗口大小为 2*2
model.add(AveragePooling2D(pool_size=(2, 2)))#pool_size指定池化窗口大小
# 卷积层部分
model.add(
    Conv2D(
        filters=16,  # 卷积核/过滤器数量
        kernel_size=(5, 5),  # 卷积核尺寸
        strides=(1, 1),  # 步长
        #不再指定input_shape,Keras会自动推断出来, 
        padding='valid',  # 填充模式(越卷越小)
        activation='relu'  # 激活函数
    )
)
# 池化窗口大小为 2*2
model.add(AveragePooling2D(pool_size=(2, 2)))#pool_size指定池化窗口大小

model.add(Flatten())# 数组平铺

# 全连接层部分
model.add(Dense(units=120, activation='relu'))
model.add(Dense(units=84, activation='relu'))
model.add(Dense(units=10, activation='softmax'))#softmax函数做多分类

# 配置模型
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.05), metrics=['accuracy'])
#loss(损失函数、代价函数):categorical_crossentropy多分类交叉熵代价函数学习率为0.05
# optimizer(优化器):sgd(随机梯度下降算法);学习率为0.05
# metrics(评估标准):accuracy(准确度);

#训练数据fit, batch_size送入批次的数据,显卡越好,可以送的数据越多,只能用CPU训练,你奶奶就设置小一点
model.fit(X_train, Y_train, epochs=100, batch_size=256)

# 评估测试集
loss, accuracy = model.evaluate(X_test, Y_test)
print("loss" + str(loss))
print("accuracy" + str(accuracy))

 训练结果与测试结果如下:

        最后我们的LeNet-5神经网络在mnist的测试计算的准确率高,达到了98.4%,比上节课的97%要高,而且相比于上节课三层隐藏层,每层256个神经元的全连接神经网络,你可以简单的算一下这个卷积神经网络的参数网实际上要少很多

四、总结

        本节课介绍了LeNet-5神经网络,它包括了两层卷积层、两层池化层。通过编程实验,我们发现LeNet-5神经网络在mnist的测试计算的准确率高,而且相比于上节课三层隐藏层,LeNet-5神经网络参数网实际上要少很多。当然这还是一个最早期的卷积神经网络结构,那在后期出现的更加复杂的卷经网络,比如AlexNet 、VGG等,在图像识别领域中的效果也越来越好。

五、往期内容

引言:来一场人工智能的奇妙冒险吧~

1.一元一次函数感知器:如何描述直觉

2.方差代价函数:知错

3.梯度下降:能改

4.曲面梯度下降和反向传播:能改

5.激活函数:给机器注入灵魂

6.隐藏层:神经网络为什么working

7.高维空间:机器如何面对越来越复杂的问题

8.初识Keras:轻松完成神经网络模型搭建

9.深度学习:神奇的DeepLearning

10.卷积神经网络:打破图像识别的瓶颈

11. 卷积神经网络:图像识别实战

12.循环:序列依赖问题

13.LSTM网络:自然语言处理实践

14.机器学习:最后一节课也是第一节课

视频链接: https://pan.baidu.com/s/1yIyySjSqXdTob4MsYZuRTQ?pwd=cw6y

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
《Python与神经网络实战》是一本关于使用Python语言实践神经网络的PDF教材。Python是一种简洁而强大的编程语言,广泛用于数据科学和人工智能领域。神经网络是一种模拟人脑工作方式的算法模型,被广泛应用于图像识别、自然语言处理等领域。 这本书结合了Python和神经网络的概念和实践,通过实例演示了如何使用Python语言编写神经网络。它从基本的理论介绍开始,包括神经网络的结构、工作原理和常见的网络类型,如感知器、多层感知器和卷积神经网络。接着介绍了Python的相关库和工具,如NumPy、Pandas和TensorFlow,它们提供了处理数据和构建神经网络所需的功能和接口。 随后,该书以实战项目为核心,手把手地教读者使用Python实现神经网络。这些项目旨在帮助读者加深对神经网络原理和概念的理解,并培养他们在实际问题中应用神经网络的能力。比如,书中可能包括使用神经网络进行手写数字识别、图像分类或语音情感分析等案例。 最后,这本PDF还可能包含一些高级主题,如迁移学习、强化学习和生成对抗网络等。这些主题将进一步扩展读者的知识和技能,使他们能够解决更加复杂和实际的问题。 总之,《Python与神经网络实战》是一本教授读者如何使用Python语言实践神经网络的PDF教材。它结合了理论和实践,并以实战项目为基础,帮助读者掌握用Python构建和应用神经网络的技能。无论是对神经网络还是Python有兴趣的读者,都可以从这本书中获得学习和实践的价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值