TensorFlow实战:IMDb数据集文本分类初探

1.导入tensofow和keras

import tensorflow as tf
from tensorflow import keras

2.导入辅助库

import numpy as np
print(tf.__version__)

3.导入imdb数据集

imdb=keras.datasets.imdb
(train_data,train_labels),(test_data,test_labels)=imdb.load_data(num_words=10000)


4.探索数据

# =============================================================================
# 该数据集每个样本都是一个整数数组,表示影评中的字词;
# 每个标签都是0或者1,0表示负面影评,1表示正面影评
# =============================================================================
#格式化输出
print("Training entries:{},labels:{}".format(len(train_data),len(train_labels)))
#输出第一条影评,影评文本为一个整数数组
print(train_data[0])
#影评长度可能有所不同,在传入神经网络之前,必须使其具有相同的长度
print("len(train_data[0]):",len(train_data[0]),"\nlen(train_data[1]):",len(train_data[1]))


5.将整数转换为字词

#创建一个辅助函数,来查询包含整数到字符串映射的字典对象
# A dictionary mapping words to an integer index
word_index = imdb.get_word_index()

# The first indices are reserved
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNK>"] = 2  # unknown
word_index["<UNUSED>"] = 3

reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])

def decode_review(text):
    return ' '.join([reverse_word_index.get(i, '?') for i in text])
#显示第一条影评文本
print(decode_review(train_data[0]))

6.数据预处理

# =============================================================================
# 影评(整数数组)必须转换为张量,才能馈送到神经网络中
# 1.对数组进行独热编码,将他们转换为由0和1构成的向量。将它作为网络层的第一层,
# 一个可以处理浮点向量数据的密集层。这种方法会占用大量内存,需要一个大小为
# num_words*num_reviews的矩阵
# 2.填充数组,使他们具有相同的长度,创建一个形状为max_length*num_reviews的整数张量。
# 我们可以使用一个能处理这种形状的嵌入层作为网络中的第一层
# =============================================================================
#由于影评长度必须相同,使用pad_sequences函数将长度标准化
train_data=keras.preprocessing.sequence.pad_sequences(train_data,value=word_index["<PAD>"],padding='post',
                                                      maxlen=256)
test_data=keras.preprocessing.sequence.pad_sequences(test_data,value=word_index["<PAD>"],padding='post',maxlen=256)
print(len(train_data[0]),len(train_data[1]))
#检查已填充的第一条影评
print(train_data[0])

7.构建模型

# =============================================================================
# 神经网络通过堆叠层创建而成,这需要做出两个架构方面的主要决策:
# 1.要在模型中用多少个层?
# 2.要针对每个层使用多少个隐藏单元?
# =============================================================================
#input shape is the vocabulary count used for the movie reviews(10000 words)
vocab_size=10000

model=keras.Sequential()
model.add(keras.layers.Embedding(vocab_size,16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16,activation=tf.nn.relu))
model.add(keras.layers.Dense(1,activation=tf.nn.sigmoid))
model.summary()
# =============================================================================
# 按顺序堆叠各个层以构建分类器:
# 1。第一层是Embedding层。该层会在整数编码的词汇表中查找每个字词—索引的嵌入向量。
# 模型在接受训练时会学习这些向量。这些向量会向输出数组添加一个维度。
# 生成的维度为:(batch,sequence,embedding)
# 2.第二层是GlobalAveragePooling1D层,通过对序列维度求平均值,针对每个样本返回
# 一个长度固定的输出向量。这样,模型能够以尽可能简单的方式处理各种长度的输入。
# 3.该长度固定的输出向量会传入一个全连接(Dense)层(包含16个隐藏单元)
# 4.最后一个与单个输出节点密集连接。应用sigmoid激活函数后,结果是介于0到1之间
# 浮点值,表示概率或置信水平。
# =============================================================================


8.编译模型

#binary_crossentropy损失函数,
model.compile(optimizer=tf.train.AdamOptimizer(),
              loss='binary_crossentropy',
              metrics=['accuracy'])

9.创建验证集

# =============================================================================
# 在训练时,我们需要检查模型处理从未见过的数据的准确率。从原始训练数据中
# 分离出10000个样本,创建一个验证集。
# =============================================================================
x_val=train_data[:10000]
partial_x_train=train_data[10000:]

y_val=train_labels[:10000]
partial_y_train=train_labels[10000:]

10.训练模型

history=model.fit(partial_x_train,partial_y_train,epochs=40,\
                  batch_size=512,validation_data=(x_val,y_val),\
                  verbose=1)

11.评估模型

results=model.evaluate(test_data,test_labels)
print("results:",results)

12.创建准确率和损失随时间变化的图

history_dict=history.history
history_dict.keys()

import matplotlib.pyplot as plt

acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']

epochs=range(1,len(acc)+1)

plt.plot(epochs,loss,'bo',label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()

plt.clf()   # clear figure
acc_values = history_dict['acc']
val_acc_values = history_dict['val_acc']

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()

plt.show()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值