上一节我们提到了三个非常经典的问题,他们分别是:

二分类问题(电影评论好坏倾向性判断)

多分类问题(将新闻按照主题分类)

回归问题(根据房地产数据估算房地产价格)

实际的背景是这样的:路透社将新闻分为了 46 个互斥的大类,一篇文章可能归属于其中的一类或多类,我们需要做的就是将新闻报道自动归类。问题不是与上一篇一样的非黑即白、非此即彼类型的判断了,而是考虑每篇文章是不同的各个分类的概率。稍加思考,我们就会发现这个问题虽然与上个问题有如上的不同,但是其相同部分其实更多,我们只需根据不同的特殊情况进行一定的更改就好了。具体的内容下面分别说明,相同部分简略说明,如有疑问请阅读上篇文章:

数据与前文一样,都可进行相同的初始化,即按照索引,将文章数据处理为单词索引的序列串,用 one-hot 方法处理向量使其可以为网络所处理。有区别的是这一次的结果,label 也需要处理,因为结果不是两个值,也是一个张量了。

仍然采用 relu 激活的中间层,投射的空间维度不能是 16 了,这里改成 64,原因是因为结果太多,用十六个维度去包含六十四个结果的信息,会在训练的过程中丢失过多的信息,导致准确率会有较大的下降,因此这里采用 64 层。

对于损失函数,上一篇的 binary_crossentropy 就不够用了,需要修改损失函数,sparse_categorical_crossentropy 适用于多分类情况的损失函数,前者与后者之间只是接口上的不同,需要注意一下。

我们仍旧训练 20 次,也出现了上次的问题,过拟合,只不过这一次是出现在第九次的迭代后,因此我们将迭代此处改为九,重新训练网络。图我放在了代码的前面,可以查看:

最后一层的网络,激活不应该用 sigmoid,而应该用 softmax,这样才能输出类别上的概率分布。这一点与二分类分布不一样。

最后启动训练网络,进行训练,大致可以达到 80% 的准确度。

到这里就结束了,但是还有两个问题值得关注一下。我们用随机分类器随机对文章进行分类,准确率是 19%,上一篇中的二分类的可以达到 50%。我们最后每条测试数据得到的结果是一个 46 维度的向量,是各个类别的概率值,其相加为 1(由于运算精度问题,最后其实是跟 1 有可能有一个很小的偏差),最大概率的类别就是我们的预测类别。相关代码已经在最后给出,可以参考查看。

没有更多新的东西了,就简单介绍这些,图片代码如下给出:

#!/usr/bin/env python3

import copy

import numpy as np

from keras import layers

from keras import models

from keras.datasets import reuters

def classify():

(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)

# print('训练集长度:', len(train_data))

# print('测试集长度:', len(test_data))

# print(train_data[10])

# 查看原文

# word_index = reuters.get_word_index()

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

# decoded_newswire = ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[0]])

# print(decoded_newswire)

# 输出某一标签的分类索引

# print(train_labels[3])

x_train = vectorize_sequences(train_data)

x_test = vectorize_sequences(test_data)

# 将编码转换成张量

# y_train = np.array(train_labels)

# y_test = np.array(test_labels)

one_hot_train_labels = to_one_hot(train_labels)

one_hot_test_labels = to_one_hot(test_labels)

# one_hot_train_labels = to_categorical(train_labels)

# one_hot_test_labels = to_categorical(test_labels)

model = models.Sequential()

model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))

model.add(layers.Dense(64, activation='relu'))

