使用 python 和 keras 进行超过 2 类 的文本分类
Text classification for more than 2 classes with python and keras
我正在尝试使用神经元网络进行分类。
我的数据是这样的:
Sentence
category
sentence 1
0
sentence 2
1
sentence 3
2
sentence 4
3
因此我有 4 个不同的类别。
我将句子和标签分开放在两个不同的列表中,并将第一个列表(带有场景)放入分词器中。
编辑: 因为有人问数据样本。这是 Dropbox (data_samples.txt) 的 link 和更多解释。 0 = 不需要,1 = 标题,2 = 作者姓名,3 = 页数。句子是用 |从标签中分离出来。由于词形还原,有很多特殊字符(如 -- > ,"),但分词器会跳过这些字符。
内容来自不同的网站,我只是在学习的情况下使用它(不是为了钱或恶意)
y_train = array(labels) # it has to be numpy array otherwise it will cause errors, labels is a list of integers
x_train = tokenizer.texts_to_sequences(newLines) # newLines is a list with all sentences
x_train = pad_sequences(x_train, maxlen=sequenceLength)
vocabSize = len(tokenizer.word_index) + 1
现在我要训练我的模型
mymodel = Sequential()
mymodel.add(Embedding(input_dim=vocabSize, output_dim=100, input_length=sequenceLength))
mymodel.add(Conv1D(32, 3, padding='same', activation='relu'))
mymodel.add(MaxPooling1D())
mymodel.add(Flatten())
mymodel.add(Dense(250, activation='relu'))
mymodel.add(Dense(4, activation='softmax'))
mymodel.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
history = mymodel.fit(x_train, y_train, epochs=30, batch_size=8)
但是如果我启动程序,我会收到以下错误:
- ValueError:形状 (None, 1) 和 (None, 4) 不兼容
我知道是因为最后的Dense Layer。如果我写 1 而不是 4,我不会收到错误。但是我认为最后一个密集层需要一个 4 作为参数,因为我有 4 个类别。
我认为最后一个用 1 而不是 4 的密集层是不正确的,因为损失是 0.0000e+00。那看起来不正确 xD
我做错了什么?
将 loss="categorical_crossentropy" 替换为 "sparse_ categorical_crossentropy"。
模型每 class 产生一个值; sparse_ loss 知道如何将 [0-3] 范围内的单个值与这 4 个分数值进行比较。
我正在尝试使用神经元网络进行分类。
我的数据是这样的:
Sentence | category |
---|---|
sentence 1 | 0 |
sentence 2 | 1 |
sentence 3 | 2 |
sentence 4 | 3 |
因此我有 4 个不同的类别。 我将句子和标签分开放在两个不同的列表中,并将第一个列表(带有场景)放入分词器中。
编辑: 因为有人问数据样本。这是 Dropbox (data_samples.txt) 的 link 和更多解释。 0 = 不需要,1 = 标题,2 = 作者姓名,3 = 页数。句子是用 |从标签中分离出来。由于词形还原,有很多特殊字符(如 -- > ,"),但分词器会跳过这些字符。 内容来自不同的网站,我只是在学习的情况下使用它(不是为了钱或恶意)
y_train = array(labels) # it has to be numpy array otherwise it will cause errors, labels is a list of integers
x_train = tokenizer.texts_to_sequences(newLines) # newLines is a list with all sentences
x_train = pad_sequences(x_train, maxlen=sequenceLength)
vocabSize = len(tokenizer.word_index) + 1
现在我要训练我的模型
mymodel = Sequential()
mymodel.add(Embedding(input_dim=vocabSize, output_dim=100, input_length=sequenceLength))
mymodel.add(Conv1D(32, 3, padding='same', activation='relu'))
mymodel.add(MaxPooling1D())
mymodel.add(Flatten())
mymodel.add(Dense(250, activation='relu'))
mymodel.add(Dense(4, activation='softmax'))
mymodel.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
history = mymodel.fit(x_train, y_train, epochs=30, batch_size=8)
但是如果我启动程序,我会收到以下错误:
- ValueError:形状 (None, 1) 和 (None, 4) 不兼容
我知道是因为最后的Dense Layer。如果我写 1 而不是 4,我不会收到错误。但是我认为最后一个密集层需要一个 4 作为参数,因为我有 4 个类别。 我认为最后一个用 1 而不是 4 的密集层是不正确的,因为损失是 0.0000e+00。那看起来不正确 xD
我做错了什么?
将 loss="categorical_crossentropy" 替换为 "sparse_ categorical_crossentropy"。
模型每 class 产生一个值; sparse_ loss 知道如何将 [0-3] 范围内的单个值与这 4 个分数值进行比较。