keras搭建神经网络分类新闻主题

from keras.datasets import reuters
import numpy as np
from keras import models
from keras import layers
from keras.optimizers import RMSprop
from keras.losses import categorical_crossentropy
'''
数据集介绍:
用路透社数据集,它包含许多短新闻及其对应的主题,由路透社在 1986 年发布。它
是一个简单的、广泛使用的文本分类数据集。它包括 46 个不同的主题:某些主题的样本更多,
但训练集中每个主题都有至少 10 个样本。
'''

#  载入数据(参数 num_words=10000 将数据限定为前 10 000 个最常出现的单词)
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)

#  先来看看数据集大小(训练集8982个,测试集2246个)
print(train_data.shape)
print(train_data[0])
print(train_labels)
print(test_data.shape)
print(test_data[0])

# 使用one-hot编码,使列表转化为大小一致的张量
def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))  #  创建一个sequences行,10000列的0向量
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1  #  将单词出现指定处置为1
    return results

#  对数据编码
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

#  进行One-hot编码
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编码
one_hot_train_labels = to_one_hot(train_labels)
one_hot_test_labels = to_one_hot(test_labels)


#  准备好了数据,接下来就可以构建网络啦
model = models.Sequential()
model.add(layers.Dense(units=64, activation='relu', input_shape=(10000, )))
model.add(layers.Dense(units=64, activation='relu'))
model.add(layers.Dense(units=46, activation='softmax'))  # 一共46类

model.compile(optimizer=RMSprop(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])


#  开始训练网络
model.fit(x_train, one_hot_train_labels, epochs=4, batch_size=128, validation_data=[x_test, one_hot_test_labels])

# 来在测试集上测试一下模型的性能吧
test_loss, test_accuracy = model.evaluate(x_test, one_hot_test_labels)
print("test_loss:", test_loss, "    test_accuracy:", test_accuracy)

#  保存模型
model.save('retuters.json')

几点说明:

  • 网络的最后一层是大小为 46 的 Dense 层。这意味着,对于每个输入样本,网络都会输出一个 46 维向量。这个向量的每个元素(即每个维度)代表不同的输出类别。
  • 最后一层使用了 softmax 激活。网络将输出在 46个不同输出类别上的概率分布——对于每一个输入样本,网络都会输出一个 46 维向量,其中 output[i] 是样本属于第 i 个类别的概率。46 个概率的总和为 1。对于单标签、多分类问题,网络的最后一层应该使用 softmax 激活,这样可以输出在 N个输出类别上的概率分布。
  • 最终输出是 46 维的,因此中间层的隐藏单元个数不应该比 46 小太多。
  • 这种问题的损失函数几乎总是应该使用分类交叉熵。它将网络输出的概率分布与目标的真实分布之间的距离最小化。

结果如下:

在这里插入图片描述

你可能感兴趣的:(机器学习)