CRNN Keras版源码详细解读系列之模型搭建

引言

笔者在使用CRNN完成长文本识别的过程中,用了keras的api搭建了神经网络,并对于其中的代码进行了详读,简单作些笔记,供有同样需求的同学进行学习,完成神经网络搭建。在此以CRNN为例(CNN+RNN+CTC)
(根据CRNN的论文描述,CRNN是由CNN-》RNN-》CTC三大部分架构而成,分别对应卷积层、循环层和转录层。首先CNN部分用于底层的特征提取,RNN采取了BiLSTM,用于学习关联序列信息并预测标签分布,CTC用于序列对齐,输出预测结果。)
在这里插入图片描述
为了将特征输入到Recurrent Layers,做如下处理:

~首先会将图像缩放到 32×W×3 大小
~然后经过CNN后变为 1×(W/4)× 512,本文中W=256。
~接着针对LSTM,设置 T=(W/4) , D=512 ,即可将特征输入LSTM。

1、初始化参数

深度学习的初始化参数指的是在网络训练之前,对各个节点的权重和偏置进行初始化的过程,很多时候我们以为这个初始化是无关紧要的,不需要什么讲究,但是实际上,一个参数的初始化关系到网络能否训练出好的结果或者是以多快的速度收敛,这都是至关重要的,有时候因为参数初始化的缘故,甚至得不到好的训练结果。本文就来讨论一下参数初始化到底有什么讲究以及常见的参数初始化的一些策略方法。阅读本文需要神经网络相关背景,能够理解误差反向传播算法的实现过程。
主要的初始化参数方法
下面展示了正态化的kaiming初始化——he_normal
He 正态分布初始化器:它从以 0 为中心,标准差为 stddev = sqrt(2 / fan_in) 的截断正态分布中抽取样本, 其中 fan_in是权值张量中的输入单位的数量,在keras中的实现为

keras.initializers.he_normal(seed=None)

#He 正态分布初始化器它从以 0 为中心,标准差为 stddev = sqrt(2 / fan_in) 的截断正态分布中抽取样本, 其中 fan_in是权值张量中的输入单位的数量
initializer = initializers.he_normal() 

2、CRNN中CNN网络搭建(VGG)

CRNN论文提到的网络输入是归一化好的100×32大小的灰度图像,即高度统一为32个像素。本文中是256×32大小的灰度图像。下面是CRNN的深度神经网络结构图,CNN采取了经典的VGG16,值得注意的是,在VGG16的第3第4个max pooling层CRNN采取的是1×2的矩形池化窗口(w×h),这有别于经典的VGG16的2×2的正方形池化窗口,这个改动是因为文本图像多数都是高较小而宽较长,所以其feature map也是这种高小宽长的矩形形状,如果使用1×2的池化窗口则更适合英文字母识别(比如区分i和l)。VGG16部分还引入了BatchNormalization模块,旨在加速模型收敛(具体原理自行搜索,BN的原理笔者看完之后还是觉得很有意思的hhh)。
在这里插入图片描述

(1)keras的INPUT层:

Input():用来实例化一个keras张量

Input(shape=None,batch_shape=None,name=None,dtype=K.floatx(),sparse=False,tensor=None)
#参数:

shape: 形状元组(整型),不包括batch size。for instance, shape=(32,) 表示了预期的输入将是一批32维的向量。

batch_shape: 形状元组(整型),包括了batch size。for instance, batch_shape=(10,32)表示了预期的输入将是10个32维向量的批次。

name: 对于该层是可选的名字字符串。在一个模型中是独一无二的(同一个名字不能复用2次)。如果name没有被特指将会自动生成。

dtype: 预期的输入数据类型

sparse: 特定的布尔值,占位符是否为sparse

tensor: 可选的存在的向量包装到Input层,如果设置了,该层将不会创建一个占位张量。

#返回 一个张量

inputs = Input(shape=(img_height, img_width, 1), name='img_inputs')
#实例化一个keras张量,表示输入将是一批256*32大小的灰色图像(1维)

(2)VGG网络搭建(注释在代码后):

这里的搭建就非常简单了,每个函数都有相关的说明,按照CNN网络搭建的要领以及网络架构(上图)直接进行复现:

   # CNN(VGG)
   inputs = Input(shape=(img_height, img_width, 1), name='img_inputs') #实例化一个keras张量,表示输入将是一批256*32大小的灰色图像
   x = Conv2D(64, (3, 3), padding="same", kernel_initializer=initializer, name='conv1')(inputs)#卷积核数量64(channel大小64),卷积核大小3*3,采用全零填充,卷积核初始化方式按之前的定义。
   x = BatchNormalization()(x)#BN操作,批标准化
   x = Activation("relu")(x)#relu激活函数
   x 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值