Проблема с tensorflow python

Создаю нейросеть, обучающуюся на собственном датасете из диалогов, вот весь код:

import tkinter as tk
from tkinter import messagebox
import random
import nltk
import numpy as np
from tensorflow.keras import models
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import Sequential

class ChatBot:
    def __init__(self, master):
        # ... (интерфейс - такой же, как в предыдущем коде)

        # Инициализация параметров чат-бота
        self.vocabulary = {}
        self.contexts = []  # Список пар (вход, выход) для обучения нейросети
        self.learning_rate = 0.1
        self.threshold = 0.5

        self.master = master
        master.title("Софа")

        # Создание элементов интерфейса
        self.chat_frame = tk.Frame(master)
        self.chat_frame.pack(pady=10)

        self.chat_area = tk.Text(self.chat_frame, state="normal", wrap="word", height=10)  # Инициализация chat_area
        self.chat_area.pack(side="left", fill="both", expand=True)
        self.chat_area.config(state="disabled")

        # Создание нейросети
        self.model = self.create_model()

        # Начальное сообщение
        self.append_message("Чат-бот:", "Привет! Я - обучающийся чат-бот. Давай пообщаемся!")

    # ... (preprocess_text, update_vocabulary - такие же, как в предыдущем коде)

    def preprocess_text(self, text):
        """Предобработка текста: токенизация, удаление стоп-слов и преобразование в нижний регистр."""
        tokens = nltk.word_tokenize(text.lower())
        stop_words = nltk.corpus.stopwords.words("english")
        tokens = [token for token in tokens if token not in stop_words]
        return tokens

    def update_vocabulary(self, tokens):
        for token in tokens:
            if token not in self.vocabulary:
                self.vocabulary[token] = len(self.vocabulary)

    def encode_sentence(self, sentence):
        """Преобразование предложения в вектор."""
        tokens = self.preprocess_text(sentence)
        self.update_vocabulary(tokens)
        vector = np.zeros(len(self.vocabulary))
        for token in tokens:
            vector[self.vocabulary[token]] = 1
        return vector

    def create_model(self):
        """Создает нейросеть для обучения."""
        model = Sequential()
        model.add(Dense(128, activation='relu', input_shape=(len(self.vocabulary),)))
        model.add(Dense(len(self.vocabulary), activation='softmax'))
        optimizer = Adam(learning_rate=self.learning_rate)
        model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
        return model

    def add_context(self, user_message, bot_response):
        """Добавляет контекст в список для обучения."""
        self.contexts.append((self.encode_sentence(user_message), self.encode_sentence(bot_response)))

    def train_model(self, filename):
        """Обучает нейросеть по данным из файла."""
        with open(filename, 'r', encoding='utf-8') as file:
            lines = file.readlines()
            for i in range(0, len(lines), 2):
                user_message = lines[i].strip()
                bot_response = lines[i + 1].strip()
                self.add_context(user_message, bot_response)

        # Преобразование данных для обучения
        X = [context[0] for context in self.contexts]
        y = [context[1] for context in self.contexts] 

        # Определение максимальной длины последовательности
        max_length = max(len(x) for x in X + y)

        # Дополнение последовательностей до одинаковой длины
        X = pad_sequences(X, maxlen=max_length, padding='post', truncating='post')
        y = pad_sequences(y, maxlen=max_length, padding='post', truncating='post') 

        # Проверка типов данных и размерностей
        print(X.dtype)  # Вывод: float64
        print(y.dtype)  # Вывод: float64
        print(X.shape)  # Вывод: (количество_примеров, размер_входа)
        print(y.shape)  # Вывод: (количество_примеров, размер_выхода)

        # Обучение модели
        self.model.fit(X, y, epochs=10, verbose=0)

    def generate_response(self, user_message):
        """Генерирует ответ, используя обученную нейросеть."""
        user_vector = self.encode_sentence(user_message)
        user_vector = np.expand_dims(user_vector, axis=0)  # Добавление размерности для предсказания
        prediction = self.model.predict(user_vector)
        predicted_vector = np.argmax(prediction, axis=1)  # Выбор наиболее вероятного слова

        # Декодирование вектора в текст
        predicted_tokens = [token for token, index in self.vocabulary.items() if index == predicted_vector[0]]
        predicted_response = ' '.join(predicted_tokens)
        return predicted_response

    def learn(self, user_message, bot_response):
        """Добавляет новый контекст для обучения."""
        self.add_context(user_message, bot_response)

        # Обучение модели на новом контексте
        self.model.fit(np.expand_dims(self.encode_sentence(user_message), axis=0),
                       np.expand_dims(self.encode_sentence(bot_response), axis=0), verbose=0)

    # ... (send_message, append_message - такие же, как в предыдущем коде)

    def append_message(self, sender, message):
        """Добавляет сообщение в чат."""
        self.chat_area.config(state="normal")
        self.chat_area.insert(tk.END, f"{sender}: {message}\n")
        self.chat_area.config(state="disabled")
        self.chat_area.see(tk.END)

root = tk.Tk()
chatbot = ChatBot(root)

# Обучение модели
chatbot.train_model("training_data.txt")  # Замените "training_data.txt" на имя вашего файла

root.mainloop()

В итоге выдает такую ошибку: (Я новичок в python, поэтому прошу объяснить, как исправить ошибку попроще)

Traceback (most recent call last):
  File "C:\Users\max\Desktop\Sofia v1\main.py", line 139, in <module>
    chatbot.train_model("training_data.txt")  # Замените "training_data.txt" на имя вашего файла
  File "C:\Users\max\Desktop\Sofia v1\main.py", line 104, in train_model
    self.model.fit(X, y, epochs=10, verbose=0)
  File "C:\Users\max\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\src\utils\traceback_utils.py", line 122, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\max\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\src\layers\input_spec.py", line 227, in assert_input_compatibility
    raise ValueError(
ValueError: Exception encountered when calling Sequential.call().

Ответы (0 шт):