diff --git a/istyukov_timofey_lab_7/belye-nochi.txt b/istyukov_timofey_lab_7/belye-nochi.txt new file mode 100644 index 0000000..717e991 --- /dev/null +++ b/istyukov_timofey_lab_7/belye-nochi.txt @@ -0,0 +1,5 @@ +Была чудная ночь, такая ночь, которая разве только и может быть тогда, когда мы молоды, любезный читатель. Небо было такое звездное, такое светлое небо, что, взглянув на него, невольно нужно было спросить себя: неужели же могут жить под таким небом разные сердитые и капризные люди? Это тоже молодой вопрос, любезный читатель, очень молодой, но пошли его вам господь чаще на душу!.. Говоря о капризных и разных сердитых господах, я не мог не припомнить и своего благонравного поведения во весь этот день. С самого утра меня стала мучить какая-то удивительная тоска. Мне вдруг показалось, что меня, одинокого, все покидают и что все от меня отступаются. Оно, конечно, всякий вправе спросить: кто ж эти все? потому что вот уже восемь лет, как я живу в Петербурге и почти ни одного знакомства не умел завести. Но к чему мне знакомства? Мне и без того знаком весь Петербург; вот почему мне и показалось, что меня все покидают, когда весь Петербург поднялся и вдруг уехал на дачу. Мне страшно стало оставаться одному, и целых три дня я бродил по городу в глубокой тоске, решительно не понимая, что2 со мной делается. Пойду ли на Невский, пойду ли в сад, брожу ли по набережной – ни одного лица из тех, кого привык встречать в том же месте в известный час, целый год. Они, конечно, не знают меня, да я-то их знаю. Я коротко их знаю; я почти изучил их физиономии – и любуюсь на них, когда они веселы, и хандрю, когда они затуманятся. Я почти свел дружбу с одним старичком, которого встречаю каждый божий день, в известный час, на Фонтанке. Физиономия такая важная, задумчивая; все шепчет под нос и махает левой рукой, а в правой у него длинная сучковатая трость с золотым набалдашником. Даже он заметил меня и принимает во мне душевное участие. Случись, что я не буду в известный час на том же месте Фонтанки, я уверен, что на него нападет хандра. Вот отчего мы иногда чуть не кланяемся друг с другом, особенно когда оба в хорошем расположении духа. Намедни, когда мы не видались целые два дня и на третий день встретились, мы уже было и схватились за шляпы, да благо опомнились вовремя, опустили руки и с участием прошли друг подле друга. Мне тоже и дома знакомы. Когда я иду, каждый как будто забегает вперед меня на улицу, глядит на меня во все окна и чуть не говорит: «Здравствуйте; как ваше здоровье? и я, слава богу, здоров, а ко мне в мае месяце прибавят этаж». Или: «Как ваше здоровье? а меня завтра в починку». Или: «Я чуть не сгорел и притом испугался» и т. д. Из них у меня есть любимцы, есть короткие приятели; один из них намерен лечиться это лето у архитектора. Нарочно буду заходить каждый день, чтоб не залечили как-нибудь, сохрани его господи!.. Но никогда не забуду истории с одним прехорошеньким светло-розовым домиком. Это был такой миленький каменный домик, так приветливо смотрел на меня, так горделиво смотрел на своих неуклюжих соседей, что мое сердце радовалось, когда мне случалось проходить мимо. Вдруг на прошлой неделе я прохожу по улице, и как посмотрел на приятеля – слышу жалобный крик: «А меня красят в желтую краску!» Злодеи! варвары! они не пощадили ничего: ни колонн, ни карнизов, и мой приятель пожелтел, как канарейка. У меня чуть не разлилась желчь по этому случаю, и я еще до сих пор не в силах был повидаться с изуродованным моим бедняком, которого раскрасили под цвет поднебесной империи. + +Итак, вы понимаете, читатель, каким образом я знаком со всем Петербургом. + +Есть что-то неизъяснимо-трогательное в нашей петербургской природе, когда она, с наступлением весны, вдруг выкажет всю мощь свою, все дарованные ей небом силы, опушится, разрядится, упестрится цветами… Как-то невольно напоминает она мне ту девушку, чахлую и хворую, на которую вы смотрите иногда с сожалением, иногда с какою-то сострадательною любовью, иногда же просто не замечаете ее, но которая вдруг, на один миг, как-то нечаянно сделается неизъяснимо, чудно прекрасною, а вы, пораженный, упоенный, невольно спрашиваете себя: какая сила заставила блистать таким огнем эти грустные, задумчивые глаза? что вызвало кровь на эти бледные, похудевшие щеки? что облило страстью эти нежные черты лица? отчего так вздымается эта грудь? что так внезапно вызвало силу, жизнь и красоту на лицо бедной девушки, заставило его заблистать такой улыбкой, оживиться таким сверкающим, искрометным смехом? Вы смотрите кругом, вы кого-то ищете, вы догадываетесь… Но миг проходит, и, может быть, назавтра же вы встретите опять тот же задумчивый и рассеянный взгляд, как и прежде, то же бледное лицо, ту же покорность и робость в движениях и даже раскаяние, даже следы какой-то мертвящей тоски и досады за минутное увлечение… И жаль вам, что так скоро, так безвозвратно завяла мгновенная красота, что так обманчиво и напрасно блеснула она перед вами – жаль оттого, что даже полюбить ее вам не было времени… \ No newline at end of file diff --git a/istyukov_timofey_lab_7/lab7.py b/istyukov_timofey_lab_7/lab7.py new file mode 100644 index 0000000..8930770 --- /dev/null +++ b/istyukov_timofey_lab_7/lab7.py @@ -0,0 +1,127 @@ +""" +Выбрать художественный текст на языке по варианту и обучить на нём рекуррентную нейронную сеть для решения задачи +генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату. + +Далее разбиться на пары чётный-нечётный вариант, обменяться разработанными сетями и проверить, как архитектура товарища +справляется с вашим текстом. + +В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов. +""" + + +# 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) \ No newline at end of file diff --git a/istyukov_timofey_lab_7/save_text_generator_deeper_model.h5 b/istyukov_timofey_lab_7/save_text_generator_deeper_model.h5 new file mode 100644 index 0000000..2dd9231 Binary files /dev/null and b/istyukov_timofey_lab_7/save_text_generator_deeper_model.h5 differ