已经证明CNN(卷积神经网络)对于文本/文档分类非常有用。我想知道如何处理长度差异,因为在大多数情况下文章的长度是不同的。在Keras有什么例子吗?谢谢!!
答案 0 :(得分:3)
以下是三个选项:
答案 1 :(得分:3)
答案 2 :(得分:1)
一种可能的解决方案是分批发送序列。
n_batch = 1
model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)
官方keras repo上的这个问题提供了很好的见解和可能的解决方案:https://github.com/keras-team/keras/issues/85
引用patyork的评论:
有两种简单且最常用的处理方法:
- Bucketing and Padding
醇>将输入样本分成具有的桶 类似的长度,理想情况下每个桶具有多个样本 这是迷你批量大小的倍数对于每个桶,填充 用a表示该桶中最长样品的长度 中性数字。 0是经常出现的,但对于像语音数据这样的东西, 使用静音的表示,其通常不是零(例如, 音频静音部分的FFT用作中性填充。)
- Bucketing
醇>将输入样本分成完全相同的桶 长度消除了确定中性填充是什么的需要 但是,在这种情况下,桶的大小通常不是a 多个小批量大小,所以在每个时代,多次 更新不会基于完整的小批量。
答案 3 :(得分:0)
我刚刚使用他们的LSTM RNN模型在Keras中建立了一个模型。它迫使我填写自己的输入内容(即句子)。但是,我只是在句子中添加了一个空字符串,直到达到所需的长度为止。可能=等于具有最大长度的特征的长度(以字为单位)。然后,在运行模型之前,我可以使用手套将特征转换为矢量空间。
def getWordVector(X):
global num_words_kept
global word2vec
global word_vec_dim
input_vector = []
for row in X:
words = row.split()
if len(words) > num_words_kept:
words = words[:num_words_kept]
elif len(words) < num_words_kept:
for i in range(num_words_kept - len(words)):
words.append("")
input_to_vector = []
for word in words:
if word in word2vec:
input_to_vector.append(np.array(word2vec[word]).astype(np.float).tolist())#multidimensional wordvecor
else:
input_to_vector.append([5.0] * word_vec_dim)#place a number that is far different than the rest so as not to be to similar
input_vector.append(np.array(input_to_vector).tolist())
input_vector = np.array(input_vector)
return input_vector
其中X是句子列表,此函数将为返回数组中的每个函数返回一个具有num_words_kept长度的特征的词向量(使用手套的word_to_vec)。所以我同时使用填充和截断。 (填充Keras的实现并截断,因为当您在输入大小上存在如此巨大的差异时,Keras也会遇到问题...我不确定为什么。当我开始用100多个空字符串填充一些句子时,我遇到了问题
X = getWordVectors(features)
y = to_categorical(y)# for categorical_crossentropy
model.fit(X, y, batch_size=16, epochs=5, shuffle=False)
Keras要求您在输入数据之前使用numpy数组,因此我的特征和标签都是numpy数组。