LINUX.ORG.RU

Вывод неправильно распознанных текстов

 ,


0

1

Здравствуйте, есть нейронная сеть написанная на питоне с помощью 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])


Если она правильно распознаёт положительные отзывы, что потом мешает от всех отзывов отнять положительные?

rikimaru
()
Ответ на: комментарий от rikimaru

А с чего вы решили, что сеть верно распознает положительные отзывы?

Pepel
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.