进行多级分类时Keras中的错误



我正在尝试在keras中进行多类分类。我正在使用crowdflower数据集是我的代码:

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,)

有人可以指出我的逻辑错误吗?我了解我的问题与异常相似:检查模型目标时错误:预期的密度_3具有形状(无,1000(,但具有形状的数组(32,2(

,但我尚未设法找到错误。

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

  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'))
    

最终工作代码在此链接上附有

相关内容

  • 没有找到相关文章

最新更新