Проблема с 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().