使用Keras处理深度学习中的多分类问题——路透社新闻分类

2023-12-19 09:10

本文主要是介绍使用Keras处理深度学习中的多分类问题——路透社新闻分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

本文将着手构建一个网络,将路透社新闻划分为46个互斥的主题,与二分类问题不同,这是一个多分类问题。

关于二分类问题的处理方式,请参考:使用Keras处理深度学习中的二分类问题——Imdb影评分类。

对于某个新闻,它只能划分到46个类别中的一个,所以这个问题又是单标签、多分类问题。如果每条新闻可以划分到不同的主题,那就是多标签、多分类问题了。

路透社数据集由路透社在1986年发布,包含许多短新闻及其对应的主题,它是一个简单、广泛使用的文本分类数据集。

它包含46个主题,某些主题的样本会比较多,有些比较少,但训练集中每个主题至少有10个样本。

路透社数据集内置于Keras,可以直接加载。

加载数据

代码:

from keras.datasets import reuters(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words = 10000)

查看数据:

在这里插入图片描述

可以把数据解码为新闻文本:

# 将索引解码为新闻文本
path = r"E:\practice\tf2\new_multi_calssify\reuters_word_index.json"
word_index = reuters.get_word_index(path) # 省略 path 默认会下载文件到 C:\Users\Administrator\.keras\datasets
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]])

如下:

在这里插入图片描述

准备数据

对数据进行加工,以便输入到网络:

# 准备数据
import numpy as np# 数据向量化
def vectorize_sequences(sequences, dimension=10000):results = np.zeros((len(sequences), dimension))for i, sequence in enumerate(sequences):results[i, sequence] = 1.return resultsx_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)# 标签向量化,使用one-hot编码,使用Keras内置的函数
from keras.utils.np_utils import to_categoricalone_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)
构建网络

本次仍构建二层密集连接层组成的网络,由于要训练的类别较多,使用64个隐藏单元。使用的函数与二分类中一致:

from keras import models
from keras import layersmodel = 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'])
训练模型

首先从训练数据中留出了用于验证的的数据,训练结果保存在history中,用于绘图查看效果:

# 留出验证数据
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:]# 训练,这里训练了9轮次,因为我已经知道了从9轮次后数据会出现过拟合,你可以先使用较大参数,分析结果后确定一个合适的轮次再训练一遍
history = model.fit(partial_x_train, partial_y_train, epochs = 9, batch_size = 512, validation_data = (x_val, y_val))
绘图表示结果

分别绘制损失曲线和精度曲线:

import matplotlib.pyplot as plt# 损失曲线
loss = history.history['loss']
val_loss = history.history['val_loss']epochs = range(1, len(loss) + 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()acc = history.history['accuracy']
val_acc = history.history['val_accuracy']plt.plot(epochs, acc, 'bo', label = 'Training accuracy')
plt.plot(epochs, val_acc, 'b', label = 'Validation accuracy')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel(Accuracy)
plt.legend()plt.show()

如图:

在这里插入图片描述
在这里插入图片描述

评估并作出预测

直接上代码:

# 评估模型
results = model.evaluate(x_test, one_hot_test_labels)
# 查看结果
results# 在新数据上生成预测
predictions = model.predict(x_test)# 查看结果
predictions[0].shape
np.sum(predictions[0])
np.argmax(predictions[0])

效果如下:

在这里插入图片描述

小结

本例展示了从数据搜集到使用模型预测新数据的整个流程,包括:

  • 数据搜集
  • 数据预处理
  • 构建网络
  • 编译网络
  • 构建验证数据
  • 训练网络
  • 结果绘制
  • 评估模型
  • 预测新数据

这个流程是通用流程,但并非唯一流程,可能会增加一些流程,也可能会减小一些流程,甚至在前述工作基础上,再返回头来调整一些参数,这些都是正常的。

模型能够在前所未有的数据上得到很好的预测结果,这才是终极目标。

参考资料

《Python深度学习》

这篇关于使用Keras处理深度学习中的多分类问题——路透社新闻分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511646

相关文章

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现