Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

13 KiB

import tensorflow as tf
device_name=tf.test.gpu_device_name()
if device_name!='/device:GPU:0':
  raise SystemError ('GPUdevicenotfound')
print('FoundGPUat:{}'.format(device_name))
#загрузка датасета
from keras.datasets import imdb
vocabulary_size=5000
index_from=3
(X_train,y_train),(X_test,y_test)=imdb.load_data(path="imdb.npz",num_words=vocabulary_size,skip_top=0,maxlen=None,seed=15,start_char=1,oov_char=2,index_from=index_from)
# Вывод размеров массивов данных
print("Размеры обучающих данных:")
print(f"X_train: {len(X_train)} ")
print(f"y_train: {y_train.shape}")
print("\nРазмеры тестовых данных:")
print(f"X_test: {len(X_test)} ")
print(f"y_test: {y_test.shape}")
# Пункт 3: Создание словаря для перевода индексов в слова
# Загрузка словаря "слово:индекс"
word_to_id = imdb.get_word_index()

# Уточнение словаря
word_to_id = {key: (value + index_from) for key, value in word_to_id.items()}
word_to_id["<PAD>"] = 0
word_to_id["<START>"] = 1
word_to_id["<UNK>"] = 2
word_to_id["<UNUSED>"] = 3
# Создание обратного словаря "индекс:слово"
id_to_word = {value: key for key, value in word_to_id.items()}

# Вывод одного отзыва из обучающего множества
import random
sample_index = random.randint(0, len(X_train)-1)
print(f"\nОтзыв №{sample_index}")
print("Список индексов слов:")
print(X_train[sample_index])
# Преобразование в текст
review_as_text = ' '.join(id_to_word.get(id, '<UNK>') for id in X_train[sample_index])
print("\nОтзыв в виде текста:")
print(review_as_text)

# Длина отзыва и метка класса
print(f"\nДлина отзыва: {len(X_train[sample_index])} слов")
print(f"Метка класса: {y_train[sample_index]} ({'Positive' if y_train[sample_index] == 1 else 'Negative'})")
# Пункт 4: Максимальная и минимальная длина отзыва в обучающем множестве
lengths = [len(review) for review in X_train]
max_length = max(lengths)
min_length = min(lengths)
print(f"Максимальная длина отзыва: {max_length} слов")
print(f"Минимальная длина отзыва: {min_length} слов")
# Пункт 5: Предобработка данных
from tensorflow.keras.utils import pad_sequences

max_words = 500  # Выбранная единая длина

X_train = pad_sequences(
    X_train,
    maxlen=max_words,
    value=0,
    padding='pre',
    truncating='post'
)
X_test = pad_sequences(
    X_test,
    maxlen=max_words,
    value=0,
    padding='pre',
    truncating='post'
)
# Пункт 6: Повторение п. 4 после предобработки
print(f"Длина всех отзывов: {X_train.shape[1]} слов")
# Пункт 7: Повторение п. 3 после предобработки
print("Список индексов слов:")
print(X_train[sample_index])
# Преобразование в текст (игнорируем нулевые паддинги)
review_after_preprocessing = ' '.join(
    id_to_word.get(id, '<UNK>') for id in X_train[sample_index] if id != 0
)
print("\nОтзыв в виде текста после предобработки:")
print(review_after_preprocessing)

print(f"\nДлина отзыва после предобработки: {len([id for id in X_train[sample_index] if id != 0])} значимых слов")
print(f"Общая длина с паддингом: {len(X_train[sample_index])}")

print("\nВывод: После предобработки все отзывы приведены к единой длине 500 слов.")
# Пункт 8: Вывод предобработанных массивов и их размерностей
print("Предобработанное обучающее множество X_train (первые 5 примеров):")
print(X_train[:5])
print("\nПредобработанное тестовое множество X_test (первые 5 примеров):")
print(X_test[:5])
print(f"Размерность X_train после предобработки: {X_train.shape}")
print(f"Размерность X_test после предобработки: {X_test.shape}")
print(f"Размерность y_train: {y_train.shape}")
print(f"Размерность y_test: {y_test.shape}")

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dropout, Dense
import numpy as np

model = Sequential()

model.add(Embedding(
    input_dim=vocabulary_size,
    output_dim=32,
    input_length=max_words
))


model.add(LSTM(units=100))


model.add(Dropout(rate=0.3))


model.add(Dense(1, activation='sigmoid'))  #


model.build(input_shape=(None, max_words))


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


print("Архитектура нейронной сети")
model.summary()
history = model.fit(
    X_train,
    y_train,
    validation_split=0.2,
    batch_size=64,
    epochs=5,
    verbose=1
)
# Проверяем достигнутое качество на валидационных данных
val_accuracy = history.history['val_accuracy'][-1]
print(f"\nТочность на валидационных данных: {val_accuracy:.4f}")
if val_accuracy >= 0.8:
    print("Цель достигнута: accuracy >= 0.8")
else:
    print("Цель не достигнута: accuracy < 0.8")
# Пункт 10: Оценка качества обучения на тестовых данных

# 1) Значение метрики качества классификации на тестовых данных
print("\n1) Метрика качества на тестовых данных:")
test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=0)
print(f"   Loss: {test_loss:.4f}")
print(f"   Accuracy: {test_accuracy:.4f}")
# 2) Отчет о качестве классификации тестовой выборки
y_score = model.predict(X_test, verbose=0)

# Преобразуем вероятности в бинарные предсказания (порог 0.5)
y_pred = [1 if y_score[i, 0] >= 0.5 else 0 for i in range(len(y_score))]

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred, labels=[0,1], target_names=['Negative','Positive']))
# 3) Построение ROC-кривой и вычисление AUC-ROC
from sklearn.metrics import roc_curve, auc, roc_auc_score
import matplotlib.pyplot as plt

fpr, tpr, thresholds = roc_curve(y_test, y_score)

plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {auc(fpr, tpr):.4f})')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")
plt.grid(True)
plt.show()
# Вычисляем AUC-ROC
auc_roc = roc_auc_score(y_test, y_score)
print(f"   Площадь под ROC-кривой (AUC-ROC): {auc_roc:.4f}")