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