model搭建

python 构造函数

super()

super()是为了调用父类函数

https://www.runoob.com/python3/python3-class.html

encoder构建

定义超参的概念
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)

units: 正整数,输出空间的维度。

recurrent_initializer: recurrent_kernel 权值矩阵 的初始化器,用于循环层状态的线性转换 (详见 initializers)。

return_sequences: 布尔值。是返回输出序列中的最后一个输出,还是全部序列。

return_state: 布尔值。除了输出之外是否返回最后一个状态。

https://keras.io/zh/layers/recurrent/

Writing your own Keras layers

https://keras.io/layers/writing-your-own-keras-layers/

glorot_uniform

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Encoder (keras.Model):
def __init__(self, vocab_size, embedding_units, encoding_units, batch_size):
super(Encoder, self).__init__()
self.batch_size = batch_size
self.encoding_units = encoding_units
self.embedding = keras.layers.Embedding(vocab_size,embedding_units)
self.gru = keras.layers.GRU(self.encoding_units,return_sequences=True,return_state=True,
recurrent_initializer='glorot_uniform')
def call(self, x, hidden):
x = self.embedding(x)
output, state = self.gru(x, initial_state=hidden) ## 这里的self.gru() 传递的两个参数是什么意思呢?在构造函数里面并没有使用这两个参数, 但是在api里 可以找到这个参数。
return output, state
def initialize_hidden_state(self):
return tf.zeros((self.batch_size,self.encoding_units))

encode = Encoder(input_vocab_size, embedding_units, units, batch_size)

sample_hidden = encoder.initialize_hidden_state()

sample_output, sample_hidden = encoder(x, sample_hidden)


## 输入模型的数据特征
[in]
for array in (input_train, input_eval, output_train, output_eval):
print( type(array), array.shape)
[out]
<class 'numpy.ndarray'> (24, 9)
<class 'numpy.ndarray'> (7, 9)
<class 'numpy.ndarray'> (24, 14)
<class 'numpy.ndarray'> (7, 14)

可以这样理解,对于 input_train 来说,有24个样本,每个样本有9个特征。对于这个9。就是每个句子的单词数,但是有的句子单词不够9个,这在预处理数据的时候进行了padding操作。样本数是24,在train_test_split(test_size=0.2)分配的数据量。