Здравствуйте, есть нейронная сеть написанная на питоне с помощью keras. Распознает хороший отзыв или плохой(использовал датасет imdb). Проблема в том, что я не могу вывести неправильно распознанные тексты после работы сети. Пробовал написать свою функцию, но она в результате выводит всю тестовую выборку, что неверно. Возникла идея уже на обученную модель подать снова тестовую выборку для определения сентимента(в результате модель выводит значения с плавающей точкой от 0 до 1, если больше 0.5 - отзыв положительный, и отрицательный в обратном случае. После округлить эти значения и сравнить y_test(где собственно лежат 0 и 1), Но т.к модель выдает все значения в разнобой, то сравнение может быть ошибочным. Может знает кто как это реализовать? Собственно это модель:
def get_data(path):
p = Path(path)
train = pd.concat([pd.read_csv(f, sep='\t', index_col=0)
for f in p.glob('train_???.tsv*')],
ignore_index=True)
test = pd.concat([pd.read_csv(f, sep='\t', index_col=0)
for f in p.glob('test_???.tsv*')],
ignore_index=True)
return ((train['Text'], train['Sentiment']),
(test['Text'], test['Sentiment']))
# read data
(X_train, y_train), (X_test, y_test) = get_data(r'C:\NLP1')
# build vocabulary
t = Tokenizer(num_words=10000)
t.fit_on_texts(X_train)
t.fit_on_texts(X_test)
early_stopping = EarlyStopping(monitor='val_acc', # go through epochs as long as accuracy on validation set increases
patience=2,
mode='max')
# build a model
model = Sequential()
model.add(Dense(500, activation='relu', input_dim=10000))
model.add(Dropout(0.5))
model.add(Dense(250,activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(250,activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(250,activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
optimiz = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss = 'binary_crossentropy',optimizer = optimiz ,metrics = ['accuracy'])
X_train = t.texts_to_matrix(X_train, mode='tfidf')
X_test = t.texts_to_matrix(X_test, mode='tfidf')
hist = model.fit(X_train,y_train,validation_data = (X_test,y_test),epochs = 3,batch_size = 32,callbacks=[early_stopping])
y_pred_vect = model.predict(X_test)
# bolean mask
mask = (y_pred_vect != y_test).any(axis=1)
print(mask)
print(len(mask))
num_words=5000 # only use top 1000 words
INDEX_FROM=3 # word index offset
# этот шаг нужен чтобы получить `test_x` в изначальном виде (до токенизации):
(train_x, _), (test_x, _) = imdb.load_data(num_words=num_words, index_from=INDEX_FROM)
x_wrong = test_x[mask]
word_to_id = imdb.get_word_index()
word_to_id = {k:(v+INDEX_FROM) for k,v in word_to_id.items()}
word_to_id["<PAD>"] = 0
word_to_id["<START>"] = 1
word_to_id["<UNK>"] = 2
id_to_word = {value:key for key,value in word_to_id.items()}
all_wrong_sents = [' '.join(id_to_word[id] for id in sent) for sent in x_wrong]
print(all_wrong_sents[:10])