Ошибка классификатора текста Keras: вход 0 слоя sequencetial_1 несовместим со слоем - PullRequest
0 голосов
/ 07 августа 2020

Я новичок в Керасе, поэтому извиняюсь за, возможно, новый ie вопрос, но ничто в Интернете, похоже, не указывало мне в правильном направлении.

Я создаю простую модель для классификации текста в одну из семи закромы настроения. Все кажется go довольно гладким и имеет смысл для меня, но я, должно быть, в какой-то момент построил эту штуку неправильно, потому что она терпит неудачу в конце. Я думал, что массив, который он выплевывает в конце, возможно, будет соответствовать меткам значений настроения, но он выплевывает один и тот же массив дробей независимо от того, что я использую в качестве образца текста.

Есть ли у кого-нибудь идеи или может помочь мне в пути? Ошибка выглядит следующим образом:

    ValueError: Input 0 of layer sequential_1 is incompatible with the layer: expected axis -1 of input shape to have value 6835 but received input with shape [None, 57]

Что касается блока кода, то он выглядит следующим образом:

import numpy as np
import pandas as pd
import re
import pickle
import os

import keras
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential, load_model
from keras.layers import Dense, Embedding, LSTM, Bidirectional, Flatten, Dropout, Activation
from keras.callbacks import EarlyStopping as ES
from keras.utils.np_utils import to_categorical

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder


# Read in data
emo = pd.read_csv('dev_sent_emo.csv', dtype = 'str')

# Split train and test data
X_train, X_test, Y_train, Y_test = train_test_split(emo.Utterance, emo.Emotion, test_size=0.3, random_state = 0)

# tokenize and build model framework
totallength = 0
for i in range(0, len(emo)):
    length = len(emo.at[i, 'Emotion'])
    totallength = totallength+length

print(totallength)

# Tokenize
max_words = totallength
tokenizer = Tokenizer(num_words=max_words)
num_classes = emo.Emotion.nunique()

# Convert X text to array
X_train = tokenizer.texts_to_sequences(X_train)
X_train = tokenizer.sequences_to_matrix(X_train, mode='binary')
X_test = tokenizer.texts_to_sequences(X_test)
X_test = tokenizer.sequences_to_matrix(X_test, mode='binary')

# Label outcomes
le = LabelEncoder()
le.fit(Y_train)
Y_train = le.transform(Y_train)
le.fit(Y_test)
Y_test = le.transform(Y_test)
#list(le.inverse_transform(Y_test))

# Y to array matrix
Y_train = keras.utils.to_categorical(Y_train, num_classes)
Y_test = keras.utils.to_categorical(Y_test, num_classes)

#Build model
model = Sequential()
model.add(Dense(300, input_shape=(1, max_words)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
batch_size = 32
epochs = 20

history = model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_split=0.1)

# OOB scoring
score = model.evaluate(X_test, Y_test, batch_size=batch_size, verbose=1)
print('Test accuracy:', score[1])

# Test the model in-house
sample_string = "I am so angry at this, I hate it so much - how dare you!?"
sample_x = tokenizer.texts_to_sequences([sample_string])
sample_x = pad_sequences(sample_x, maxlen=len(sample_string))
prediction = model.predict(sample_x)

Большое спасибо за ваше время и советы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...