与上一节类似的解释就不多重复了

路透社数据

包含许多短新闻以及其对应的主题,它是一个简单的,广泛使用的文本分类数据集,它包含46个不同的主题,某些主题的样本更多,但训练集中每个主题都有至少10个样本,也是keras内置的一部分。
加载数据集

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

深度学习2:多分类问题_深度学习


每个样本都是一个整数列表

深度学习2:多分类问题_数据集_02


准备数据

def vectorize_sequences(sequences,dimension=10000):
results = np.zeros((len(sequences),dimension))
for i,sequence in enumerate(sequences):
results[i, sequence] = 1.
return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
#keras内置方法实现操作
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)

模型定义
最后一层是大小为46的Dense层,意味着对于每个输入样本网络都会输出一个46维向量,这个向量每个维度代表不同的输出类别。
最后一层使用了softmax激活函数,网络将输出在46个不同输出类别的概率分布,对于每个输入样本网络都会输出一个46维向量,46个概率总和为1。

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'))

编译模型
对于这个模型最好的损失函数是categorical_crossentropy,即分类交叉熵

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

验证方法

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=20,
batch_size=512,
validation_data=(x_val,y_val)
)

绘制图像后显示:

深度学习2:多分类问题_数据集_03


完整代码

from tensorflow.keras.datasets import reuters
import numpy as np
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import models, layers

(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)
def vectorize_sequences(sequences,dimension=10000):
results = np.zeros((len(sequences),dimension))
for i,sequence in enumerate(sequences):
results[i, sequence] = 1.
return results
x_train = vectorize_sequences(train_data)
y_train = to_categorical(train_labels)
x_test = vectorize_sequences(test_data)
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.Dropout(0.5))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(46, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(
x_train,
y_train,
epochs=9,
batch_size=512
)
results = model.evaluate(x_test,one_hot_test_labels)
print(results)
prediction = model.predict(x_test)
#最大元素就是预测类别,也就是概率最大的类别
print(np.argmax(prediction[0]))

深度学习2:多分类问题_数据集_04


中间层的维度需要足够大,最后输出是46维的,因此中间层的隐藏单元个数不应该比46小太多,小太多会造成信息瓶颈,因为这将会将大量信息压缩到维度很小的中间空间,网络能够将大部分必要信息塞入这个数量少的维表示中,但并不是全部信息。