前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习-多分类问题

深度学习-多分类问题

作者头像
火星娃统计
发布2020-09-15 15:13:10
6870
发布2020-09-15 15:13:10
举报
文章被收录于专栏:火星娃统计火星娃统计

深度学习-多分类问题

概述

数据来自路透社数据集,为kersa库自带的数据,包含不同的主题,每个主题最少有10个样本

代码

代码语言:javascript
复制
#导入数据
from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
num_words=10000)# 数num_words=10000 将数据限定为前10 000 个最常出现的单词
代码语言:javascript
复制
Using TensorFlow backend.


Downloading data from https://s3.amazonaws.com/text-datasets/reuters.npz
2113536/2110848 [==============================] - 7s 4us/step
代码语言:javascript
复制
len(train_data)# 训练数据为8982
len(test_data)# 测试数据为2246
# 训练集为多个list的组合
#测试集为一列数字
代码语言:javascript
复制
2246
代码语言:javascript
复制
#对索引解码
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]])
# 通过字典可以讲字符组合
代码语言:javascript
复制
Downloading data from https://s3.amazonaws.com/text-datasets/reuters_word_index.json
557056/550378 [==============================] - 5s 10us/step
代码语言:javascript
复制
# 编码数据向量化
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)
代码语言:javascript
复制
# 标签向量化
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)
代码语言:javascript
复制
# 定义模型
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类
代码语言:javascript
复制
# 添加模型参数
model.compile(optimizer='rmsprop',# 模型优化器
    loss='categorical_crossentropy',#损失函数为分类交叉熵
    metrics=['accuracy'])# 目标函数为准确率
代码语言:javascript
复制
# 设置验证集
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:]
代码语言:javascript
复制
# 开始训练
history = model.fit(partial_x_train,
                    partial_y_train,
                    epochs=20,# 执行20次迭代
                    batch_size=512,
                    validation_data=(x_val, y_val))# 验证
代码语言:javascript
复制
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
代码语言:javascript
复制
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()
代码语言:javascript
复制
# 绘制精确度
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 轮后开始过拟合(第九个迭代时验证集精确度不再增加)

代码语言:javascript
复制
# 重新训练神经网络
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
代码语言:javascript
复制
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,第一个数为损失

代码语言:javascript
复制
# 对新数据进行预测
predictions = model.predict(x_test)
predictions[0].shape
# predictions为46个类别的预测概率
# 判定的依据是最大概率为可能的分类
代码语言:javascript
复制
(46,)

什么是one-hot编码

  • 问题 最近做这几个项目,一直有这个东西萦绕在我的脑海,久久不能释怀,主要是书里的代码写的太复杂,影响到了理解,其实one-hot就是一开始学习统计分析对分类变量的哑变量设置
  • 为什么要这么做? 按道理神经网络可以处理这样的因子类型,并不需要这样处理,后来明白了,如果将分类变量放入一列,那么对于其他变量就整合了(类似于长数据),在训练神经网络的过程中,这种整合的运算会有可能对数据加权求均值,那么这样的运算就会丢失分类的信息,这样训练的模型精度就会差很多

结束语

love&peace

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 火星娃统计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 深度学习-多分类问题
    • 概述
      • 代码
        • 什么是one-hot编码
          • 结束语
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档