| 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() |
|
|
|
|