欢迎光临散文网 会员登陆 & 注册

Pytorch学习笔记12:Sinx正弦函数曲线拟合(参数保存和加载)

2021-06-30 09:09 作者:车科技2020  | 我要投稿

#需要import的lib
import numpy
import torch
import time
import platform
import cmath
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation

#import CV2
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

#需要import的lib
#运行环境tesla k20/python 3.7/pytorch 1.20
print('——————————运行环境——————————')
print('Python Version:',platform.python_version())
print('Torch Version:',torch.__version__)
#print('OpenCV Version:',CV2.__version__)
print('CUDA GPU check:',torch.cuda.is_available())
if(torch.cuda.is_available()):
print('CUDA GPU num:', torch.cuda.device_count())
n=torch.cuda.device_count()
while n > 0:
  print('CUDA GPU name:', torch.cuda.get_device_name(n-1))
  print('CUDA GPU capability:', torch.cuda.get_device_capability(n-1))
  print('CUDA GPU properties:', torch.cuda.get_device_properties(n-1))
  n -= 1
print('CUDA GPU index:', torch.cuda.current_device())
print('——————————运行环境——————————')

time_start=time.time()

#device=torch.device('cuda:0')
#工程优化应用,GPU不一定更快
device=torch.device('cpu')

class net(torch.nn.Module):
   def __init__(self):
       super(net, self).__init__()
       self.model=torch.nn.Sequential(
           torch.nn.Linear(1,100),
           torch.nn.ReLU(inplace=True),
           torch.nn.Linear(100, 100),
           torch.nn.ReLU(inplace=True),
           torch.nn.Linear(100, 100),
           torch.nn.ReLU(inplace=True),
           torch.nn.Linear(100, 1),
       )
   def forward(self,x) :
       x=self.model(x)
       return x

net_inst=net()
#print(net_inst.state_dict())
#net_inst.load_state_dict(torch.load("c:/net.pth"))#加载神经网络的参数
#print(net_inst.state_dict())
optim=torch.optim.SGD(net_inst.parameters(),lr=1e-4)
loss=torch.nn.MSELoss()
epoch=96

net_inst.load_state_dict(torch.load("c:/net.pth"))
optim.load_state_dict(torch.load("c:/optim.pth"))



sinx=torch.zeros(100,2)
sinx.requires_grad=False

for i in range(0,100):#对sinx进行采样,加了正态分布的噪声
   sinx[i][0]=i*0.1
   mid=torch.from_numpy(np.random.randn(1)*0.03)  # 注意numpy转tensor
   sinx[i][1]=cmath.sin(i*0.1).real+mid

#print(sinx)
#print(sinx.shape)


#t1=sinx.transpose(0,1) #转置一下
#print(t1)
#e=t1[0].detach().numpy()
#f=t1[1].detach().numpy()
#plt.plot(e, f,'b.-')
#plt.show()


data=torch.zeros(100,1)
#print(data)
#print(data.shape)
t1=sinx.transpose(0,1)
t2=data.transpose(0,1)
t2=t1[0]
t3=t2.unsqueeze(1)
#print(t3.shape)
data=t3
#print(data.shape)

target=torch.zeros(100,1)
t2=t1[1]
t3=t2.unsqueeze(1)
target=t3
#print(target.shape)
#print(target)

logits=torch.zeros(100,1)

for j in range(20000):
   logits=net_inst(data)
   loss1=loss(logits, target)
   optim.zero_grad()
   loss1.backward()
   optim.step()
   if j%5000==0:
       print('loss:', loss1)

torch.save(obj=net_inst.state_dict(),f="c:/net.pth")
torch.save(obj=optim.state_dict(),f="c:/optim.pth")

tt1=data.transpose(0,1)
tt2=target.transpose(0,1)
tt3=logits.transpose(0,1)
print(tt1.shape)
print(tt2.shape)
print(tt3.shape)
ttt1=tt1.detach().numpy()
ttt2=tt2.detach().numpy()
ttt3=tt3.detach().numpy()

plt.plot(ttt1, ttt2,'b.-')
plt.plot(ttt1, ttt3,'r.-')
plt.show()

time_end=time.time()
print('Totally cost',time_end-time_start,'s')



#print(net_inst.state_dict())
#torch.save(obj=net_inst.state_dict(),f="c:/net.pth")#保存神经网络的参数

Pytorch学习笔记12:Sinx正弦函数曲线拟合(参数保存和加载)的评论 (共 条)

分享到微博请遵守国家法律