model.add(layers.Dense(46, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

# model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['acc'])

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

x_val = x_train[:1000]

partial_x_train = x_train[1000:]

y_val = one_hot_train_labels[:1000]

partial_y_train = one_hot_train_labels[1000:]

history = model.fit(partial_x_train, partial_y_train, epochs=9, batch_size=512, validation_data=(x_val, y_val))

# 图片输出测试结果

# loss = history.history['loss']

# val_loss = history.history['val_loss']

# epochs = range(1, len(loss) + 1)

# plt.plot(epochs, loss, 'bo', label='训练损失')

# plt.plot(epochs, val_loss, 'b', label='验证损失')

# plt.title('训练损失和验证损失')

# plt.xlabel('迭代')

# plt.ylabel('精度')

# plt.legend()

# plt.show()

# plt.clf()

# acc = history.history['acc']

# val_acc = history.history['val_acc']

# plt.plot(epochs, acc, 'bo', label='训练精度')

# plt.plot(epochs, val_acc, 'b', label='验证精度')

# plt.title('训练精度和验证精度')

# plt.xlabel('迭代')

# plt.ylabel('精度')

# plt.legend()

# plt.show()

results = model.evaluate(x_test, one_hot_test_labels)

# 80%

print(results)

# 如果是随机分类器

test_labels_copy = copy.copy(test_labels)

np.random.shuffle(test_labels_copy)

hits_array = np.array(test_labels) == np.array(test_labels_copy)

# 19%

print(float(np.sum(hits_array)) / len(test_labels))

# 预测值

predictions = model.predict(x_test)

print(predictions[10].shape)

print(np.sum(predictions[10]))

print(np.argmax(predictions[10]))

def vectorize_sequences(sequences, dimension=10000):

results = np.zeros((len(sequences), dimension))

for i, sequence in enumerate(sequences):

results[i, sequence] = 1.

return results

def to_one_hot(labels, dimension=46):

results = np.zeros((len(labels), dimension))

for i, label in enumerate(labels):

results[i, label] = 1.

return results

if __name__ == "__main__":

classify()

python 新闻分类_python实现简单的新闻文章归类相关推荐

  1. 神经网络python实例分类_Python使用神经网络进行简单文本分类

    原文链接:http://tecdat.cn/?p=8613​tecdat.cn 深度学习无处不在.在本文中,我们将使用Keras进行文本分类. 准备数据集 出于演示目的,我们将使用 20个新闻组 数据 ...

  2. python 散点图 分类_Python | 分类图

    python 散点图 分类 Visualizing different variables is also a part of basic plotting. Such variables can h ...

  3. python任务队列框架_Python实现简单多线程任务队列

    def gradient_descent(): # the gradient descent code plotly.write(X, Y) 一般来说,当网络请求 plot.ly 绘图时会阻塞等待返回 ...

  4. python七夕快乐_python编写简单抽奖系统

    python编写简单抽奖系统 #!/usr/bin/env python #coding=utf-8 from Tkinter import * import time import random c ...

  5. 往邮箱里发python怎么发_Python 超简单的邮件发送方法

    在训练网络模型的时候,往往需要好几个小时,甚至十几个小时,由于时间不固定,所以有时候我去查看了好几次都没训练完,有时候训练结束很久了我才想起去看,所以我就想训练结束后自动给我发个邮件,这样我就可以专心 ...

  6. python基本统计量_Python中简单统计量的计算

    本篇文章给大家带来的内容是关于Python中简单统计量的计算,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.这些操作都要确保已经在电脑中安装好了Anaconda集成库,如果安装好 ...

  7. python迭代算法_Python实现简单的梯度下降法

    Python 实现简单的梯度下降法 机器学习算法常常可以归结为求解一个最优化问题,而梯度下降法就是求解最优化问题的一个方法. 梯度下降法(gradient descent)或最速下降法(steepes ...

  8. 用python写石头剪刀布_Python实现简单石头剪刀布游戏

    近日在学习Python的一些基础知识,觉得还是很有趣的一个一门语言!就目前的学习的一些知识,编写了一些一个简单的石头剪刀布的游戏.主要是熟悉一些Python的一些控制语句. import random ...

  9. python server酱_Python 超简单的邮件发送方法

    在训练网络模型的时候,往往需要好几个小时,甚至十几个小时,由于时间不固定,所以有时候我去查看了好几次都没训练完,有时候训练结束很久了我才想起去看,所以我就想训练结束后自动给我发个邮件,这样我就可以专心 ...

  10. python 伪多线程_Python实现简单多线程任务队列

    最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题.梯度下降算法的代码如下(伪代码): 1 2 3 def gradient_descent(): # the gradient de ...

最新文章

  1. Makefile (2) gdb
  2. 牛人博客!!!各大招聘网站信息实时查询浏览【转】
  3. Linux课2021
  4. 当代计算机技术在建筑设备中的应用,智能化建筑中计算机技术应用研究原稿(样例3)...
  5. python里混淆矩阵 左下角为漏报,右上角为误报
  6. 面试mysql中怎么创建索引_阿里面试:MySQL如何设计索引更高效?
  7. 架构师接龙:百姓网潘晓良VS. 盛大许式伟
  8. android_secure写权限,android.permission.WRITE_SECURE_SETTINGS权限报错
  9. JDK1.8 LinkedHashMap源码
  10. python字典统计字母出现次数_第三篇 python运用字典统计字符串中字母出现的次数...
  11. python爬贴吧回复内容_Python爬虫_获取贴吧内容
  12. 梅森质数(2^n - 1是质数,则n是质数)的证明
  13. matlab马赫带,学习实现马赫带效果
  14. 你好,CSDN,我来了。我想在这里记录我的学习和分享知识教程
  15. 电脑哪个服务器可以玩无限连击,无尽之剑3手把手教你无限连击攻略
  16. elasticsearch进阶(3)—— ilm policy
  17. 夜神模拟器的安装和使用
  18. JS实现强制回收内存方法两则
  19. 黑科技网站第三弹 怀旧游戏集锦
  20. C语言见缝插针游戏,见缝插针游戏,见缝插针游戏图片

热门文章

  1. java证明角谷猜想_Java程序(角谷猜想,applet) -
  2. PR——轨道遮罩-玻璃滑动效果
  3. python3修改pip执行环境和安装软件源
  4. quartus ii
  5. 单片机移位操作;_crol_ 和_cror_ 的使用
  6. 《AutoCAD全套园林图纸绘制自学手册》一2.4 文件管理
  7. 大于一千的最小质数c语言,c语言找出大于m的最小素数
  8. 高通开发-烧写及异常启动分析
  9. 大前端之js导入导出
  10. hdu1166敌兵布(线段树模板题)