详细的记录 evaluate函数的实现。
解决报错
1 | ValueError Traceback (most recent call last) |
注意看predictions 后面的标点符号
接收的是一个文本的输入,首先就要转换成适合模型的数据类型。
1 | def evaluate(input_sentence): |
详细的记录 evaluate函数的实现。
解决报错
1 | ValueError Traceback (most recent call last) |
接收的是一个文本的输入,首先就要转换成适合模型的数据类型。
1 | def evaluate(input_sentence): |
2015年提出的BahdanauAttention原文:
https://arxiv.org/pdf/1409.0473.pdf
Encoder会通过RNN将最后一个step的隐藏状态向量c作为输出,Deocder利用向量c进行翻译。这样做有一个缺点,翻译时过分依赖于这个将整个sentence压缩成固定输入的向量。输入的sentence有可能包含上百个单词,这么做不可避免会造成信息的丢失,翻译结果也无法准确了
注意力机制的引入就是为了解决此问题,注意力机制使得机器翻译中利用原始的sentence信息,减少信息损失。
损失函数
预测哪个单词是正确的,是一个分类问题。
super()是为了调用父类函数
https://www.runoob.com/python3/python3-class.html
定义超参的概念
embedding_units = 256 每个word转成embedding是多少
units = 1024 循环神经网络的个数 encode 和decode的units数量是一样的
encoding_units 在 encode中lstm 的size是多大
hidden 是初始化的隐藏层状态
keras.layers.GRU(units, activation=’tanh’, recurrent_activation=’hard_sigmoid’, use_bias=True, kernel_initializer=’glorot_uniform’, recurrent_initializer=’orthogonal’, bias_initializer=’zeros’, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False, reset_after=False)
https://keras.io/zh/layers/recurrent/
https://keras.io/layers/writing-your-own-keras-layers/
https://keras.io/zh/initializers/
keras.initializers.glorot_uniform(seed=None)
Glorot 均匀分布初始化器,也称为 Xavier 均匀分布初始化器。
它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(6 / (fan_in + fan_out)), fan_in 是权值张量中的输入单位的数量, fan_out 是权值张量中的输出单位的数量。
参数
seed: 一个 Python 整数。作为随机发生器的种子。
返回
一个初始化器。
参考文献:http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
1 | class Encoder (keras.Model): |
链表推导式在很多代码里都出现过,但是语法规则不太了解,今天做个记录。
#我感觉链表推导式就是让代码看上去更清爽。。。
a,b for c, d in
1 | [In] |
比如:求 a 内每个元素的平方,我们直接写
b = [ x**2 for x in a]
b [0, 1, 4, 9, 16, 25]
比如:取出 a 内 > 0 的元素
c = [ x for x in a if x > 0 ]
c [1, 2, 3, 4, 5]
比如:我们要知道 a 内偶数元素的位置
a_even_id = [ i for i,x in enumerate(a) if x%2 == 0 ]
a_even_id
[0, 2, 4]
A0 = [ 0,’ ‘,1,2,4,5,’ ‘,’3’,2]
A是由整数(int)和空格’ ‘, 以及字符串’3’组成的
我们要将空格替换为 0 ,将’3’ 替换为 整形 3
(1).判断是否是整形: type(x) == int
(2).不是整形,则判断是否是空格:x == ‘ ‘,是则替换为 0,
(3).判断是否是数字构成的字符串:x.isdigit(),(isdigit()是字符串方法),是则转化为整形数
(4). 如果是其他,则均替换为 0 ,(这一步必须有,以为要穷尽多有可能,否则会因为条件没有覆盖到而导致无法执行)
A = [ x if type(x)==int else 0 if x == ‘ ‘ else int(x) if x.isdigit() else 0 for x in A0 ]
A [0, 0, 1, 2, 4, 5, 0, 3, 2]
A_int = [x for x in A0 if type(x)==int ]
A_int
[0, 1, 2, 4, 5, 2]
1 | def generate_x_y_data_v1(isTrain, batch_size): |
sig1 是ndarray类型,长度为seq_length*2 , 主要np.linspace()函数。
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
sig2 和sig1 一样的思路
x1 y1 是对sig1的截取,分别取前半段和后半段
x2 y2 是对sig2的截取,分别取前半段和后半段
batch_x 就是x1 x2 形成的矩阵。
batch_y 就是y1 y2 形成的矩阵。
batch_x.shape = (seq_length, batch_size,2)
有seq_length个样本,每个样本的维度 (batch_size,2)