Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Caesar RNN Decoder

Проект на PyTorch, который учит рекуррентную сеть дешифровывать фразы, зашифрованные шифром Цезаря.

Модель получает на вход зашифрованную строку посимвольно и восстанавливает исходный текст.

Задача

Шифр Цезаря заменяет каждую букву алфавита на букву, сдвинутую на фиксированное число позиций k.

В этом проекте:

  • используется русский алфавит без буквы ё;
  • пробел сохраняется и не шифруется;
  • обучающая выборка генерируется автоматически;
  • модель обучается по схеме:
    • вход: зашифрованная фраза;
    • выход: исходная фраза.

Архитектура

Модель реализована как many-to-many последовательностный декодер:

  • Embedding для преобразования символов в векторы;
  • двухслойная двунаправленная LSTM;
  • Linear слой для предсказания символа на каждом шаге.

Такой подход хорошо подходит для учебной задачи, потому что каждому символу зашифрованной последовательности соответствует символ в расшифрованной последовательности.

Структура проекта

caesar-rnn-decoder/
  caesar_rnn/
    __init__.py
    cipher.py
    config.py
    data.py
    inference.py
    model.py
    trainer.py
    utils.py
    vocab.py
  tests/
    test_cipher.py
    test_data.py
    test_model.py
  artifacts/
  infer_caesar_rnn.py
  requirements.txt
  train_caesar_rnn.py

Назначение модулей

  • caesar_rnn/cipher.py — логика шифра Цезаря: сдвиг символов, шифрование и дешифрование.
  • caesar_rnn/data.py — генерация случайных фраз, формирование выборки, Dataset и DataLoader.
  • caesar_rnn/vocab.py — словарь символов и преобразование строк в индексы.
  • caesar_rnn/model.py — определение нейросети CaesarDecoderRNN.
  • caesar_rnn/trainer.py — цикл обучения, расчет loss и accuracy, сохранение checkpoint.
  • caesar_rnn/inference.py — загрузка модели и предсказание на новых строках.
  • caesar_rnn/config.py — dataclass-конфиги для данных, модели и обучения.
  • caesar_rnn/utils.py — общие константы и вспомогательные функции.

Установка

Установить зависимости:

py -m pip install -r requirements.txt

Обучение

Базовый запуск:

py train_caesar_rnn.py

Запуск с параметрами:

py train_caesar_rnn.py --shift 5 --train-size 4000 --test-size 1000 --epochs 5

Основные параметры:

  • --shift — величина сдвига в шифре Цезаря;
  • --train-size — размер обучающей выборки;
  • --test-size — размер тестовой выборки;
  • --epochs — число эпох;
  • --batch-size — размер батча;
  • --embed-dim — размерность эмбеддингов;
  • --hidden-dim — размер скрытого состояния LSTM;
  • --learning-rate — шаг обучения;
  • --seed — фиксатор случайности;
  • --artifacts-dir — папка для сохранения результатов.

Что выводится при обучении

Во время запуска скрипт печатает:

  • алфавит;
  • значение сдвига;
  • используемое устройство (cpu или cuda);
  • метрики по эпохам:
    • train_loss
    • train_acc
    • test_loss
    • test_acc
  • несколько примеров дешифровки.

После обучения сохраняются:

  • artifacts/caesar_decoder_rnn.pt — веса модели и конфигурация;
  • artifacts/metrics.json — история обучения по эпохам.

Инференс

После обучения можно расшифровать произвольную строку:

py infer_caesar_rnn.py "сеэнттук ужшьктнк"

Если нужно вывести и результат классической дешифровки по известному сдвигу:

py infer_caesar_rnn.py "сеэнттук ужшьктнк" --show-reference

Пример вывода:

Encrypted: сеэнттук ужшьктнк
Predicted: машинное обучение
Reference: машинное обучение

Тесты

Минимальные тесты покрывают:

  • корректность шифрования и дешифрования;
  • формирование датасета и padding батчей;
  • форму выхода модели.

Запуск:

py -m unittest discover -s tests -v

Результат

В проверенном запуске проекта модель достигала test_accuracy = 100% на автоматически сгенерированной тестовой выборке для фиксированного сдвига.

Ограничения

  • модель обучается на синтетических данных;
  • решение рассчитано на фиксированный сдвиг k в рамках одного обучения;
  • качество проверяется на простом сценарии без шума и без смешивания разных шифров.

Идеи для развития

  • обучать модель сразу на нескольких значениях сдвига;
  • добавить поддержку других алфавитов;
  • перейти от посимвольной генерации случайных слов к реальным словам и фразам;
  • сравнить LSTM с GRU и обычной RNN;
  • добавить сохранение лучшей модели по валидационной метрике.

About

Дешифровка шифра Цезаря с помощью RNN/LSTM на PyTorch: генерация данных, обучение, инференс и тесты.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages