"基于RNN-LSTM CTC的变长字符串识别实践报告"

需积分: 0 0 下载量 146 浏览量 更新于2023-12-21 收藏 2.43MB DOCX 举报
实 在 翻 译了 AI2019_SA19225404_吴语港_Lab3_TF1.x1;AI2019_SA19225404_吴语港_Lab3_TF1.x1;AI 实 验 报 告学生姓名 吴语港学生学号 SA19225404实验日期 2019/10/30实验名称基于 RNN-LSTM CTC的注册码识别实践学生学号 SA19225404实验地点 思贤楼 301 303 实验室 一、 实验目的: 通过 CNN LSTM CTC 实现变长字符串的识别二、 实验原理: (1)循环神经网络 RNN(Recurrent neural network)递归神经网络是两种人工神经网络的总称:时间递归神经网络(recurrent neural network)和结构递归神经网络(recursive neural network)。时间递归神经网络的神经元间连接构成有向图,而结构递归神经网络利用相似的神经网络结构递归构造更为复杂的深度网络。我们常说的 RNN 一般指代时间递归神经网络。单纯递归神经网络因为无法处理随着递归,权重指数级爆炸或消失的问题(Vanishing/Exploding gradient problem),难以捕捉长期时间关联;而结合不;"。。 吴语港同学SA19225404在2019年10月30日在思贤楼301和303实验室进行了基于RNN-LSTM CTC的注册码识别实践实验,实验目的是通过CNN LSTM CTC实现变长字符串的识别。在实验原理部分,首先介绍了循环神经网络RNN(Recurrent neural network)的概念,指出了递归神经网络包括时间递归神经网络和结构递归神经网络两种类型。时间递归神经网络的神经元间连接构成有向图,而结构递归神经网络利用相似的神经网络结构递归构造更为复杂的深度网络。此外,也指出了单纯递归神经网络存在权重指数级爆炸或消失的问题,难以捕捉长期时间关联。第二项原理是长短时记忆网络LSTM(Long Short-Term Memory),介绍了LSTM网络能够解决传统RNN网络难以处理长序列依赖关系的问题,以及其内部的记忆单元和三个门结构。第三项原理则是CTC(Connectionist Temporal Classification),介绍了CTC可以用于解决基于序列的学习问题,尤其适用于不需要对输入序列和输出序列进行精确对齐的场景。总的来说,实验原理部分详细介绍了RNN、LSTM和CTC的基本原理,为后续实验操作打下了坚实的理论基础。 三、 实验过程:(1)数据准备实验所需数据包括图像数据和对应的标签数据。首先对图像数据进行预处理,包括灰度化、二值化、字符分割等操作,以提高识别的准确性。接着对标签数据进行编码,转换成CTC Loss所需的标签格式。对数据进行处理后,构建训练集和测试集用于模型训练和评价。此外,在实验过程中还涉及了数据增强技术的应用,以扩充数据集,提高模型的鲁棒性。(2)模型搭建实验中采用深度学习框架TensorFlow搭建并训练了RNN-LSTM CTC模型。首先构建卷积神经网络CNN用于特征提取,然后连接LSTM层,最后接CTC层用于序列标注。使用TensorFlow提供的接口,构建网络结构并定义损失函数,选择优化器进行模型训练。并在测试集上评价模型的识别能力,以调参和优化模型性能。(3)实验结果实验结果分析证明了基于RNN-LSTM CTC的注册码识别模型的有效性和高准确性。通过对比实验结果和人工标注结果,可以看出模型在验证码识别任务上取得了较好的效果。此外,实验结果还表明了数据增强对模型性能的提升作用。同时,也发现了模型的一些局限性和不足之处,并提出了进一步改进的方向。 四、 结论:本次实验通过基于RNN-LSTM CTC的注册码识别实践,加深了对深度学习模型和序列标注技术的理解,并掌握了相关实践技能。实验结果证实了RNN-LSTM CTC模型在验证码识别任务上的有效性和高准确性,为未来在文本识别、语音识别等领域的应用奠定了基础。同时,在实验过程中还发现了模型的一些不足之处,为后续改进和优化提供了参考和方向。通过本次实验,吴语港同学对深度学习模型的搭建和训练有了更深入的了解,为将来的科研和实践积累了宝贵经验。

def __next_step(self, x, y): if not self.judge_colory: self.__history += 0 else: self.__history += 1 self.color = 1 if self.__history % 2 == 0 else 2 if self.start_ai_game: if self.ai_color == self.color: row,col = self.ai_stage(self.ai_game()[0],self.ai_game()[1]) else: col = round((x-self.__margin*2)/self.__cell_width) row = round((y-self.__margin*2)/self.__cell_width) stage_row = (y-self.__margin)-(self.__cell_width*row+self.__margin) stage_col = (x-self.__margin)-(self.__cell_width*col+self.__margin) if stage_col < stage_row: self.direct= 1 else: self.direct= 0 else: col = round((x - self.__margin * 2) / self.__cell_width) row = round((y - self.__margin * 2) / self.__cell_width) stage_row = (y - self.__margin) - (self.__cell_width * row + self.__margin) stage_col = (x - self.__margin) - (self.__cell_width * col + self.__margin) if stage_col < stage_row: self.direct = 1 else: self.direct= 0 if self.valide(row, col, self.direct): if self.__history % 4 == 0 or (self.__history + 2) % 4 == 0: self.__game_board.drew_turn(2) else: self.__game_board.drew_turn(1) self.add_logic(row, col, self.color) self.__game_board.draw_chess(row, col, self.color, self.direct) if self.judge_owner(row, col, self.color, self.direct): self.__game_board.drew_turn(self.judge_next(self.color)) for i in self.judge_owner(row, col, self.color, self.direct): x,y=self.draw_owner(i) self.__game_board.drew_owner(self.color, y, x) else: self.__game_board.drew_turn(self.color) self.judge_color(row, col, self.color, self.direct) print(self.logic_board_state) if 0 not in self.logic_board_owner: self.__game_board.pop_win(self.judge_winner())

2023-07-14 上传