本文以短问答为背景,串联几个keras下常用的函数
0:keras.preprocessing
该模块是对数据的预处理模块 https://blog.csdn.net/winter_python/article/details/108615737
由于keras只能接受相等长度的序列,因此在将数据输入之前,要将所有的句子缩放成等长
input_length=10
keras.preprocessing.sequence.pad_sequences(sentence, maxlen=input_length, value=0.0)
分割后的句子长度为10,超过10的将被直接截断,小于10的将被value进行填充,直到所有的句子均被转化成等长的序列。
1:Embedding
嵌入层也作为模型搭建的第一层,将所有的字典词训练出一个词的嵌入矩阵,该矩阵的行维度会很高==字典词的个数,然后用ont-hot乘该矩阵即可。对于词向量的输出维度可以进行设置,一般为128维度 https://blog.csdn.net/buchidanhuang/article/details/99186395
keras.layers.Embedding(input_dim=word_num, output_dim=input_dimension)
这里要注意输入的维度是整个词典的个数
2:双向LSTM
搭建一个双向的lstm模型:LSTM模型可以减弱长期依赖的影响,可以较好的理解语义和语序
keras.layers.Bidirectional(keras.layers.LSTM(int(lstm_dim / 2), return_sequences=True))
return_sequences=False表示最后的结果只输出一个 return_sequences=True表示输出每个时间T的结果,在NLP来说就是每个词(可以把一个词看成一个T)的结果都输出,而不只是输出最后的整体结果
由于是双向模型,为了维持最后输出的模型维度,将int(lstm_dim / 2),最后的模型实际上是将向前计算的序列1与向后计算的序列2进行拼接,两个lstm_dim / 2拼接后的维度是lstm_dim,也是隐含层参数的个数
lstm输出的第一个维度就是时间维度【T,sequence_length,output_dim】,也可以认为是词的个数10
3:TimeDistributed
将lstm的结果再过一个全链接层,这里有一个TimeDistributed,可以理解成将dence层过Time次。如果放在NLP下面,就是将lstm输出的每个词向量(10个)分别过dence层
TimeDistributed(Dense(lstm_dim, activation="relu"))(lstm)
ReLu的使用,使得网络可以自行引入稀疏性。这一做法,等效于无监督学习的预训练
4:GlobalMaxPooling1D()
先计算匹配的相似度,在steps维度中求解feature全局最大值(batch_size, steps, features),最后输出一个(batch_size, features)。也就是看成匹配出相同batch_size大小的句子
GlobalMaxPooling1D()(q_out)
5:Dense
将问答进行拼接后太长,过一个dense层进行降维,然后再过有个sigmoid函数判断其是否适合
out = keras.layers.concatenate([q_out, a_out], axis=1)
out = Dense(50, activation="relu")(out)
out = Dense(1, activation="sigmoid")(out)
简单的梳理了下思路,理解有误的地方还请各位大侠指出~~~~~
|