import torch from torch.utils.data import Dataset,DataLoader import torch.nn as nn import nltk from nltk.stem.porter import PorterStemmer import json import numpy as np def Training(): class NeuralNet(nn.Module): def __init__(self,input_size,hidden_size,num_classes): super(NeuralNet,self).__init__() self.l1 = nn.Linear(input_size,hidden_size) self.l2 = nn.Linear(hidden_size,hidden_size) self.l3 = nn.Linear(hidden_size,num_classes) self.relu = nn.ReLU() def forward(self,x): out = self.l1(x) out = self.relu(out) out = self.l2(out) out = self.relu(out) out = self.l3(out) return out Stemmer = PorterStemmer() def tokenize(sentence): return nltk.word_tokenize(sentence) def stem(word): return Stemmer.stem(word.lower()) def bag_of_words(tokenized_sentence,words): sentence_word = [stem(word) for word in tokenized_sentence] bag = np.zeros(len(words),dtype=np.float32) for idx , w in enumerate(words): if w in sentence_word: bag[idx] = 1 return bag with open("intents.json",'r') as f: intents = json.load(f) all_words = [] tags = [] xy = [] for intent in intents['intents']: tag = intent['tag'] tags.append(tag) for pattern in intent['patterns']: w = tokenize(pattern) all_words.extend(w) xy.append((w,tag)) ignore_words = [',','?','/','.','!'] all_words = [stem(w) for w in all_words if w not in ignore_words] all_words = sorted(set(all_words)) tags = sorted(set(tags)) x_train = [] y_train = [] for (pattern_sentence,tag) in xy: bag = bag_of_words(pattern_sentence,all_words) x_train.append(bag) label = tags.index(tag) y_train.append(label) x_train = np.array(x_train) y_train = np.array(y_train) num_epochs = 1000 batch_size = 8 learning_rate = 0.001 input_size = len(x_train[0]) hidden_size = 8 output_size = len(tags) print(">> Training The Chats Module :- Conciousness ") class ChatDataset(Dataset): def __init__(self): self.n_samples = len(x_train) self.x_data = x_train self.y_data = y_train def __getitem__(self,index): return self.x_data[index],self.y_data[index] def __len__(self): return self.n_samples dataset = ChatDataset() train_loader = DataLoader(dataset=dataset, batch_size=batch_size, shuffle=True, num_workers=0) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = NeuralNet(input_size,hidden_size,output_size).to(device=device) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(),lr=learning_rate) for epoch in range(num_epochs): for (words,labels) in train_loader: words = words.to(device) labels = labels.to(dtype=torch.long).to(device) outputs = model(words) loss = criterion(outputs,labels) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 100 ==0: print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}') print(f'Final Loss : {loss.item():.4f}') data = { "model_state":model.state_dict(), "input_size":input_size, "hidden_size":hidden_size, "output_size":output_size, "all_words":all_words, "tags":tags } FILE = "intents.pth" torch.save(data,FILE) print(f"Training Complete, File Saved To {FILE}") print(" ") Training()