Python深度学习--学习笔记(十)

用词嵌入的方式训练imdb正负面评价模型

Python 深度学习–学习笔记(二)中,我们学习到用全连接层训练分辨imdb评论正负面的模型,这里稍做回顾:
[1] 导入数据
[2] 将数据转化为one-hot编码
[3] 构建模型:
1
[4] 编译,训练模型
[5] 评估模型

在导入数据时,我们人为地规定导入不同的单词数最多不超过10 000个:

(x_train,y_train),(x_test,y_test) = imdb.load_data(num_words=10000)

再将其one-hot处理成(samples,10000)的数据,其中每一层代表一个单词编码的位置:
2
不难察觉,一层只代表一个单词未免也太浪费空间资源了,我们有没有办法将数据表示成密集,低维的数组,并且其可以被机器学习呢?有,词嵌入
————————————————————————————————————————————————————

词嵌入 就是将一个单词转化为一个 a 维向量,假设每句话人为规定在 m 个单词,则一则评论就可以转化为(1,m,a),如果有 n 则评论,则组成(n,m,a)的样本,这样的数据同样也可以被机器学习,并可以调整每个单词向量内部的数值而达到提升的准确度目的。

keras有提供类似的层————Embedding()

简单看一行代码:

model.add(Embedding(10000,10,input_length=20))

词嵌入层一般在模型的第一层
其中我们输入的是单词的序列,这里限制在20个单位长度,也就是每则评论在20个单词。10000 代表这个Embedding层必须要能处理10000个单词的向量转化,每个单词转化为10维的向量。

故,这层的输出是:(None,20,10)              (第一维取决于样本数量)

按照本书(《Python 深度学习》)作者的建议,最好将Embedding层理解为一个字典,将整数索引(表示特定单词)映射为密集向量。它接收整数作为输入,并在内部字典中查找这些整数,然后返回相关联的向量。Embedding 层实际上是一种字典查找。

                                                        单词索引 —> Embedding层 —> 对应的词向量

现在,想必大家已经对Embedding层有一定的认识了。下面,让我们完成今天的任务:用词嵌入的方式训练imdb正负面评价模型

from keras.datasets import imdb
from keras import preprocessing
from keras.models import Sequential
from keras.layers import Flatten,Dense,Embedding,Dropout

#准备数据
max_features = 10000 #特征单词个数
max_len = 20

(x_train,y_train),(x_test,y_test) = imdb.load_data(num_words=max_features)

x_train =  preprocessing.sequence.pad_sequences(x_train,maxlen=maxlen)
x_test =  preprocessing.sequence.pad_sequences(x_test,maxlen=maxlen)
# print(x_train.shape) #(25000, 20)

#构建模型
model = Sequential()
model.add(Embedding(10000,10,input_length=max_len))
#每个单词转化为一个10维向量,每段评论有20个单词
#由于单词的范围在10 000个单词中,所以需要10 000对应参数(想成字典)
#输出(samples,max_len,10)
model.add(Flatten())
model.add(Dense(1,activation='sigmoid'))

#编译模型
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['acc'])

history = model.fit(x_train,
                    y_train,
                    epochs=10,
                    batch_size=32,
                    validation_split=0.2)
#validation_split用于在没有提供验证集的时候,按一定比例从训练集中随机取出规定比例作为验证集,这里是取训练集的百分之二十

这里值得说的一点是:preprocessing.sequence.pad_sequences(x_train,maxlen=max_len)
就是将 x_train 里的每条数据截取前max_len个长度,即 将每条评论截取前20个单词的索引,返回的(x_train.shape[0],max_len)的形状,这样才能传入输入层。

数据可视化

import matplotlib.pyplot as plt

loss = history.history['acc']
val_loss = history.history['val_acc']
epochs = range(1, len(acc) + 1)
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training accuracy')
plt.plot(epochs, val_loss, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()
plt.show()

输出:
3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值