Compare commits

..

5 Commits

40 changed files with 184634 additions and 332 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,84 @@
# Лабораторная работа №3. Деревья решений
## 6 вариант
### Задание:
Решите с помощью библиотечной реализации дерева решений
задачу из лабораторной работы «Веб-сервис «Дерево решений» по предмету
«Методы искусственного интеллекта» на 99% ваших данных. Проверьте
работу модели на оставшемся проценте, сделайте вывод
В моем случае данными является датасет о продаже автомобилей. В датасете представлены следующие столбцы:
* id
* Company Name
* Model Name
* Price
* Model Year
* Location
* Mileage
* Engine Type
* Engine Capacity
* Color
* Assembly
* Body Type
* Transmission Type
* Registration Status
### Как запустить лабораторную
1. Запустить файл main.py
### Используемые технологии
1. Библиотека pandas
2. Библиотека scikit-learn
3. Python
4. IDE PyCharm
### Описание лабораторной работы
Программа загружает данные из файла Clean_Data_pakwheels.csv, после чего выбирает необходимые для создания модели столбцы.
Выбранные столбцы разделяются на целевую переменную (Y) и признаки (X). Некоторые столбцы в датасете представлены в виде текстовых значений, поэтому мы представляем их как численные значения
Затем программа обучает модель, выполняет прогнозы и оценивает точность. В консоль выводятся признаки по их важности
Целевой признак - Registration Status
### Результат
Accuracy: 0.9327548806941431
* Признак Важность
* 1 Mileage 0.332722
* 2 Price 0.332358
* 0 Model Year 0.175522
* 34 Transmission Type_Automatic 0.086699
* 13 Company Name_Honda 0.021243
* 31 Company Name_Toyota 0.015743
* 30 Company Name_Suzuki 0.008819
* 10 Company Name_Daihatsu 0.007749
* 25 Company Name_Nissan 0.007616
* 4 Company Name_Audi 0.003018
* 23 Company Name_Mercedes 0.001886
* 22 Company Name_Mazda 0.001800
* 18 Company Name_KIA 0.001416
* 24 Company Name_Mitsubishi 0.001044
* 29 Company Name_Subaru 0.000787
* 5 Company Name_BMW 0.000458
* 19 Company Name_Land 0.000407
* 27 Company Name_Range 0.000332
* 26 Company Name_Porsche 0.000331
* 35 Transmission Type_Manual 0.000050
* 20 Company Name_Lexus 0.000000
* 21 Company Name_MINI 0.000000
* 9 Company Name_Daewoo 0.000000
* 8 Company Name_DFSK 0.000000
* 14 Company Name_Hummer 0.000000
* 7 Company Name_Chevrolet 0.000000
* 11 Company Name_FAW 0.000000
* 17 Company Name_Jeep 0.000000
* 28 Company Name_SsangYong 0.000000
* 16 Company Name_Jaguar 0.000000
* 6 Company Name_Chery 0.000000
* 15 Company Name_Hyundai 0.000000
* 32 Company Name_United 0.000000
* 33 Company Name_Volvo 0.000000
* 3 Company Name_Adam 0.000000
* 12 Company Name_Fiat 0.000000
### Вывод
Исходя из результатов работы программы можно сделать вывод, что наиболее важным признаком, отвечающим за
то, зарегистрирована машина или нет, является её пробег, а так же её цена на рынке. Точность модели составляет 93%, что говорит о том,
что она классифицирует данные при заданных условиях с высокой точностью.

View File

