DatawhaleChina -任务一 IMDB数据集+THUCNews数据集

预备任务

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 就是 分类1
    else :
        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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值