Я написал файл RNN.py который обучается предсказывать числа.
Суть вот в чём: у меня есть файл numbers.json который содержит в себе следующие значения {"numbers": ["2.44x", "8.14x", "1.79x", "59.34x"]} самое новое с лева, эти значения подгружаются в этот файл на лету, каждый раз обновляя этот файл, примерно в среднем через 8 секунд +/-.

Мой скрипт RNN.py по идее должен делать следующее:
Считывать значения из этого файла и обучаться предсказывать следующее значение "показывая его мне в консоли". 
Приведу пример того как это должно происходить: 
Вот у нас сейчас есть эти значения в файле numbers.json {"numbers": ["2.44x", "8.14x", "1.79x", "59.34x"]} скрипт должен угадать следующее значение и показать мне его в консоли, после чего ждать появления результата в самом начале, в файле numbers.json например так  {"numbers": ["4.33x", "2.44x", "8.14x", "1.79x", "59.34x"]}, если результат RNN который он вывел мне в консоль оказался не верным, он должен скорректировать себя там обучится, понять, что не верный результат показал или не совсем точный близкий к тому который появился в файле numbers.json и предугадать следующий результат до того как он появится в файле numbers.json, предугадать вывести его опять-же мне в консоль и ожидать результата в файле numbers.json для того что-бы свериться, был-ли угадан результат или нет. И так до тех пор пока я сам не остановлю работу скрипта!

Вот мой скрипт RNN.py тебе нужно его исправить он не работает должным образом!

import json
import torch
import torch.nn as nn
import torch.optim as optim
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

# Определение архитектуры RNN


class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
        self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, input):
        hidden = torch.zeros(1, input.size(0), self.hidden_size)
        output, _ = self.rnn(input.unsqueeze(0), hidden)
        output = self.fc(output.squeeze(0))
        return output


# Параметры модели
input_size = 1  # Размер входных данных (чисел)
hidden_size = 64  # Размер скрытого слоя RNN
# Размер выхода (предсказанного числа)
output_size = 1
learning_rate = 0.01  # Скорость обучения модели, определяет величину шага при корректировке весов
training_loss = 0.0 # Инициализация переменной

# Создание экземпляра модели
model = RNN(input_size, hidden_size, output_size)

# Определение функции потерь и оптимизатора
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)

# Обучение модели


def train(model, input_sequence, target):
    optimizer.zero_grad()
    output = model(input_sequence)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()
    return loss.item()

# Пример использования модели для предсказания следующего числа


def predict(model, input_sequence):
    with torch.no_grad():
        output = model(input_sequence)
    predicted_number = output[-1].item()
    return predicted_number

# Обработчик событий файловой системы


class JSONHandler(FileSystemEventHandler):
    def __init__(self):
        self.previous_number = None

    def on_modified(self, event):
        if event.src_path == "./numbers.json":  # Путь к JSON файлу
            with open(event.src_path, "r") as jsonfile:
                data = json.load(jsonfile)
            numbers = data["numbers"]

            # Удаление символа 'x' и преобразование чисел в список float
            numbers = [float(number.strip('x')) for number in numbers]

            if self.previous_number is not None:
                # Преобразование данных в тензоры PyTorch
                input_sequence = torch.tensor(
                    [[self.previous_number]], dtype=torch.float32)
                target = torch.tensor([[numbers[0]]], dtype=torch.float32)

                # Обучение модели
                loss = train(model, input_sequence, target)
                training_loss += loss

            # Предсказание следующего числа
            input_sequence = torch.tensor(
                [[float(numbers[0])]], dtype=torch.float32)
            predicted_number = predict(model, input_sequence)
            print(f"Predicted: {predicted_number}, Actual: {numbers[1]}")

            # Обновление предыдущего числа
            self.previous_number = float(numbers[0])

            # Удаление использованных чисел из списка
            numbers = numbers[1:]

            # Запись обновленных данных в другой JSON файл "rnn_numbers.json"
            rnn_data = {
                "numbers": numbers
            }
            with open("rnn_numbers.json", "w") as jsonfile:
                json.dump(rnn_data, jsonfile)


# Создание экземпляра обработчика событий файловой системы
event_handler = JSONHandler()

# Создание экземпляра наблюдателя за изменениями файловой системы
observer = Observer()
observer.schedule(event_handler, path="./", recursive=False)

# Запуск наблюдателя в фоновом режиме
observer.start()

# Цикл, который позволяет модели RNN работать непрерывно
try:
    while True:
        pass
except KeyboardInterrupt:
    # Остановка Observer при нажатии Ctrl+C
    observer.stop()

# Сохранение модели и оптимизатора
torch.save(model.state_dict(), "rnn_model.pt")
torch.save(optimizer.state_dict(), "rnn_optimizer.pt")

# Остановка Observer при нажатии Ctrl+C
observer.stop()

# Дождаться завершения работы наблюдателя
observer.join()