go to my website
随笔 - 4, 文章 - 0, 评论 - 0, 阅读 - 1491
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

梯度下降方法,求解问题 最入门思想

Posted on   牧心森林  阅读(12)  评论(0编辑  收藏  举报

第一部分:求下面函数取得的最小值时,此时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可以满足,跟预先设置基本相同。

 

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示