预备任务
tensorflow 早已安装好,都有跑模型,莫烦先生的视频也都看了,基础知识有了解,都很OK。
IMDB数据集下载和探索
整体思路:
- 特征
特征就是 one-hot 形式,选取10000个频率在前的单词,然后对每一个文档处理成这10000维度的向量。
文档里包含这个单词,向量中这个单词的索引位置就是1,否则就是0,总的样本空间就是 10000 * docNum。 - 网络
代码部分:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import imdb
import numpy as np
import matplotlib.pyplot as plt### 将数据处理,利用one - hot 模型,把数据转换成数字(train_data, train_labels), (test_data, test_labels) = keras.datasets.imdb.load_data(num_words=10000)def vectorize_sequences(sequences, dimension=10000):results = np.zeros((len(sequences), dimension))for i, sequence in enumerate(sequences):results[i, sequence] = 1. # 索引results矩阵中的位置,赋值为1,全部都是从第0行0列开始的return results# Our vectorized training data
x_train = vectorize_sequences(train_data)
# Our vectorized test data
x_test = vectorize_sequences(test_data)y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')
print(x_train.shape())# 拆分数据
x_val = x_train[:10000]
partial_x_train = x_train[10000:]y_val = y_train[:10000]
partial_y_train = y_train[10000:]model = keras.Sequential()
# model = keras.models.Sequential()model.add(keras.layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid')) # 一个输出层## 定义误差
model.compile(optimizer=optimizers.RMSprop(lr=0.001),loss=keras.losses.binary_crossentropy,metrics=[keras.metrics.binary_accuracy])# 开始训练
history = model.fit(partial_x_train,partial_y_train,epochs=20,batch_size=512,validation_data=(x_val, y_val))# 获取训练过程中的一些数据指标
history_dict = history.history
history_dict.keys()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)## 误差绘图# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss') # bo表示蓝色圆点,训练的误差
# b is for "solid blue line"
plt.plot(epochs, val_loss, 'b', label='Validation loss') # b表示蓝色实线,实际误差
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('Loss')
plt.legend()plt.show()# 将概率装换成 具体的分类结果,分类结果为1,或者 0
results = model.evaluate(x_test, y_test)
y_pre = model.predict(x_test)result = []
for i in y_pre:if i > 0.5:result.append[1] # 概率大于 0.5 就是 分类1else :result.append(0) # 否则概率就是 0
最后需要选择损失函数和优化器,由于面对的是一个二分类问题,网络输出是一个概率值,那么最好使用binary_crossentropy(二元交叉熵)。对于输出概率值的模型,交叉熵(crossentropy)往往是最好的选择
主要是分析数据,对数据进行代码了解,可以自己使用其他模型来尝试。
THUCNews
这是一个中文多分类数据集,数据集还是蛮大的,75万篇新闻,2.19G左右,分类结果主要分为:体育,娱乐,家居,彩票,房产,教育,时尚,时政,星座,游戏,社会,科技,股票,财经
。数据集比较大,这里就不展示元数据信息了,大家可以查看官方网站:THUCTC: 一个高效的中文文本分类工具包
网上有很多关于该数据集的CNN代码,大部分人的思路都是统计高频词汇,10000个高频词汇,然后把文章装换为词频向量,作为神经网络的输入。也有思路是利用TF-IDF来提取关键词,取关键词的前10000个用来文档向量化,当然也可以通过其他特征来做模型。这个数据集太大了,普通机器跑很容易系统崩溃,所以最好是有GPU的机器来做这件事。
参考资料
电影评论分类:二分类问题(IMDB数据集)
Text Classification with CNN and RNN