深度学习2:多分类问题
原创
©著作权归作者所有:来自51CTO博客作者龙崎流河的原创作品,请联系作者获取转载授权,否则将追究法律责任
与上一节类似的解释就不多重复了
路透社数据
包含许多短新闻以及其对应的主题,它是一个简单的,广泛使用的文本分类数据集,它包含46个不同的主题,某些主题的样本更多,但训练集中每个主题都有至少10个样本,也是keras内置的一部分。
加载数据集
(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)
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)
)
绘制图像后显示:

完整代码
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]))

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