天池零基础入门CV——街景字符识别task3——字符识别模型

字符识别模型CNN

  • 学习目标
  • 卷积神经网络CNN介绍
    • 卷积介绍
    • 为什么要加入卷积层?
    • CNN为什么有效?
    • CNN由什么组成?
  • pytorch构建CNN模型
    • nn.Model
  • 琐碎知识
      • 训练、验证、测试
      • pytorch中view操作
      • pytorch打印网络结构
      • optimizer.zero_grad()
      • nn.Sequential(*list(model_conv.children())[:-1])
  • 总结

学习目标

  1. 学习CNN原理和基础
  2. 使用Pytorch框架构建CNN模型并完成训练。

卷积神经网络CNN介绍

CNN:Convolutional Neural Networks。卷积神经网络。是一种前馈网络,某层的神经元之和前一层的神经元有关,可以看作一种有向无环图,在很多领域较全连接模型表现得优异,精度和速度也比传统计算学习算法要高。特别是计算机视觉领域,CNN是解决图像分类、图像检索、物体检测和语义分割的主流模型。

卷积介绍

要想了解卷积神经网络,首先我们需要对卷积有一定的了解(数学原理不做过多概述):

首先我们要知道,图片在计算机中是以矩阵形式存储的,所以我们想要对图片进行一些操作,本质上是对矩阵进行操作

卷积的根本目的是从输入图片中提取特征。卷积用一个小方阵的数据学习图像特征,可以保留像素之间的空间关系。(保留像素之间的空间关系很重要!)。
我们可以考虑,如果在我们在人的面部表情的图片当中,你看到了一个小圆圈,再向外又看到了一圈椭圆的东西,我们就可以断定这是眼睛了,这是我们通过这个范围得出的结果,我们不需考虑这张图片的其他位置是什么样子的。
而卷积核做的其实就是这样一个操作,是特征提取,在底层的卷积操作提取的特征小,比如一条横线,一条竖线;越向深层提取的特征范围越大,比如一个正方形(两个横线加俩个竖线)。

在实践当中,卷积神经网络在训练过程中学习卷积核的值,当然我们还是要在训练之前需要指定一些参数:滤波器的个数,滤波器尺寸、网络架构等等。滤波器越多,从图像中提取的特征就越多,模式识别能力就越强。

卷积操作:卷积的操作其实就是一个点乘法,将输入维度上的像素值和卷积核进行对应相乘再相加,在下图中。s1=a * k1+ b * k2+ e * k3 + f * k4
天池零基础入门CV——街景字符识别task3——字符识别模型_第1张图片

为什么要加入卷积层?

传统神经网络都是通过建立一个矩阵来求得输入和输出的关系,假如我们有M个输入和N个输出,那么我们在该层当中就有M*N个参数。
如果M和N很大的话,参数量很大,导致整个模型很难去训练,所以我们考虑加入卷积层来减少参数,卷积层通过稀疏矩阵,参数共享,平移不变性三个重要思想来改变上面全连接层出现的问题。

首先我们要明白,卷积操作可以看作是一种特殊的全连接操作,是加了一定约束的全连接操作
天池零基础入门CV——街景字符识别task3——字符识别模型_第2张图片
如果我们将a1…d4的16个神经元与o1到o9的9个神经元两两相连,就是全连接网络.但是我们其实不必那么做我们根据我们所作的任务的特性(图像相关任务),加了一定的约束和操作(添加卷积核和滑动),使得指定的神经元只与指定的神经元相连,就是我们的卷积操作了。

CNN为什么有效?

CNN真正能做的,只是起到一个特征提取器的作用

当我们做一个图像相关任务的时候,一个像素点的值和它临近的像素点的关系很大,而与距离较远的像素点的关系是较小的

使用CNN,相较于全连接网络,是我们根据图像的平移不变性是我们额外手动加入了一个约束。该约束可以使得网络的参数减小**(稀疏矩阵**),且能满足参数共享,就像我们做算法题一样,一个是暴力求解,一个是我们得出了一定的规律求解,那在我们的规律正确的情况下,一定是第二种方法更work一些。

参数共享的理解:我们在全连接层中,每一个参数是一个像素点到像素点的映射,计算每层的输出时,权重矩阵中的元素只作用于某一个输入元素一次而在卷积层中,卷积核的某个元素作用于每一个局部输入的特定位置上,我们只需要学习一组参数集合来作为输入到输出的共享参数,而不需要针对每一个位置的每一个参数来进行优化学习,从而大大降低了模型的存储需求。

CNN由什么组成?

CNN是一种层次模型,输入:原始的像素数据(图片)
一般的卷积神经网络由以下模块组成:

  • 卷积(convolution)
  • 池化(pooling)
  • 非线性激活(non-linear activation function)
  • 全连接层 (fully-connected layer)

pytorch构建CNN模型

nn.Model

nn.Model是所有网络层的父类,如果我们要自己定义层的话,要继承nn.Model类。

琐碎知识

训练、验证、测试

在使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval。
model.train() model.eval()

pytorch中view操作

pytorch中对torch.view()操作相当于是一个resize操作.
pytorch中view的用法
view常用在forward中分类器前

pytorch打印网络结构

pytorch中打印网络结构: print(net)即可。

optimizer.zero_grad()

pytorch中默认是对梯度进行累加的. 所以我们在每次计算梯度前,要手动将梯度清0.

nn.Sequential(*list(model_conv.children())[:-1])

这句话其实引出了一个问题,就是我们只想使用预训练模型的一部分。那么怎么办?这里给出链接
关于pytorch中使用pretrained的模型,对模型进行调整

总结

今天了解了卷积神经网络的一些基本知识

  • 卷积操作是怎样实现的
  • 卷积操作相较于全连接操作,有哪些好处和优点,
  • 卷积神经网络的组成。

发现baseline的思路是我们认为设置c0.c1.c2.c3.c4为识别第1.2.3.4.5个字符并识别正确,大佬说这个达到一个较为良好的acc.我试着训练一下吧~,加油!

占个坑。
下篇写一下前馈神经网络的一些知识(感知机,bp网络)
还有池化,激活函数的一些相关内容。

你可能感兴趣的:(卷积,神经网络,计算机视觉)