Keras examples-addition_rnn
1、任务描述
(1)任务概述:主要是利用序列学习来实现两个整数(字符串)的加法
(2)任务分析:两个整数相加,需要通过神经网络来训练,于是不能够直接将整型作为神经网络的输入;想想办法,如果将整数和加号等都转化为字符,于是就可以用一个字符串来表示这个加法问题了;字符串表示的加法问题,可以看成是文本,于是紧接着考虑用什么语言模型来表示这个问题,由于加法问题中涉及到的字符种类不多,只有12类,‘0-9’、‘+’、‘ ’,因此可以直接考虑使用one-hot模型。
2、具体实现
(1)引入相应的库
from __future__ import print_function
from keras.models import Sequential
from keras import layers
import numpy as np
from six.moves import range
from keras.utils import plot_model
(2)定义相应的方法、设置常量
这里主要定义了两个类,一个是编码解码类,另一个是预测结果的颜色处理类。
①编码解码类:包含三个方法:构造方法,编码方法,解码方法。
构造方法:在创建编码解码对象时,会接收一个字符串,这个字符串包含了所有涉及到的字符,构造函数利用该字符串创建了两个字典,一个是{字符:索引}型字典,一个是{索引:字符}型字典。前一个字典主要在编码阶段使用,用于将一个字符转化为one-hot类型,后裔字典主要在解码阶段使用,将one-hot矩阵表示的问题转化为对应的文本。
{字符:索引}型:{’ ‘: 0, ‘+’: 1, ‘0’: 2, ‘1’: 3, ‘2’: 4, ‘3’: 5, ‘4’: 6, ‘5’: 7, ‘6’: 8, ‘7’: 9, ‘8’: 10, ‘9’: 11}
{索引,字符}型:{0: ’ ‘, 1: ‘+’, 2: ‘0’, 3: ‘1’, 4: ‘2’, 5: ‘3’, 6: ‘4’, 7: ‘5’, 8: ‘6’, 9: ‘7’, 10: ‘8’, 11: ‘9’}
编码方法:将传来的一个字符串编码城one-hot矩阵,具体实现是首先创建一个零矩阵,然后针对字符串的第i个字符,得到这个字符在字符字典中的索引为j,于是将零矩阵的第i行和第j列的元素置为1。直到将这个字符串的所有字符都编码。
解码方法:解码方法可以看成是编码方法的逆,将one-hot矩阵转为字符串
其实,这个类也可以利用keras内置的文本预处理方法来实现。
②颜色处理类:主要声明一些常量。
class CharacterTable(object):
# 对于给定的一组字符
## 将他们编码为one-hot的整型来表示
## 将一个one-hot表示的解码为其字符
## 将概率向量解码为其字符输出
def __init__(self,chars):
# 初始化字符表
self.chars=sorted(set(chars))
# 创建字符表中字符和其索引的对应关系(字符:索引)
self.char_indices=dict((c,i) for i,c in enumerate(self.chars))
print(self.char_indices)
# 创建字符表中字符和其索引的对应关系(索引:字符)
self.indices_char=dict((i,c) for i,c in enumerate(self.chars))
print(self.indices_char)
# 将给定的字符串C编码成one-hot模型,参数num_rows指定这个矩阵的行数(等于问题的最大长度),列数等于字符表中总的字符数
def encode(self,c,num_rows):
# 创建一