二进制编码或填充神经网络中的输入序列?

Binary encoding or padding the input sequence in neural network?

首先,我是深度学习和神经网络的新手,但我在网上找不到这个问题的答案。我正在尝试对 Keras 的路透社数据集进行分类,结果是当我像下面这样填充序列输入时:

x_train = pad_sequences(x_train, maxlen=10000)
x_test = pad_sequences(x_test, maxlen=10000)

准确率不会超过42%;但是,当我这样做时使用相同的模型 二值向量化,准确率可达95%。这是二进制矢量化代码:

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(x_train)
x_test = vectorize_sequences(x_test)

这是图层:

model = models.Sequential()
model.add(layers.Dense(64, activation="relu", input_shape=x_train[0].shape))
model.add(layers.Dense(64, activation="relu"))
model.add(layers.Dense(46, activation='softmax'))
model.compile(optimizer='rmsprop', loss=losses.categorical_crossentropy, metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=512, epochs=20)

这两种方法的区别是什么导致了如此巨大的结果差异?还是我做错了什么?

Keras 中的路透社数据集表示为单词的整数索引。例如,文本 "On Friday there was a wildfire in California" 已表示为数组 [7, 18, 3, 673, 2, 73, 89, 7643](即对应于每个单词的一个整数索引)。这种表示对于可以将这些整数映射到数字表示的模型很有用,例如包含嵌入层的模型。但是,当您将它们作为输入提供给没有映射机制的密集连接的神经网络时,它们将不会表现良好。那是因为那些类型的神经网络并没有被设计成可以很好地处理这样的输入表示。

另一方面,您使用的第二种方法将每个文本表示为零和一的向量,其中值 1 表示存在一个词,值 0 表示不存在一个词 (这称为词袋表示)。例如,如果向量中索引 10 的值为 1,则这意味着该文档中存在索引为 10 的词。好消息是,像您问题中那样的密集连接的神经网络非常擅长处理此类表示和对此类输入表示进行训练。