import torch import torch.nn as nn import torch.optim as optim import numpy as np from MultiplicationNet import MultiplicationNet from device import device def generate_data(num_samples, min_val=0, max_val=100): x1 = np.random.randint(min_val, max_val, size=(num_samples, 1)) x2 = np.random.randint(min_val, max_val, size=(num_samples, 1)) y = x1 * x2 return np.hstack([x1, x2]), y def train(): num_samples = 10000 num_epochs = 30000 learning_rate = 0.01 x, y = generate_data(num_samples) x_train = torch.tensor(x, dtype=torch.float).to(device) y_train = torch.tensor(y, dtype=torch.float).to(device) model = MultiplicationNet().to(device) criterion = nn.MSELoss().to(device) optimizer = optim.Adam(model.parameters(), lr=learning_rate) scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=100, gamma=0.95) for epoch in range(num_epochs): outputs = model(x_train) loss = criterion(outputs, y_train) optimizer.zero_grad() loss.backward() optimizer.step() scheduler.step() print(f"Epoch {epoch}, loss = {loss.item()}") torch.save(model, "model.pth") if __name__ == '__main__': train()