首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Keras错误预测的文本分类(单词袋)&创建不存在的类的模型

使用Keras错误预测的文本分类(单词袋)&创建不存在的类的模型
EN

Stack Overflow用户
提问于 2018-09-19 19:11:30
回答 1查看 634关注 0票数 1

尝试用文字袋建立文本分类模型的预测模型。我遵循了各种指南和信息,建立了以下方法。

培训数据集约有130万份记录,其中有项目说明及其相关部门。有54个系,这是我的班级数。

问题

代码语言:javascript
运行
复制
test_dataset = ['white puppy','cottonelle clean  mega','zagg universal keyboard','sweet milk tea'']

问题是在对上面的数组进行预测时,该数组的项目与我的训练数据集完全相同。它们要么出现在错误的存储桶中,要么创建了一个全新的类,在我的数据集中不存在。我的班次范围在(最小1&最多98)之间,但总共有54节课。

例子:甜奶茶应该升到1,但要到2,棉铃虫洁净度应该是3,但要到45,这是根本不存在的。

这里是我的输入数据集: text_train text_test label_train label_test

参数

代码语言:javascript
运行
复制
vocab_size = 130000
longest_string = 20
hidden_size = 128
num_classes = 54
batch_size = 25000
epochs =7

将标签数据转换为一个热点向量:

代码语言:javascript
运行
复制
labelencoder_Y = LabelEncoder()
x = labelencoder_Y.fit_transform(label_train)
label_cat_train = np_utils.to_categorical(x, num_classes= num_classes)
y = labelencoder_Y.fit_transform(label_test)
label_cat_test = np_utils.to_categorical(y, num_classes= num_classes)

将我的文本数据转换为数字数组和填充

代码语言:javascript
运行
复制
tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(text_train)
sequences = tokenizer.texts_to_sequences(text_train)
padded_sequences = pad_sequences(sequences)
data = pad_sequences(sequences, maxlen=longest_string)

建模与数据训练

代码语言:javascript
运行
复制
model = Sequential()
model.add(Embedding(vocab_size, hidden_size,input_length=longest_string))
model.add(GRU(256, dropout=0.25, return_sequences=True))
model.add(GRU(256, dropout=0.25))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(data, label_cat_train, validation_split=0.1, epochs=epochs,batch_size = batch_size) 

而且,从输出模型来看,性能也相当高。这没有道理。

代码语言:javascript
运行
复制
2018-09-18 22:05:41.039445: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
1101365/1101365 [==============================] - 668s 606us/step - loss: 3.4749 - acc: 0.1313 - val_loss: 2.6991 - val_acc: 0.2888
Epoch 2/7
1101365/1101365 [==============================] - 673s 611us/step - loss: 2.0425 - acc: 0.4523 - val_loss: 1.3667 - val_acc: 0.6435
Epoch 3/7
1101365/1101365 [==============================] - 682s 620us/step - loss: 1.0634 - acc: 0.7231 - val_loss: 0.8052 - val_acc: 0.7945
Epoch 4/7
1101365/1101365 [==============================] - 679s 617us/step - loss: 0.6992 - acc: 0.8187 - val_loss: 0.6251 - val_acc: 0.8392
Epoch 5/7
1101365/1101365 [==============================] - 679s 617us/step - loss: 0.5478 - acc: 0.8562 - val_loss: 0.5329 - val_acc: 0.8616
Epoch 6/7
1101365/1101365 [==============================] - 677s 615us/step - loss: 0.4618 - acc: 0.8770 - val_loss: 0.4814 - val_acc: 0.8739
Epoch 7/7
1101365/1101365 [==============================] - 690s 626us/step - loss: 0.4064 - acc: 0.8903 - val_loss: 0.4411 - val_acc: 0.8840

如果有人能在这种情况下提供输入,HIghly会很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-20 07:16:26

我怀疑问题在于你的标签编码。为了使标签匹配,您需要使用完全相同的编码器:

代码语言:javascript
运行
复制
labelencoder_Y = LabelEncoder()
x = labelencoder_Y.fit_transform(label_train)
label_cat_train = np_utils.to_categorical(x, num_classes=num_classes)
y = labelencoder_Y.transform(label_test)  # do not fit again, but reuse the encoder
label_cat_test = np_utils.to_categorical(y, num_classes=num_classes)

也许你也需要检查你的分类标签。上面,你写的

巨无霸应该是3,但到45,甚至不存在。

但要声明

代码语言:javascript
运行
复制
num_classes = 54

这也是输出层的大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52412767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档