【人工智能原理自学】卷积神经网络:图像识别实战

😊你好,我是小航,一个正在变秃、变强的文艺倾年。
🔔本文讲解卷积神经网络:图像识别实战,一起卷起来叭!

在这里插入图片描述

一、“卷”

这节课我们来看如何把卷积运算融入到神经网络中,我们还是以上节的“5”为例:
在这里插入图片描述
这是一张 8 * 8 的灰度图,用一个 3 * 3 的卷积核对它进行卷积,输出一个 6 * 6 的结果,我们把这个做卷积运算的一层称为卷积层。卷完以后我们把结果拆成一个数组,送入到后面的全连接层神经网络中。

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

💡那么如何反向传播调整参数呢?
在这里插入图片描述
我们知道,卷积的过程就是:卷积核依次和这些小图(局部数据)对应元素相乘再相加得到一个值。
在这里插入图片描述
这个 3 * 3 的小区域的每个元素值是输入数据卷积核上的值可以看作是对应输入数据的权值参数W。对应元素相乘并相加得到了一个线性函数:
在这里插入图片描述
当然偏置项b、激活函数也不能少:
在这里插入图片描述
不过还需要注意几个细节:

  • 首先这四个神经元的输出是根据卷积的过程排列而成的二维的结构,所以我们在送入全连接层时需要手动进行平铺
  • 然后这四个神经元的输入并不相同,实际上是同一个图片的不同区域
  • 最后这四个神经元的权值参数并不是独立的,它们都来自同一个卷积核,所以实际上它们的权值参数(包括偏置项b)是一样的,我们只是把一个东西强行拆开平铺成4个。也就是说这四个神经元复用了同一套权重参数,这就是所谓的参数共享

在这里插入图片描述
相比之下我们使用全连接层,需要特别多的参数:
在这里插入图片描述
而对于卷积层,由于使用参数共享,只需要使用10个参数:
在这里插入图片描述
实际上你想要提取多少特征就搞多少个卷积核就可以
在这里插入图片描述
我们都知道灰度图片是一个通道的,而彩色图片有三个通道的:
在这里插入图片描述
此时我们的卷积运算也需要在三维上运算:
在这里插入图片描述

二、LeNet-5网络

在卷积网络发展的早期,深度学习领域巨头人物LeCun1988年提出了一种经典的卷积神经网络结构:LeNet-5

在这里插入图片描述
可以看出,LeNet-5就卷了两次之后再送入全连接层。
在这里插入图片描述
这两层立方块就是所谓的“池化层”,我们从这个数据的左上角开始,框出 2 * 2 区域,相加取平均值,这就是所谓“平均池化” (当然也可以取最大值,称为“最大池化”
在这里插入图片描述
🔨我们简单的复现一下LeNet-5网络LeNet-5.py.py

简单的补充说明一下:
X_train数据说明:
在这里插入图片描述
卷积前后图像大小的计算:
在这里插入图片描述
卷积-Same模式:
在这里插入图片描述
卷积-Valid模式:
在这里插入图片描述

# 导入数据集
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
# One-Hot编码转化
from keras.utils import to_categorical
# 2D卷积层
from keras.layers import Conv2D
# 二维平均池化层
from keras.layers import AveragePooling2D
# 数组平铺
from keras.layers import Flatten

(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
# 减少差距,加快梯度下降,归一化操作
X_train = X_train.reshape(60000, 28, 28, 1) / 255.0
X_test = X_test.reshape(10000, 28, 28, 1) / 255.0

Y_train = to_categorical(Y_train, 10)
Y_test = to_categorical(Y_test, 10)

model = Sequential()
# 卷积层部分
model.add(
    Conv2D(
        filters=6,  # 卷积核/过滤器数量
        kernel_size=(5, 5),  # 卷积核尺寸
        strides=(1, 1),  # 步长
        input_shape=(28, 28, 1),  # 输入形状
        padding='valid',  # 填充模式(越卷越小)
        activation='relu'  # 激活函数
    )
)
# 池化窗口大小为 2*2
model.add(AveragePooling2D(pool_size=(2, 2)))
model.add(
    Conv2D(
        filters=16,  # 卷积核/过滤器数量
        kernel_size=(5, 5),  # 卷积核尺寸
        strides=(1, 1),  # 步长
        padding='valid',  # 填充模式(越卷越小)
        activation='relu'  # 激活函数
    )
)
model.add(AveragePooling2D(pool_size=(2, 2)))
model.add(Flatten())
# 全连接层部分
model.add(Dense(units=120, activation='relu'))
model.add(Dense(units=84, activation='relu'))
model.add(Dense(units=10, activation='softmax'))

# 送入训练
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.05), metrics=['accuracy'])
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))

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

在这里插入图片描述

📌 [ 笔者 ]   文艺倾年
📃 [ 更新 ]   2023.1.23
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!
🔍 [ 代码 ]   https://github.com/itxaiohanglover/ai_lesson

在这里插入图片描述

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
自学CNN图像识别实战不仅可以提升自身的技术能力,还有助于理解深度学习原理和应用。下面是一些步骤与方法,帮助您开展这项实战学习: 1. 学习基础知识:首先,需要掌握机器学习和深度学习的基础知识,包括神经网络结构和CNN原理、损失函数、优化算法等。 2. 学习Python编程:学习Python编程语言,以及常用的相关库,例如NumPy和Pandas。这些库可以帮助您进行数据处理和预处理。 3. 学习深度学习库:选择一个流行的深度学习库,例如TensorFlow或PyTorch,并学习其基本使用方法。这些库提供了丰富的功能,可用于构建和训练CNN模型。 4. 数据集准备:选择一个适当的图像数据集,例如CIFAR-10或MNIST。这些数据集通常包含了各种类别的图像,可以用于训练和测试CNN模型。 5. 构建CNN模型:通过深度学习库构建CNN模型。一般来说,CNN模型包括卷积层、池化层和全连接层等,您可以根据需要调整各层的参数和结构。 6. 数据预处理:对图像数据进行预处理,包括图像大小调整、归一化处理和数据增强等。这些操作可以提高CNN模型的训练效果。 7. 训练和评估模型:利用训练数据对CNN模型进行训练,然后使用测试数据对模型进行评估。可以根据需要调整模型结构和超参数,以提高模型的准确度。 8. 模型优化:根据评估结果对模型进行优化,例如调整学习率、增加正则化项等。这些操作有助于提高模型的泛化能力和鲁棒性。 9. 进一步学习和实践:深度学习是一个不断发展的领域,继续学习最新的研究成果和技术进展,参与相关的实践项目,可以不断提高自己的实战能力。 通过这些步骤和方法,您可以自学CNN图像识别实战,提升自身的技术水平,并且在实践中深入理解CNN模型的工作原理和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值