AlexSychovUN's picture
Prepared for deploy
13188b8
import torch
import pandas as pd
from torch_geometric.loader import DataLoader
from Dataset_Preparation import SmilesDataset
from model import GNNClassifier
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(DEVICE)
def train(model, loader, optimizer, criterion):
model.train()
total_loss = 0
for batch in loader:
batch = batch.to(DEVICE)
optimizer.zero_grad()
out = model(batch.x, batch.edge_index, batch.batch)
loss = criterion(out, batch.y)
loss.backward()
optimizer.step()
total_loss += loss.item()
return total_loss / len(loader)
def test(model, loader):
model.eval()
correct = 0
with torch.no_grad():
for batch in loader:
batch = batch.to(DEVICE)
out = model(batch.x, batch.edge_index, batch.batch)
pred = out.argmax(dim=1)
correct += (pred == batch.y).sum().item()
acc = correct / len(loader.dataset)
return acc
if __name__ == "__main__":
columns = ["smiles", "label"]
train_dataset = pd.read_csv(
"dataset/classification/data_train.txt", sep=" ", header=None, names=columns
)
test_dataset = pd.read_csv(
"dataset/classification/data_test.txt", sep=" ", header=None, names=columns
)
train_dataset = SmilesDataset(train_dataset)
test_dataset = SmilesDataset(test_dataset)
train_dataset = [data for data in train_dataset if data is not None]
test_dataset = [data for data in test_dataset if data is not None]
num_node_features = train_dataset[0].x.shape[1]
num_classes = 2
print(f"Train samples: {len(train_dataset)}")
print(f"Test samples: {len(test_dataset)}")
print(f"Node features: {num_node_features}")
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=True)
model = GNNClassifier(
input_dim=num_node_features, output_dim=num_classes, hidden_channels=16
).to(DEVICE)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = torch.nn.CrossEntropyLoss()
EPOCHS = 20
print("Start Training")
for epoch in range(1, EPOCHS + 1):
train_loss = train(model, train_loader, optimizer, criterion)
train_acc = test(model, train_loader)
print(f"Epoch: {epoch}, Loss: {train_loss}, Train Accuracy: {train_acc}")
test_acc = test(model, test_loader)
print(f"Test Accuracy: {test_acc}")