diff --git a/B-教学案例与实践/B6-神经网络基本原理简明教程/SourceCode/ch05-MultiVariableLinearRegression/Level7_Pytorch.py b/B-教学案例与实践/B6-神经网络基本原理简明教程/SourceCode/ch05-MultiVariableLinearRegression/Level7_Pytorch.py new file mode 100644 index 00000000..e63c19fb --- /dev/null +++ b/B-教学案例与实践/B6-神经网络基本原理简明教程/SourceCode/ch05-MultiVariableLinearRegression/Level7_Pytorch.py @@ -0,0 +1,68 @@ +import numpy as np +import matplotlib.pyplot as plt +from pathlib import Path +import math +from torch.utils.data import TensorDataset, DataLoader +from HelperClass.NeuralNet_1_1 import * +import torch.nn as nn +import torch.nn.functional as F +import torch +from torch.optim import Adam +import warnings +warnings.filterwarnings('ignore') + +file_name = "../../data/ch05.npz" + + +class Model(nn.Module): + def __init__(self, input_size): + super(Model, self).__init__() + self.fc = nn.Linear(input_size, 1) + def forward(self, x): + x = self.fc(x) + return x + +if __name__ == '__main__': + max_epoch = 500 + num_category = 3 + sdr = DataReader_1_1(file_name) + sdr.ReadData() + sdr.NormalizeX() + sdr.NormalizeY() + + num_input = 2 # input size + # get numpy form data + XTrain, YTrain = sdr.XTrain, sdr.YTrain + torch_dataset = TensorDataset(torch.FloatTensor(XTrain), torch.FloatTensor(YTrain)) + + train_loader = DataLoader( # data loader class + dataset=torch_dataset, + batch_size=32, + shuffle=True, + ) + + loss_func = nn.MSELoss() + model = Model(num_input) + optimizer = Adam(model.parameters(), lr=1e-4) + + e_loss = [] # mean loss at every epoch + for epoch in range(max_epoch): + b_loss = [] # mean loss at every batch + for step, (batch_x, batch_y) in enumerate(train_loader): + optimizer.zero_grad() + pred = model(batch_x) + loss = loss_func(pred,batch_y) + b_loss.append(loss.cpu().data.numpy()) + loss.backward() + optimizer.step() + b_loss.append(loss.cpu().data.numpy()) + e_loss.append(np.mean(b_loss)) + if epoch % 20 == 0: + print("Epoch: %d, Loss: %.5f" % (epoch, np.mean(b_loss))) + plt.plot([i for i in range(max_epoch)], e_loss) + plt.xlabel('Epoch') + plt.ylabel('Mean loss') + plt.show() + + +