准备数据
import numpy as np
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) # 将测试数据向量化
标签向量化
标签向量化有两种方法:
1、将标签列表转换为整数张量;
2、one-hot 编码。
上述例子即为 one-hot 编码,每个标签标示为全零向量,只有标签索引对应的元素为1
# 标签向量化
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) # 将测试标签向量化
另外,Keras内置方法也可实现这个操作
from keras.utils.np_utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)
构建网络
与IMDB相比,输出类别数量变为46,输出空间维度大的多。Dense层的堆叠,每层只能访问上一层输出的信息,如果某一层丢失信息,则无法找回,因此,为了避免信息瓶颈,则采用维度更大的层。
模型定义
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'))
注意两点:
1、最后一层输出46维的向量,向量的每个维度代表不同的输出类别;
2、最后激活函数为softmax
。输出为在46个不同输出类别上的概率分布,output[i] 表示样本属于第 i 个类别的概率。46个概率综合为1。
编译模型
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
多元分类交叉熵(categorical_crossentropy)。衡量两个概率分布之间的距离,即网络输出的概率分布和标签的真实分布。
网友评论