深度学习-多分类问题
时间:2022-07-25
本文章向大家介绍深度学习-多分类问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
深度学习-多分类问题
概述
数据来自路透社数据集,为kersa库自带的数据,包含不同的主题,每个主题最少有10个样本
代码
#导入数据
from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
num_words=10000)# 数num_words=10000 将数据限定为前10 000 个最常出现的单词
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/text-datasets/reuters.npz
2113536/2110848 [==============================] - 7s 4us/step
len(train_data)# 训练数据为8982
len(test_data)# 测试数据为2246
# 训练集为多个list的组合
#测试集为一列数字
2246
#对索引解码
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]])
# 通过字典可以讲字符组合
Downloading data from https://s3.amazonaws.com/text-datasets/reuters_word_index.json
557056/550378 [==============================] - 5s 10us/step
# 编码数据向量化
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))# 0矩阵,2262行1000列
for i, sequence in enumerate(sequences):#enumerate() 函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标
results[i, sequence] = 1.
return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
# 标签向量化
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
one_hot_train_labels = to_one_hot(train_labels)
one_hot_test_labels = to_one_hot(test_labels)
# 定义模型
from keras import models
from keras import layers
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'))# 最终的分类为46类
# 添加模型参数
model.compile(optimizer='rmsprop',# 模型优化器
loss='categorical_crossentropy',#损失函数为分类交叉熵
metrics=['accuracy'])# 目标函数为准确率
# 设置验证集
x_val = x_train[:1000]# 验证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=20,# 执行20次迭代
batch_size=512,
validation_data=(x_val, y_val))# 验证
Train on 7982 samples, validate on 1000 samples
Epoch 1/20
7982/7982 [==============================] - 1s 98us/step - loss: 2.7797 - accuracy: 0.5312 - val_loss: 1.8418 - val_accuracy: 0.6360
Epoch 2/20
7982/7982 [==============================] - 0s 62us/step - loss: 1.4911 - accuracy: 0.6974 - val_loss: 1.3655 - val_accuracy: 0.7100
Epoch 3/20
7982/7982 [==============================] - 0s 60us/step - loss: 1.0956 - accuracy: 0.7602 - val_loss: 1.1734 - val_accuracy: 0.7400
Epoch 4/20
7982/7982 [==============================] - 0s 59us/step - loss: 0.8541 - accuracy: 0.8187 - val_loss: 1.0490 - val_accuracy: 0.7850
Epoch 5/20
7982/7982 [==============================] - 0s 59us/step - loss: 0.6788 - accuracy: 0.8568 - val_loss: 0.9739 - val_accuracy: 0.7950
Epoch 6/20
7982/7982 [==============================] - 0s 58us/step - loss: 0.5393 - accuracy: 0.8894 - val_loss: 0.9662 - val_accuracy: 0.7860
Epoch 7/20
7982/7982 [==============================] - 0s 59us/step - loss: 0.4347 - accuracy: 0.9090 - val_loss: 0.9183 - val_accuracy: 0.8060
Epoch 8/20
7982/7982 [==============================] - 0s 58us/step - loss: 0.3533 - accuracy: 0.9270 - val_loss: 0.9319 - val_accuracy: 0.7990
Epoch 9/20
7982/7982 [==============================] - 0s 61us/step - loss: 0.2924 - accuracy: 0.9371 - val_loss: 0.8917 - val_accuracy: 0.8180
Epoch 10/20
7982/7982 [==============================] - 0s 58us/step - loss: 0.2459 - accuracy: 0.9444 - val_loss: 0.9028 - val_accuracy: 0.8180
Epoch 11/20
7982/7982 [==============================] - 0s 58us/step - loss: 0.2146 - accuracy: 0.9465 - val_loss: 0.9152 - val_accuracy: 0.8160
Epoch 12/20
7982/7982 [==============================] - 0s 58us/step - loss: 0.1849 - accuracy: 0.9509 - val_loss: 0.9823 - val_accuracy: 0.8040
Epoch 13/20
7982/7982 [==============================] - 0s 60us/step - loss: 0.1668 - accuracy: 0.9530 - val_loss: 0.9608 - val_accuracy: 0.8070
Epoch 14/20
7982/7982 [==============================] - 0s 62us/step - loss: 0.1562 - accuracy: 0.9545 - val_loss: 0.9910 - val_accuracy: 0.8080
Epoch 15/20
7982/7982 [==============================] - 0s 61us/step - loss: 0.1412 - accuracy: 0.9541 - val_loss: 0.9723 - val_accuracy: 0.8130
Epoch 16/20
7982/7982 [==============================] - 0s 60us/step - loss: 0.1300 - accuracy: 0.9573 - val_loss: 1.0508 - val_accuracy: 0.8030
Epoch 17/20
7982/7982 [==============================] - 0s 58us/step - loss: 0.1265 - accuracy: 0.9565 - val_loss: 1.0783 - val_accuracy: 0.7950
Epoch 18/20
7982/7982 [==============================] - 0s 59us/step - loss: 0.1201 - accuracy: 0.9546 - val_loss: 1.0738 - val_accuracy: 0.8030
Epoch 19/20
7982/7982 [==============================] - 0s 59us/step - loss: 0.1163 - accuracy: 0.9554 - val_loss: 1.0397 - val_accuracy: 0.8160
Epoch 20/20
7982/7982 [==============================] - 0s 58us/step - loss: 0.1122 - accuracy: 0.9568 - val_loss: 1.0825 - val_accuracy: 0.8090
import matplotlib.pyplot as plt# 导入matplotlib
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()
# 绘制精确度
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
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()
从上面的图可以看出网络在训练9 轮后开始过拟合(第九个迭代时验证集精确度不再增加)
# 重新训练神经网络
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.fit(partial_x_train,
partial_y_train,
epochs=9,# 这里的迭代次数选择9
batch_size=512,
validation_data=(x_val, y_val))
results = model.evaluate(x_test, one_hot_test_labels)
results
Train on 7982 samples, validate on 1000 samples
Epoch 1/9
7982/7982 [==============================] - 1s 82us/step - loss: 2.6067 - accuracy: 0.5381 - val_loss: 1.7146 - val_accuracy: 0.6550
Epoch 2/9
7982/7982 [==============================] - 0s 58us/step - loss: 1.3859 - accuracy: 0.7076 - val_loss: 1.2856 - val_accuracy: 0.7240
Epoch 3/9
7982/7982 [==============================] - 0s 58us/step - loss: 1.0247 - accuracy: 0.7813 - val_loss: 1.1473 - val_accuracy: 0.7420
Epoch 4/9
7982/7982 [==============================] - 0s 58us/step - loss: 0.8143 - accuracy: 0.8235 - val_loss: 1.0376 - val_accuracy: 0.7820
Epoch 5/9
7982/7982 [==============================] - 0s 58us/step - loss: 0.6458 - accuracy: 0.8648 - val_loss: 0.9959 - val_accuracy: 0.7920
Epoch 6/9
7982/7982 [==============================] - 0s 57us/step - loss: 0.5195 - accuracy: 0.8901 - val_loss: 0.9377 - val_accuracy: 0.8040
Epoch 7/9
7982/7982 [==============================] - 0s 56us/step - loss: 0.4196 - accuracy: 0.9128 - val_loss: 0.9240 - val_accuracy: 0.8120
Epoch 8/9
7982/7982 [==============================] - 0s 55us/step - loss: 0.3369 - accuracy: 0.9295 - val_loss: 0.8785 - val_accuracy: 0.8150
Epoch 9/9
7982/7982 [==============================] - 0s 55us/step - loss: 0.2789 - accuracy: 0.9376 - val_loss: 0.9101 - val_accuracy: 0.8060
2246/2246 [==============================] - 0s 69us/step
[0.9737234661224583, 0.7867319583892822]
最终的测试集精确度为0.79,第一个数为损失
# 对新数据进行预测
predictions = model.predict(x_test)
predictions[0].shape
# predictions为46个类别的预测概率
# 判定的依据是最大概率为可能的分类
(46,)
什么是one-hot编码
- 问题 最近做这几个项目,一直有这个东西萦绕在我的脑海,久久不能释怀,主要是书里的代码写的太复杂,影响到了理解,其实one-hot就是一开始学习统计分析对分类变量的哑变量设置
- 为什么要这么做? 按道理神经网络可以处理这样的因子类型,并不需要这样处理,后来明白了,如果将分类变量放入一列,那么对于其他变量就整合了(类似于长数据),在训练神经网络的过程中,这种整合的运算会有可能对数据加权求均值,那么这样的运算就会丢失分类的信息,这样训练的模型精度就会差很多
结束语
love&peace
- Hadoop数据分析平台实战——120Hive Shell命令介绍 01(熟悉Hive略过)离线数据分析平台实战——120Hive Shell命令介绍 01(熟悉Hive略过)
- HUST 1588 辗转数对
- HUST 1584 摆放餐桌
- HUST 1585 排队
- 【QQ/微信个人号变身机器人】炸群+远程监控个人PC的尝试
- HUST 1583 长度单位
- FZU 2167 大王叫我来巡山呐
- HDU 1021 Fibonacci Again
- Hadoop数据分析平台实战——180Oozie工作流使用介绍离线数据分析平台实战——180Oozie工作流使用介绍
- 博弈论及算法实现
- Hadoop数据分析平台实战——160Sqoop介绍离线数据分析平台实战——160Sqoop介绍
- HDU 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
- Hadoop数据分析平台实战——150Flume介绍离线数据分析平台实战——150Flume介绍
- Codeforces 714A Meeting of Old Friends
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 三种动态控制SAP CRM WebClient UI assignment block显示与否的方法
- TCGA数据库中癌症名称缩写
- CloudFlare自定义节点优化网站
- 什么是SSL?为什么要为WordPress网站使用SSL?
- R语言再保险合同定价案例研究
- SAP CRM附件的技术属性设计原理
- R语言对混合分布中的不可观测与可观测异质性因子分析
- R替换函数gsub
- R语言泊松回归对保险定价建模中的应用:风险敞口作为可能的解释变量
- asp dotnet core 提供大文件下载的测试
- R语言模拟人类生活预期寿命动态可视化动画图gif
- Python遍历字典
- R语言随机森林模型中具有相关特征的变量重要性
- WPF 使用 Direct Manipulation 的方法
- R语言分析负利率下金融市场:负利率和年金价值的变化