第一部分:求下面函数取得的最小值时,此时X的值是多少?
何为梯度下降,本质就是从该点切线方向,慢慢走下去。切线方向:就是给定一个很小的增量值,试探一下方向。
1、方向的增量值:
2、不断迭代,当增量为很小时,意味着x应该是
1 #超参数 2 m=0.02 3 n=0.00000001 4 #代码函数 5 def fn(x): 6 return 1/2*x*x-10*x 7 8 def getdivide(x): 9 return (fn(x+n)-fn(x))/n 10 11 12 def getmixindex(start): 13 x = start 14 while True: 15 y=x-m*getdivide(a) 16 x=y 17 if abs(m*getdivide(x))<n:break 18 19 return x 20 21 if __name__=="__main__": 22 print(getmixindex(100))
结果为:
第二部分:使用pytorch 求f=ax+by 回归问题.
数据存放为data.csv 使用pandas 读取,转为torch向量
1、处理好DataSet便以训练
2、构建模型
3、训练
1 import torch 2 from torch.utils.data import Dataset,DataLoader 3 import pandas as pd 4 5 6 class MyDataSet(Dataset): 7 def __init__(self,filename): 8 datasource = pd.read_csv(filename, header=None) 9 datasets = datasource.values 10 x_source = torch.Tensor(datasets[:, :2]) 11 y_source = torch.Tensor(datasets[:, 3]) 12 13 14 self.x=x_source 15 self.y=y_source 16 def __getitem__(self, item): 17 return self.x[item],self.y[item] 18 def __len__(self): 19 return len(self.x) 20 21 22 23 data=MyDataSet('data.csv') 24 dataloader=DataLoader(dataset=data,batch_size=4,shuffle=True) 25 26 27 class MyNet(torch.nn.Module): 28 def __init__(self): 29 super(MyNet,self).__init__() 30 self.line=torch.nn.Linear(2,1,bias=False) 31 32 def forward(self,x): 33 return self.line(x) 34 def getparam(self): 35 for param in self.parameters(): 36 print(param) 37 38 39 40 41 mm=MyNet() 42 43 44 optim=torch.optim.Adam(params=mm.parameters(),lr=0.1) 45 lossfunction=torch.nn.MSELoss(reduction='sum') 46 47 print("前面结果") 48 mm.train() 49 print('参数',mm.getparam()) 50 for j in range(1): 51 sum=0 52 53 for i,data in enumerate(dataloader): 54 55 x,y=data 56 pred=mm(x) 57 optim.zero_grad() 58 loss=lossfunction(pred,torch.unsqueeze(y,1)) 59 loss.backward() 60 print(optim.param_groups) 61 optim.step() 62 sum+=loss.item() 63 break 64 print(j+1,sum) 65 66 67 68 print("后面结果") 69 mm.eval() 70 print('参数',mm.getparam())
最后显示出
显然 a=3,b=-2可以满足,跟预先设置基本相同。
标签:__,入门,求解,mm,梯度,self,torch,print,def From: https://www.cnblogs.com/seemenlee/p/18407611