【问题标题】:Error in Keras while doing Multi-class classificationKeras 在进行多类分类时出错
【发布时间】:2018-08-05 21:33:04
【问题描述】:

我正在尝试在 Keras 中进行多类分类。我正在使用 crowdflower dataset.下面是我的代码:

import pandas as pd

from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import numpy as np
from sklearn.preprocessing import LabelEncoder

from keras.models import Sequential
from keras.layers import Embedding, Flatten, Dense
from sklearn.preprocessing import LabelEncoder



df=pd.read_csv('text_emotion.csv')

df.drop(['tweet_id','author'],axis=1,inplace=True)


df=df[~df['sentiment'].isin(['empty','enthusiasm','boredom','anger'])]


df = df.sample(frac=1).reset_index(drop=True)

labels = []
texts = []


for i,row in df.iterrows():
    texts.append(row['content'])
    labels.append(row['sentiment'])

tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)


sequences = tokenizer.texts_to_sequences(texts)

word_index = tokenizer.word_index


print('Found %s unique tokens.' % len(word_index))

data = pad_sequences(sequences)


encoder = LabelEncoder()
encoder.fit(labels)
encoded_Y = encoder.transform(labels)


labels = np.asarray(encoded_Y)


print('Shape of data tensor:', data.shape)
print('Shape of label tensor:', labels.shape)

indices = np.arange(data.shape[0])
np.random.shuffle(indices)
data = data[indices]
labels = labels[indices]
print labels.shape


model = Sequential()



model.add(Embedding(40000, 8,input_length=37))

model.add(Flatten())




model.add(Dense(100,activation='relu'))
model.add(Dense(50, activation='relu'))
model.add(Dense(9, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


model.fit(data,labels, validation_split=0.2, epochs=150, batch_size=100)

我收到此错误:

ValueError: Error when checking target: expected dense_3 to have shape (9,) but got array with shape (1,)

有人可以指出我的逻辑错误吗?我知道我的问题有点类似于Exception: Error when checking model target: expected dense_3 to have shape (None, 1000) but got array with shape (32, 2)

但我没有设法找到错误。

【问题讨论】:

  • 你的标签是什么形状的?
  • 不要使用 40000 嵌入层维度。像 100 或 200 一样使用。
  • @loannis Nasios (数据张量形状:', (38125, 37)) ('标签张量形状:', (38125,))
  • 输入应该总是一个维度作为批量大小(如果正在使用批量,并且 keras 在这里接受 None),另一个维度作为输入特征宽度。在这种情况下,这将是填充序列中的单词数

标签: python keras multiclass-classification


【解决方案1】:

您在该代码中犯了多个错误,我将建议一些改进以使代码更好:

  1. 去掉:for i,row in df.iterrows():可以直接使用

    labels = df['sentiment']
    texts = df['content']
    
  2. 使用tokenizer = Tokenizer(5000) 设置最大字数时,这是词汇量。

  3. 填充data = pad_sequences(sequences, maxlen=37)时提供最大长度。

  4. 不要只将输出转换为值数组labels = np.asarray(encoded_Y),这不是回归。您必须对其进行一次热编码:

    from keras.utils import np_utils
    labels = np_utils.to_categorical(encoded_Y)
    
  5. 当提供嵌入层model.add(Embedding(40000, 8,input_length=37)) 时,您的词汇大小为 40K,嵌入维度为 8。由于您提供的数据集具有接近 40K 的唯一词,因此没有多大意义。不能全部给予适当的嵌入。 model.add(Embedding(5000, 30, input_length=37)) 更改为更合理的数字词汇大小。注意:如果您想使用40000,请将Tokenizer(5000) 更新为相同的号码。

  6. 使用embedding_dim = 8vocab_size=40000 等变量。无论价值是多少。

  7. 而不是model.add(Dense(9, activation='softmax')) 作为最后一层使用它,保持代码干净。

    model.add(Dense(labels.shape[1], activation='softmax'))
    

最终的工作代码附在Link

【讨论】:

  • 我想补充一点的是,当您提到 Tokenizer(5000) 时,它会创建一个标记器,配置为仅考虑 5000 个最常用的单词。
  • 因此,您所做的实际上是通过选择最常出现的 5000 个单词的子集而不是整个 40K 单词来创建此模型。我想它可以减少不需要的噪音。顺便说一句,很好的答案。
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 2018-12-15
  • 2017-09-27
  • 1970-01-01
  • 2020-07-15
  • 2018-04-12
  • 2021-02-17
  • 2018-02-17
相关资源
最近更新 更多