这次是做了一个基于Keras的情感分类小程序。Emm……工程上尽量向GitHub上的大佬们看齐吧。因为感觉以前最尴尬的是下了一份深度学习的代码居然tm看不懂,懂模型,却不懂工程。 这个情感分类问题针对对象为短文本,极性为3极——正向,中立,消极。模型讲道理是随便搭的,没仔细看文献,主要是想用Keras 构建这样一个工程,顺便搞清楚那几个比较重要的参数是在哪里被调用,模型可以日后慢慢雕琢。 看了一些大佬代码,感觉最贴心的工程文件还是一份预处理文件,一份训练文件,一份测试文件,一份配置文件,然后其他就是模型相关的文件了。
- 文档预处理文件:
文档预处理文件主要包括文本分词,词向量模型构建。文本分词这里还可以再做一下过滤符号什么之类的。词向量模型构造其实也可以在模型构造那个文件执行,Keras还是有这样的层,这种层出来以后直接和后面的层连接进行训练。但实际上会发现GitHub上很多词向量模型是预训练好了的。所以这里采用gensim的word2vector模型进行训练,并存在工程下。词向量维度一般选择50维或几百维,也就1,200维的样子吧
- 输入预处理文件:
这个文件主要做的事情是将数据处理成模型可读入形式。对于Keras的序列模型,结构为: shape=(训练样本数,句子长度,词向量维度)。在句子长度这里,可以选择取最长的句子当作标准,其他句子不足位数填充随机数。这样做有一个缺点就是这个句子真的太长了其他句子再补全也很尴尬,所以也可以限定句子最大长度,超过这个范围字的就不要了。模型的输出是一个矩阵,shape=(训练样本数,每个特征),这个矩阵表示每个样本在每个特征上的概率。
- 模型文件:
Keras搭建模型真的很友好,很舒服。这里选择model的建模方式,当然也可以修改为sequential的建模方式。都贼好用。 模型文件最恼火的地方应该是各种参数这里给出一点点说明,具体更细致的可以查阅官方文档。当然这部分做修改想怎么改怎么改,只要保证连接正确就行 输入层:不考虑到底输入了多少训练样本,只用取指定最大长度和词向量维度 第一层LSTM:单向LSTM就去掉Bidirectional,这里给的双向LSTM做示例,因为之后还要添加层,所以return_sequences给的True,然后merge_mode就指在双向模型里RNN结构型模型(包括,RNN,LSTM,GRU)的融合方法 Dropout层:随机丢弃一定量的神经元。是一种正则化方法,用来防过拟合一般0.5较优。在图像分类任务中和ReLu激活函数结合更优 第二层LSTM:只是想展示单纯灌层是怎样的,没别的意思 SGD:全名stochastic gradient training 一种优化器,用来训练网络的。可调参数多的一匹,其中主要的可调参数有clip,解决梯度爆炸的,在更底层给写死了……,但想调还是能调,lr(learningrate),熟悉的学习率,太小耗时长,太大可能一不小心就荡出了较优范围……取值[0,1] 之后模型开始编译: Compile里面又能写参数,比如怎么样计算损失值,这里用的是交叉熵,还有模型训练的评判标准metries,这里给的是根据准确率。 然后就可以把之前准备好的数据放进模型训练了,这里可以输入batch_size, epochs 这两个参数分别是关于一次喂多少个样本数据和总共训练进行多少次这两个参数具体怎么回事,可以直接跑一跑模型,反正控制台会妥妥的显示出来。同时会发现有些人可能会给一部分叫验证集的东西,一般叫valid,这个数据在格式上和训练集一样的,讲道理可以直接从train的集合中分出来,就算没添加模型也是能跑起来的。这个集合相当于用来验证模型是否准确,为输出最终版模型做准备 然后就是模型保存了,存了以后想怎么调怎么调。
def create_model(self,X,Y):
'''
:param X: 训练集的X
:param Y: 训练集的Y
:return: NULL
'''
inputs = Input(shape=(self.maxlen, self.embedding_size))
lstm = Bidirectional(LSTM(64, return_sequences=True), merge_mode='sum')(inputs)
dropout=Dropout(rate=0.2)(lstm)
lstm2 = LSTM(32)(dropout)
outputs = Dense(self.class_num, activation='softmax')(lstm2)
model = Model(input=inputs, outputs=outputs)
# 编译模型
sgd=SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True, clipnorm=1, clipvalue=0.5)
model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
model.fit(X,Y,batch_size=self.batch_size,epochs=self.epoch)
# 模型存储
model.save(self.save_path)
测试文件:
这个文件一般也是比较简单的,先把文件整理成能够喂到模型里的样子,其实就是和训练集一样的X状态,然后用模型predict就完事了。在keras中predict的返回值会把所有标签的可能性都给出来,是一个numpy数组,所以判断的话还是需要走一遍判断什么的。
for i in range(test_num):
print(np.argmax(result[i,:]))
具体工程代码一会儿再放……