train_loader = DataLoader(d_train, batch_size=batch_size, shuffle=True) val_loader = DataLoader(d_val, batch_size=batch_size, shuffle=False) ### Train model print('Train LSTM ... ') model = LSTMClassifier(embedding_dim, hidden_dim, num_layers, batch_size) model.init_weights() model.embedding.weight = torch.nn.Parameter(torch.Tensor(word2vec.wv.syn0)) model.embedding.weight.requires_grad = False model.cuda() print(model) criterion = nn.NLLLoss() optimizer = optim.Adam( filter(lambda p: p.requires_grad, model.parameters())) for epoch in range(4): train(epoch, model, criterion, optimizer, train_loader) validate(epoch, model, val_loader) print('Done !') ### Save model print('Save model ... ', end='') torch.save(model.state_dict(), '_model.pt') print('Done !')
outputs = model(words) # print("output_shape") # print(outputs.shape) # if y would be one-hot, we must apply # labels = torch.max(labels, 1)[1] loss = F.cross_entropy(outputs, labels) # Backward and optimize 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 = "lstmmodel.pth" torch.save(data, FILE) print(f'training complete. file saved to {FILE}')