@ -0,0 +1,39 @@
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
def main():
# Чтение данных из csv файла
data = pd.read_csv("Clean_Data_pakwheels.csv")
# Выбор необходимых для создания модели столбцов
selected_columns = ['Company Name', 'Model Year', 'Mileage', 'Transmission Type', 'Price', 'Registration Status']
data = data[selected_columns]
# Разделение данных на признаки (X) и целевую переменную (y), целевая переменная в данном случае Registration Status
y = data['Registration Status']
data = data.drop(columns=['Registration Status'])
# В связи с тем, что некоторые столбцы представляют из себя текстовые значения, мы представляем их в виде числовых значений
X = pd.get_dummies(data)
# Тестовый набор в данном случае - 1%, обучающий - 99%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01)
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
# Предсказание на тестовом наборе
y_pred = model.predict(X_test)
# Оценка точности модели
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
# Важность признаков
importance = pd.DataFrame({'Признак': X.columns, 'Важность': model.feature_importances_})
importance = importance.sort_values(by='Важность', ascending=False)
print(importance)
main()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
# Лабораторная работа №4. Кластеризация
## 2 вариант(27 % 2 = 2)
### Задание:
Использовать метод кластеризации по варианту для данных из таблицы
1 по варианту (таблица 9), самостоятельно сформулировав задачу.
Интерпретировать результаты и оценить, насколько хорошо он подходит для
решения сформулированной вами задачи.
Используемый метод: linkage
В моем случае данными является датасет о продаже автомобилей. В датасете представлены следующие столбцы:
* id
* Company Name
* Model Name
* Price
* Model Year
* Location
* Mileage
* Engine Type
* Engine Capacity
* Color
* Assembly
* Body Type
* Transmission Type
* Registration Status
### Как запустить лабораторную
1. Запустить файл main.py
### Используемые технологии
1. Библиотека matplotlib
2. Библиотека scikit-learn
3. Библиотека pandas
3. Python
4. IDE PyCharm
### Описание лабораторной работы
Программа выполняет кластеризацию данных методом linkage, используя для своей работы признаки "Стоимость" и "Пробег"
Для работы программы выбирается часть данных(Ввиду того, что работы программы на полном объеме данных требует больших вычислительных мощностей), после чего они стандартизируются,
а затем к ним применяется кластеризация. После чего строится график, который показывается на экране, а так же сохраняется в папке проекта.
Скриншот работы программы представлен в папке проекта.
### Результат
Кластеризация представленного датасета позволяет увидеть схожие пары "Стоимость"-"Пробег", что позволяет выделить более или менее схожие автомобили.

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,32 @@
import pandas as pd
from sklearn.cluster import AgglomerativeClustering
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# Чтение данных из датасета
data = pd.read_csv("Clean Data_pakwheels.csv")
# Уменьшение размера данных для оптимизации работы программы
data = data.sample(frac=.01)
# Для кластеризации выбираются признаки "Стоимость" и "Пробег"
features = ['Price','Mileage']
cluster_data = data[features]
X = data[features]
# Стандартизация данных
standartSc = StandardScaler()
X_scaled = standartSc.fit_transform(X)
# Кластеризация с разделением на 4 кластера
cluster = AgglomerativeClustering(n_clusters=4, linkage='ward')
data['cluster'] = cluster.fit_predict(X_scaled)
# Построение графика
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=data['cluster'])
plt.xlabel('Стоимость')
plt.ylabel('Пробег')
plt.title('Кластеризация')
plt.savefig(f"linkage.png")
plt.show()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
# Лабораторная работа №5. Регрессия
## 2 вариант(27 % 5 = 2)
### Задание:
Использовать регрессию по варианту для данных из таблицы 1 по
варианту (таблица 10), самостоятельно сформулировав задачу. Оценить,
насколько хорошо она подходит для решения сформулированной вами задачи.
Используемый метод: Логистическая регрессия
В моем случае данными является датасет о продаже автомобилей. В датасете представлены следующие столбцы:
* id
* Company Name
* Model Name
* Price
* Model Year
* Location
* Mileage
* Engine Type
* Engine Capacity
* Color
* Assembly
* Body Type
* Transmission Type
* Registration Status
### Как запустить лабораторную
1. Запустить файл main.py
### Используемые технологии
1. Библиотека matplotlib
2. Библиотека scikit-learn
3. Библиотека pandas
3. Python
4. IDE PyCharm
### Описание лабораторной работы
Программа выполняет решение задачи регрессии методом логистической регрессии, используя для своей работы признаки "Registration Status", 'Model Year', 'Mileage'. Предсказывается вероятность регистрации автомобиля на основе данных о его пробеге и годе выпуска.
Для работы программы выбирается часть данных(Ввиду того, что работы программы на полном объеме данных требует больших вычислительных мощностей), затем строковые значения преобразуются в числовые. Данные разделяются на тестовый и тренировочный наборы,
строится модель логистической регрессии, после чего оценивается её качество.
После чего строится график, который показывается на экране, а так же сохраняется в папке проекта.
Точность: 0.04852728150651859
Скриншот работы программы представлен в папке проекта.
### Результат
Модель логистической регрессии показала весьма низкие результаты, в связи с этим можно сделать вывод ,что она не подходит для решения сформулированной задачи.

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,55 @@
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
def main():
# Чтение данных из датасета
data = pd.read_csv('Clean Data_pakwheels.csv')
# Выбор переменных для модели
features = ['Registration Status', 'Model Year', 'Mileage']
# Выбор лишь части значений для оптимизации работы программы
data = data.sample(frac=.1)
# Отбор нужных столбцов
df = data[features]
# Преобразование строковых значений о регистрации авто в числовые
labelencoder = LabelEncoder()
df['Registration Status'] = labelencoder.fit_transform(df['Registration Status'])
# Разделение на признаки и целевую переменную, представленную как Mileage
X = df.drop('Mileage', axis=1)
y = df['Mileage']
# Разделение данных на тренировочный и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.9, random_state=0)
# Создание и обучение логистической регрессии
model = LogisticRegression()
model.fit(X_train, y_train)
# Предсказание на тестовом наборе
y_pred = model.predict(X_test)
# Оценка качества модели
accuracy = accuracy_score(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print(f'Точность: {accuracy}')
print(f'Классификация:\n{class_report}')
# Визуализация результатов
plt.scatter(X_test['Registration Status'], y_test, color='red', label='Actual')
plt.scatter(X_test['Registration Status'], y_pred, color='green', label='Predicted', marker='x')
plt.xlabel('Registration Status')
plt.ylabel('Mileage')
plt.legend()
plt.savefig(f"image.png")
plt.show()
main()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,46 @@
# Лабораторная работа №6. Нейронная сеть
## 1 вариант(27 % 2 = 1)
### Задание:
Использовать нейронную сеть (четные варианты MLPRegressor,
нечетные MLPClassifier) для данных из таблицы 1 по варианту,
самостоятельно сформулировав задачу. Интерпретировать результаты и
оценить, насколько хорошо она подходит для решения сформулированной
вами задачи.
Используемый метод: MLPClassifier
В моем случае данными является датасет о продаже автомобилей. В датасете представлены следующие столбцы:
* id
* Company Name
* Model Name
* Price
* Model Year
* Location
* Mileage
* Engine Type
* Engine Capacity
* Color
* Assembly
* Body Type
* Transmission Type
* Registration Status
### Как запустить лабораторную
1. Запустить файл main.py
### Используемые технологии
1. Библиотека matplotlib
2. Библиотека scikit-learn
3. Библиотека pandas
3. Python
4. IDE PyCharm
### Описание лабораторной работы
Программа выполняет создание и обучение нейронной сети с помощью MLPClassifier, после чего
Для работы программы выбирается часть данных(Ввиду того, что работы программы на полном объеме данных требует больших вычислительных мощностей). Данные разделяются на тестовый и тренировочный наборы,
строится модель нейронной сети, которая обучается на тестовом наборе данных, после чего оценивается её качество на оставшихся данных.
После чего строится график, который показывается на экране, а так же сохраняется в папке проекта.
Точность: 0.9283387622149837
Скриншот работы программы представлен в папке проекта.
### Результат
Ввиду того, что точность работы модели составляет 0.9283387622149837, это может говорить о том, что нейронная сеть хорошо справляется в предсказании статуса регистрации автомобиля.

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,46 @@
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
def main():
# Чтение данных из файла
data = pd.read_csv('Clean Data_pakwheels.csv')
# Выбор лишь части значений для оптимизации работы программы
data = data.sample(frac=.1)
# Выбор необходимых столбцов
features = ['Model Year', 'Mileage', 'Registration Status']
# Выбор данных из датасета
df = data[features]
# Split into features and target variable
y = df['Registration Status']
X = df.drop('Registration Status', axis=1)
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# Создание и обучение модели нейросети MLPClassifier
model = MLPClassifier(random_state=0)
model.fit(X_train, y_train)
# Предсказания на тестовом наборе
y_pred = model.predict(X_test)
# Оценка модели
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print(f'Accuracy: {accuracy}')
print(f'Classification Report:\n{class_report}')
# Создание графика, его отображение и сохранение
plt.hist(y_pred, bins=np.arange(3) - 0.5, alpha=0.75, color='Red', label='Предсказываемые')
plt.hist(y_test, bins=np.arange(3) - 0.5, alpha=0.5, color='Black', label='Действительные')
plt.xticks([0, 1], ['Зарегистрирована', 'Не зарегистрирована'])
plt.legend()
plt.savefig(fname = 'image.png')
plt.show()
main()

View File

@ -0,0 +1,42 @@
# Лабораторная работа №7. Рекуррентная нейронная сеть и задача генерации текста
## 1 вариант(27 % 2 = 1)
### Задание:
Использовать регрессию по варианту для данных из таблицы 1 по
варианту (таблица 10), самостоятельно сформулировав задачу. Оценить,
насколько хорошо она подходит для решения сформулированной вами задачи.
Используемый текст: англоязычный
### Как запустить лабораторную
1. Запустить файл main.py
### Используемые технологии
1. Библиотека tensorflow
2. Библиотека keras
3. Python
4. IDE PyCharm
### Описание лабораторной работы
Программа работает с библиотеками tensorflow и keras: изначально считывает текст, после чего производит процесс токенизации текста, а так же преобразует его в числовые последовательности.
После чего строится и обучается модель. В конце происходит генерация текста и запись его в файлы. Изначально обрабатывается текст на русском языке(Булгаков, "Мастер и Маргарита"), затем на английском(Оруэлл, "1984").
Среднее время прохождения одного цикла при работе с русскоязычным текстом - 2,5 с
Среднее время прохождения одного цикла при работе с англоязычным текстом - 0,3 с
### Результат
#### Оригинал русскоязычного текста:
Абрикосовая дала обильную желтую пену, и в воздухе запахло парикмахерской. Напившись, литераторы немедленно начали икать, расплатились и уселись на скамейке лицом к пруду и спиной к Бронной.
Тут приключилась вторая странность, касающаяся одного Берлиоза. Он внезапно перестал икать, сердце его стукнуло и на мгновенье куда-то провалилось, потом вернулось, но с тупой иглой, засевшей в нем. Кроме того, Берлиоза охватил необоснованный, но столь сильный страх, что ему захотелось тотчас же бежать с Патриарших без оглядки. Берлиоз тоскливо оглянулся, не понимая, что его напугало. Он побледнел, вытер лоб платком, подумал: «Что это со мной? Этого никогда не было... сердце шалит... я переутомился. Пожалуй, пора бросить все к черту и в Кисловодск...»
И тут знойный воздух сгустился перед ним, и соткался из этого воздуха прозрачный гражданин престранного вида. На маленькой головке жокейский картузик, клетчатый кургузый воздушный же пиджачок... Гражданин ростом в сажень, но в плечах узок, худ неимоверно, и физиономия, прошу заметить, глумливая.
Жизнь Берлиоза складывалась так, что к необыкновенным явлениям он не привык. Еще более побледнев, он вытаращил глаза и в смятении подумал: «Этого не может быть!..»
Но это, увы, было, и длинный, сквозь которого видно, гражданин, не касаясь земли, качался перед ним и влево и вправо.
Тут ужас до того овладел Берлиозом, что он закрыл глаза. А когда он их открыл, увидел, что все кончилось, марево растворилось, клетчатый исчез, а заодно и тупая игла выскочила из сердца.
#### Сгенерированный русскоязычный текст:
Абрикосовая дала обильную желтую пену и в воздухе запахло парикмахерской напившись литераторы немедленно начали икать расплатились и уселись на скамейке лицом к пруду и спиной к бронной тут приключилась вторая странность касающаяся одного берлиоза он внезапно перестал икать сердце его стукнуло и на мгновенье куда то провалилось потом вернулось но с тупой иглой засевшей в нем кроме того берлиоза охватил необоснованный но столь сильный страх что ему захотелось тотчас же бежать с патриарших без оглядки берлиоз тоскливо оглянулся не понимая что его напугало он побледнел вытер лоб платком подумал «что это со мной этого никогда не было сердце шалит я переутомился
#### Оригинал англоязычного текста:
It was a bright, cold day in April and the clocks were striking thirteen. Winston Smith hurried home to Victory Mansions with his head down to escape the terrible wind. A cloud of dust blew inside with him, and the hall smelled of dust and yesterday's food.
At the end of the hall, a poster covered one wall. It showed an enormous face, more than a metre wide: the face of a handsome man of about forty-five, with a large, black moustache. The man's eyes seemed to follow Winston as he moved. Below the face were the words BIG BROTHER IS WATCHING YOU.
Winston went up the stairs. He did not even try the lift. It rarely worked and at the moment the electricity was switched off during the day to save money for Hate Week. The flat was on the seventh floor and Winston, who was thirty-nine and had a bad knee, went slowly, resting several times on the way. Winston was a small man and looked even smaller in the blue overalls of the Party. His hair was fair and the skin on his face, which used to be pink, was red and rough from cheap soap, old razor blades and the cold of the winter that had just ended.
#### Сгенерированный англоязычный текст:
It was a bright cold day to save the face were the big brother brother is brother watching you watching you watching watching you watching watching you you a small moustache the face were the words big brother is watching you you you you watching you watching watching watching you you a bright cold day to save the face were the big brother brother is brother watching you watching you watching watching you watching watching you you a small moustache the face were the words big brother is watching you you you you watching you watching watching watching you you a
В результате работы программы была успешно создана и обучена рекуррентная нейронная сеть для генерации текста.

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -0,0 +1,3 @@
It was a bright, cold day in April and the clocks were striking thirteen. Winston Smith hurried home to Victory Mansions with his head down to escape the terrible wind. A cloud of dust blew inside with him, and the hall smelled of dust and yesterday's food.
At the end of the hall, a poster covered one wall. It showed an enormous face, more than a metre wide: the face of a handsome man of about forty-five, with a large, black moustache. The man's eyes seemed to follow Winston as he moved. Below the face were the words BIG BROTHER IS WATCHING YOU.
Winston went up the stairs. He did not even try the lift. It rarely worked and at the moment the electricity was switched off during the day to save money for Hate Week. The flat was on the seventh floor and Winston, who was thirty-nine and had a bad knee, went slowly, resting several times on the way. Winston was a small man and looked even smaller in the blue overalls of the Party. His hair was fair and the skin on his face, which used to be pink, was red and rough from cheap soap, old razor blades and the cold of the winter that had just ended.

View File

@ -0,0 +1 @@
It was a bright cold day to save the face were the big brother brother is brother watching you watching you watching watching you watching watching you you a small moustache the face were the words big brother is watching you you you you watching you watching watching watching you you a bright cold day to save the face were the big brother brother is brother watching you watching you watching watching you watching watching you you a small moustache the face were the words big brother is watching you you you you watching you watching watching watching you you a

View File

@ -0,0 +1 @@
Абрикосовая дала обильную желтую пену и в воздухе запахло парикмахерской напившись литераторы немедленно начали икать расплатились и уселись на скамейке лицом к пруду и спиной к бронной тут приключилась вторая странность касающаяся одного берлиоза он внезапно перестал икать сердце его стукнуло и на мгновенье куда то провалилось потом вернулось но с тупой иглой засевшей в нем кроме того берлиоза охватил необоснованный но столь сильный страх что ему захотелось тотчас же бежать с патриарших без оглядки берлиоз тоскливо оглянулся не понимая что его напугало он побледнел вытер лоб платком подумал «что это со мной этого никогда не было сердце шалит я переутомился

View File

@ -0,0 +1,97 @@
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense
import numpy as np
# Загрузка и подготовка данных
with open('russian_text.txt', 'r', encoding='cp1251') as file:
russian_text = file.read()
# Токенизация текста
tokenizer = tf.keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts([russian_text])
total_words = len(tokenizer.word_index) + 1
# Преобразование текста в числовые последовательности
input_sequences = []
for line in russian_text.split('n'):
token_list = tokenizer.texts_to_sequences([line])[0]
for i in range(1, len(token_list)):
n_gram_sequence = token_list[:i+1]
input_sequences.append(n_gram_sequence)
# Создание входных и целевых последовательностей
max_sequence_length = max([len(x) for x in input_sequences])
input_sequences = np.array(tf.keras.preprocessing.sequence.pad_sequences(input_sequences, maxlen=max_sequence_length,
padding='pre'))
predictors, label = input_sequences[:, :-1], input_sequences[:, -1]
# Построение и обучение модели
model = Sequential()
model.add(Embedding(total_words, 100, input_length=max_sequence_length-1))
model.add(LSTM(150))
model.add(Dense(total_words, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
model.fit(predictors, label, epochs=150, batch_size=64)
def generate_text(seed_text, next_words, model, max_sequence_length):
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = tf.keras.preprocessing.sequence.pad_sequences([token_list], maxlen=max_sequence_length - 1,
padding='pre')
predicted = np.argmax(model.predict(token_list, verbose=0), axis=-1)
# Поиск слова, соответствующего предсказанному индексу
output_word = ""
for word, index in tokenizer.word_index.items():
if index == predicted:
output_word = word
break
seed_text += " " + output_word
return seed_text
# Генерация и сохранение русскоязычного текста
russian_generated_text = generate_text('Абрикосовая', next_words=100, model=model, max_sequence_length=max_sequence_length)
with open('generated_russian_text.txt', 'w', encoding='utf-8') as file:
file.write(russian_generated_text)
# Загрузка и подготовка данных
with open('english_text.txt', 'r', encoding='utf-8') as file:
english_text = file.read()
# Токенизация текста
tokenizer = tf.keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts([english_text])
total_words = len(tokenizer.word_index) + 1
# Преобразование текста в числовые последовательности
input_sequences = []
for line in english_text.split('n'):
token_list = tokenizer.texts_to_sequences([line])[0]
for i in range(1, len(token_list)):
n_gram_sequence = token_list[:i+1]
input_sequences.append(n_gram_sequence)
# Создание входных и целевых последовательностей
max_sequence_length = max([len(x) for x in input_sequences])
input_sequences = np.array(tf.keras.preprocessing.sequence.pad_sequences(input_sequences, maxlen=max_sequence_length,
padding='pre'))
predictors, label = input_sequences[:, :-1], input_sequences[:, -1]
# Построение и обучение модели
model = Sequential()
model.add(Embedding(total_words, 100, input_length=max_sequence_length-1))
model.add(LSTM(150))
model.add(Dense(total_words, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
model.fit(predictors, label, epochs=150, batch_size=64)
# Генерация и сохранение англоязычного текста
english_generated_text = generate_text('It', next_words=100, model=model, max_sequence_length=max_sequence_length)
with open('generated_english_text.txt', 'w', encoding='utf-8') as file:
file.write(english_generated_text)

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,6 @@
Абрикосовая дала обильную желтую пену, и в воздухе запахло парикмахерской. Напившись, литераторы немедленно начали икать, расплатились и уселись на скамейке лицом к пруду и спиной к Бронной.
Тут приключилась вторая странность, касающаяся одного Берлиоза. Он внезапно перестал икать, сердце его стукнуло и на мгновенье куда-то провалилось, потом вернулось, но с тупой иглой, засевшей в нем. Кроме того, Берлиоза охватил необоснованный, но столь сильный страх, что ему захотелось тотчас же бежать с Патриарших без оглядки. Берлиоз тоскливо оглянулся, не понимая, что его напугало. Он побледнел, вытер лоб платком, подумал: «Что это со мной? Этого никогда не было... сердце шалит... я переутомился. Пожалуй, пора бросить все к черту и в Кисловодск...»
И тут знойный воздух сгустился перед ним, и соткался из этого воздуха прозрачный гражданин престранного вида. На маленькой головке жокейский картузик, клетчатый кургузый воздушный же пиджачок... Гражданин ростом в сажень, но в плечах узок, худ неимоверно, и физиономия, прошу заметить, глумливая.
Жизнь Берлиоза складывалась так, что к необыкновенным явлениям он не привык. Еще более побледнев, он вытаращил глаза и в смятении подумал: «Этого не может быть!..»
Но это, увы, было, и длинный, сквозь которого видно, гражданин, не касаясь земли, качался перед ним и влево и вправо.
Тут ужас до того овладел Берлиозом, что он закрыл глаза. А когда он их открыл, увидел, что все кончилось, марево растворилось, клетчатый исчез, а заодно и тупая игла выскочила из сердца.

View File

@ -1,93 +0,0 @@
# Лабораторная работа №7. Рекуррентная нейронная сеть и задача генерации текста
## 12 вариант
___
### Задание:
Выбрать художественный текст на языке по варианту и обучить на нём рекуррентную
нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры
так, чтобы приблизиться к максимально осмысленному результату. Далее разбиться
на пары чётный-нечётный вариант, обменяться разработанными сетями и проверить,
как архитектура товарища справляется с вашим текстом. В завершении подобрать
компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов.
### Вариант:
- Язык текста: **русский**
### Художественный текст:
- Отрывок из книги Ф.М. Достоевского — "Белые ночи" (в формате .txt)
___
### Запуск
- Запустить файл lab7.py
### Используемые технологии
- Язык программирования **Python**
- Среда разработки **PyCharm**
- Библиотеки:
* numpy
* keras
* os
### Описание программы
Здесь представлена модель глубокого обучения для генерации текста с помощью
библиотеки Keras и алгоритма LSTM. Чтобы построить модель генерации
художественного текста, требуются некоторые текстовые данные. В качестве набора
данных здесь используется отрывок из книги великого русского писателя-реалиста
в формате текстового файла.
**Шаги написания программы:**
1. **Предварительная обработка данных**
1. Перевод символов в нижний регистр
2. Формирование уникального набора использующихся в тексте символов
3. Преобразование текстовых данных в числовые значения
4. Создание последовательности символов (X - значений, Y - следующий символ)
5. Преобразование данных в массив логических значений
2. **Построение базовой модели**
1. Инициализация модели **Sequential**. это простой стек слоев,
с помощью которого нельзя представить произвольную модель.
2. Три слоя **LSTM** (по 200 единиц в каждом):
- В первом слое входная форма.
- Во втором слое параметр *return_sequences=True* для обработки тех же
последовательностей
- В третьем слое ничего лишнего
2. Три слоя **Dropout** с вероятностью 20% для проверки переобучения.
Dropout предполагает случайный кик нейронов из процесса обучения.
Он обеспечивает, чтобы нейронная сеть не стала слишком зависимой от
любого одного узла.
3. Один "плотный" слой **Dense** в конце, который даёт вывод символов.
Dense обрабатывает каждый элемент предыдущего слоя, выполняя матричное
перемножение этих элементов со своими весами.
4. Конфигурация модели для категориальной классификации.
3. **Обучение модели**
1. **epochs=50** (одна эпоха = один проход вперёд и один проход назад
всех обучающих примеров)
2. **batch_size=100** (количество обучающих примеров за один проход
вперёд/назад. Чем больше размер пакета, тем больше памяти лучше использовать.
4. **Сохранение модели** (во избежание повторного обучения и ради экономии времени)
5. **Генерация текста на основе сохранённой модели**
1. Загрузка модели
2. Выбор случайной стартовой точки в исходном тексте
3. Генерация назначенного количества символов
---
### Пример работы
*В ходе прогона программы было зафиксировано несколько результатов генерации
200 символов. Примеры приведены ниже.*
![Graphics](result_1.jpg)
![Graphics](result_2.jpg)
![Graphics](result_3.jpg)
![Graphics](result_4.jpg)
---
### Вывод
Итак, рекуррентная нейронная сеть справилась с задачей генерации текста.
Если говорить о качестве, то требуется более глубокое обучение и больше текста.
И тогда нейросеть сможет писать даже в стиле Достоевского. Но по времени это
слишком затратно. Однако в рамках лабораторной работы результат вышел приемлемый.

File diff suppressed because one or more lines are too long

View File

@ -1,127 +0,0 @@
"""
Выбрать художественный текст на языке по варианту и обучить на нём рекуррентную нейронную сеть для решения задачи
генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.
Далее разбиться на пары чётный-нечётный вариант, обменяться разработанными сетями и проверить, как архитектура товарища
справляется с вашим текстом.
В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов.
"""
# 12 вариант
# Вариант языка текста: русский
# Художественный текст: Книга "Ф.М. Достоевский — Преступление и наказание"
import os
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM
from keras.utils import to_categorical
FILE_NAME = 'belye-nochi.txt'
# Открытие файла
df_text = (open(FILE_NAME, encoding='utf-8').read())
"""""""""""""""""""""""""""""""""
ПРЕДВАРИТЕЛЬНАЯ ОБРАБОТКА ДАННЫХ
"""""""""""""""""""""""""""""""""
# Перевод всех символов в нижний регистр для упрощения обучения
df_text = df_text.lower()
# Формирование набора символов на основе текста
characters = sorted(list(set(df_text)))
print("\033[92m\n---> Итого символов: \033[00m", len(characters))
# Сопоставления символов к номеру
char_to_n = {char: n for n, char in enumerate(characters)}
# Массивы
X = [] # обучающий
Y = [] # целевой
# Длина исходного текста
length = len(df_text)
# Длина последовательности символов для предсказания конкретного символа
seq_length = 5
# Перебора полного текста
for i in range(0, length - seq_length, 1):
sequence = df_text[i:i + seq_length]
label = df_text[i + seq_length]
X.append([char_to_n[char] for char in sequence])
Y.append(char_to_n[label])
# Масштабирование целых чисел в диапазон от 0 до 1 для облегчения изучения шаблонов сетью
X_modified = np.reshape(X, (len(X), seq_length, 1))
X_modified = X_modified / float(len(characters))
Y_modified = to_categorical(Y)
"""""""""""""""""""""
ПОСТРОЕНИЕ МОДЕЛИ
"""""""""""""""""""""
# Инициализация модели
model = Sequential()
# Пополнение модели атрибутами
model.add(LSTM(700, input_shape=(X_modified.shape[1], X_modified.shape[2]), return_sequences=True)) # первый слой на 700 единиц с входной формой
model.add(Dropout(0.2)) # кик нейронов с вероятностью 20%
model.add(LSTM(700, return_sequences=True)) # второй слой на 700 единиц, обрабатывающий те же последовательности
model.add(Dropout(0.2))
model.add(LSTM(700)) # третий слой на 700 единиц
model.add(Dropout(0.2))
model.add(Dense(Y_modified.shape[1], activation='softmax')) # сеть с плотным слоем для вывода символов
# Конфигурация модели с вычислением категориальных потерь кроссэнтропии
model.compile(loss='categorical_crossentropy', optimizer='adam')
# Обучение модели, если сохранённая модель в текущей папке отсутствует
if not os.path.exists('save_text_generator_deeper_model.h5'):
# Обучение модели на 50 эпохах и 100 обучающих примерах за один проход
model.fit(X_modified, Y_modified, epochs=50, batch_size=100)
# Сохранение обученной модели в файл в текущей папке
model.save_weights('save_text_generator_deeper_model.h5')
"""""""""""""""""""""""""""""""""""""""""""""
Генерация текста
"""""""""""""""""""""""""""""""""""""""""""""
# Загрузка обученной модели с текущей папки
model.load_weights('save_text_generator_deeper_model.h5')
# Сопоставления номеров обратно к символам
n_to_char = dict((i, c) for i, c in enumerate(characters))
# Выбор случайной точки старта в тексте для генерации
start = np.random.randint(0, len(X) - 1)
# Последовательность этой точки
pattern = X[start]
txtxt = "" # строка результата
# сохранение старта в результат
for value in pattern:
txtxt += n_to_char[value]
print("\033[92m\n---> Точка старта: \033[00m", txtxt)
# Генерация 200 символов
for i in range(200):
# Масштабирование последовательности символов
x = np.reshape(pattern, (1, len(pattern), 1))
x = x / float((len(characters)))
prediction = model.predict(x, verbose=0) # прогноз вероятностей к каждому символу
index = np.argmax(prediction) # выбор индекса лучшего по вероятности
txtxt += n_to_char[index] # запись символа с таким индексом в результат
# сохранение индекса символа в конечную результирующую последовательность
pattern.append(index)
pattern = pattern[1:len(pattern)]
print("\033[92m\n[----------> Результат <----------]\033[00m")
print(txtxt)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1 +0,0 @@
Amidst the bustling cityscape, where the rhythm of life beats in harmony with the urban pulse, each dawn brings forth a cascade of city lights painting the skyline in hues of gold and amber. Strangers pass with nods and smiles, creating a tapestry of diverse connections. Skyscrapers line the streets, reflecting the vibrant energy of a metropolis in constant motion. As night falls, the city's heartbeat resonates in lively gatherings at eclectic eateries, where stories are exchanged, and the city's vibrant spirit comes alive.

View File

@ -1 +0,0 @@
In the bustling cityscape where the rhythm of life beats in harmony with the urban pulse each dawn brings forth a cascade of city lights painting the skyline in hues of gold and amber strangers pass with nods and smiles creating a tapestry of diverse connections skyscrapers line the streets reflecting the vibrant energy of a metropolis in constant motion as night falls the city's heartbeat resonates in lively gatherings at

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

View File

@ -1,68 +0,0 @@
import numpy as np
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
def prepare_and_train_model(file_path, epochs):
# Считывание данных из файла
with open(file_path, encoding='utf-8') as f:
data = f.read()
# Создание токенизатора
tokenizer = Tokenizer()
tokenizer.fit_on_texts([data])
# Преобразование текста в последовательности чисел
sequences = tokenizer.texts_to_sequences([data])
# Создание обучающих данных
input_sequences = []
for sequence in sequences:
for i in range(1, len(sequence)):
n_gram_sequence = sequence[:i+1]
input_sequences.append(n_gram_sequence)
# Предобработка для получения одинаковой длины последовательностей
max_sequence_len = max([len(sequence) for sequence in input_sequences])
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')
# Разделение на входные и выходные данные
x, y = input_sequences[:, :-1], input_sequences[:, -1]
# Создание модели рекуррентной нейронной сети
model = keras.Sequential([
keras.layers.Embedding(len(tokenizer.word_index) + 1, 100, input_length=max_sequence_len-1),
keras.layers.Dropout(0.2),
keras.layers.LSTM(150),
keras.layers.Dense(len(tokenizer.word_index) + 1, activation='softmax')
])
# Компиляция и обучение модели
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, epochs=epochs, verbose=1)
return model, tokenizer, max_sequence_len
def generate_text_from_model(model, tokenizer, max_sequence_len, seed_text, next_words):
# Генерация текста
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
predicted = model.predict(token_list)
predict_index = np.argmax(predicted, axis=-1)
word = tokenizer.index_word.get(predict_index[0], '')
seed_text += " " + word
return seed_text
model_rus, tokenizer_rus, max_sequence_len_rus = prepare_and_train_model('russian.txt', 150)
rus_text_generated = generate_text_from_model(model_rus, tokenizer_rus, max_sequence_len_rus, "В", 55)
model_eng, tokenizer_eng, max_sequence_len_eng = prepare_and_train_model('english.txt', 150)
eng_text_generated = generate_text_from_model(model_eng, tokenizer_eng, max_sequence_len_eng, "In the", 69)
with open('russian_generated.txt', 'w', encoding='utf-8') as f_rus:
f_rus.write(rus_text_generated)
with open('english_generated.txt', 'w', encoding='utf-8') as f_eng:
f_eng.write(eng_text_generated)

View File

@ -1,35 +0,0 @@
# Генератор Текста на Рекуррентных Нейронных Сетях
## Общее задание
Выбран художественный англоязычный текст для обучения рекуррентной нейронной сети (RNN) с целью генерации текста. Задача включает подбор архитектуры и параметров для приближения к максимально осмысленным результатам. Далее предусмотрено обмен разработанными сетями с партнером, проверка, как архитектура товарища справляется с вашим текстом, и в конечном итоге подбор компромиссной архитектуры, справляющейся хорошо с обоими видами текстов.
## Задание по вариантам
Вариант: Нечетный вариант (художественный англоязычный текст).
Запуск программы
Программу можно запустить через файл app.py.
Технологии
Язык программирования: Python
Библиотеки: TensorFlow, Keras, Flask
## Описание работы программы
Программа реализует генерацию текста с использованием рекуррентных нейронных сетей (RNN) с помощью библиотек TensorFlow и Keras. Flask используется для создания веб-приложения, которое взаимодействует с моделью RNN. Пользователь вводит начальный текст (seed text) через веб-интерфейс, после чего программа отправляет запрос на сервер, который в свою очередь использует модель для генерации следующего участка текста, основываясь на введенном начальном тексте.
Входные данные
Текстовый файл (например, 'your_text_file.txt'), содержащий обучающие данные.
Веб-интерфейс для ввода начального текста.
Выходные данные
Сгенерированный текст, отображаемый в веб-интерфейсе.
## Вывод консоли:
![img_2.png](img_2.png)
![img_1.png](img_1.png)
![img.png](img.png)
## Получившийся текст:
In the bustling cityscape where the rhythm of life beats in harmony with the urban pulse each dawn brings forth a cascade of city lights painting the skyline in hues of gold and amber strangers pass with nods and smiles creating a tapestry of diverse connections skyscrapers line the streets reflecting the vibrant energy of a metropolis in constant motion as night falls the city's heartbeat resonates in lively gatherings at
## Вывод:
В результате выполнения лабораторной работы были успешно созданы и обучены рекуррентные нейронные сети (RNN) для генерации текста на русском и английском языках.

View File

@ -1 +0,0 @@
В захватывающем мире исследований глубокого космоса, где звезды танцуют свой бескрайний вальс, каждое утро начинается с таинственного свечения далеких галактик, окрашивая космическую панораму в оттенках изумрудных и сапфировых лучей. Космические путешественники встречают друг друга с уважением, обмениваясь впечатлениями о чудесах вселенной. Межзвездные аллеи украшены мерцающими астероидами, создавая ощущение бескрайнего волнения и удивления. По наступлении ночи исследователи созвездий собираются в космических кафе, где звездные истории обретают новые оттенки в мистической атмосфере.

View File

@ -1 +0,0 @@
В захватывающем мире исследований глубокого где где звезды танцуют свой бескрайний вальс каждое каждое начинается с таинственного свечения далеких галактик окрашивая космическую панораму в оттенках изумрудных и сапфировых лучей космические путешественники встречают друг друга с уважением обмениваясь впечатлениями о чудесах вселенной межзвездные аллеи украшены мерцающими астероидами создавая ощущение бескрайнего волнения и удивления по наступлении ночи исследователи