import os
import mtutils as mt
import torch
from torch import nn
import torch.nn.functional as F
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
from copy import deepcopya = torch.linspace(-1, 1, 1000)
# 升维操作
x = torch.unsqueeze(a, dim=1)
y = x.pow(2) + 0.1 * torch.normal(torch.zeros(x.size()))
gt = x.pow(2).tolist()
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.hidden = nn.Linear(1, 20)
self.predict = nn.Linear(20, 1)
nn.init.kaiming_normal_(self.hidden.weight)
nn.init.constant_(self.hidden.bias, 0)
nn.init.kaiming_normal_(self.predict.weight)
nn.init.constant_(self.predict.bias, 0)
def forward(self, x):
x = self.hidden(x)
x = F.relu(x)
x = self.predict(x)
return x
class dataset(Dataset):
def __init__(self, x, y):
assert len(x) == len(y)
self.x = x
self.y = y
pass
def __len__(self):
return len(self.x)
def __getitem__(self, index):
return self.x[index], self.y[index]
if __name__ == '__main__':
training_data_set = dataset(x, y)
training_data_loader = DataLoader(training_data_set, 16, shuffle=True, drop_last=True)
model = Net()
model.train()
loss = nn.MSELoss()
lr = 0.1
optimizer_dict = dict()
optimizer_dict['SGD'] = torch.optim.SGD
optimizer_dict['ASGD'] = torch.optim.ASGD
optimizer_dict['Adadelta'] = torch.optim.Adadelta
optimizer_dict['Adagrad'] = torch.optim.Adagrad
optimizer_dict['Adam'] = torch.optim.Adam
optimizer_dict['AdamW'] = torch.optim.AdamW
optimizer_dict['Adamax'] = torch.optim.Adamax
optimizer_dict['RMSprop'] = torch.optim.RMSprop
optimizer_dict['Rprop'] = torch.optim.Rprop
loss_dict = dict()
res_dict = dict()
for name, optimizer in optimizer_dict.items():
temp_model = deepcopy(model)
temp_model.train()
loss_list = list()
temp_optimizer = optimizer(temp_model.parameters(), lr)
for epoch in mt.tqdm(range(4)):
for index, data in enumerate(training_data_loader):
temp_optimizer.zero_grad()
input_data, target_data = data
output = temp_model(data[0])
loss_res = loss(output, target_data)
loss_list.append(loss_res.detach().numpy())
loss_res.backward()
temp_optimizer.step()
loss_dict[name] = loss_list
temp_model.eval()
with torch.no_grad():
res = temp_model(torch.tensor(x))
res = res.detach().numpy().squeeze().tolist()
res_dict[name] = res
res_dict['gt'] = gt
fig = mt.plt.figure(figsize=(10, 10), dpi=100)
mt.plt.subplot(1,2,1)
for key, values in loss_dict.items():
mt.plt.plot(list(range(len(values))), values, label=key)
pass
mt.plt.ylim(0, 1)
mt.plt.legend()
mt.plt.title("loss")
mt.plt.subplot(1,2,2)
for key, values in res_dict.items():
mt.plt.plot(list(range(len(values))), values, label=key)
pass
mt.plt.legend()
mt.plt.title("results")
mt.plt.show()