深度学习

准备数据、构建网络、编译模型

2019-03-12  本文已影响0人  庵下桃花仙

准备数据

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)。衡量两个概率分布之间的距离,即网络输出的概率分布和标签的真实分布。

上一篇 下一篇

猜你喜欢

热点阅读