第一部分:求下面函数取得的最小值时,此时X的值是多少?
何为梯度下降,本质就是从该点切线方向,慢慢走下去。切线方向:就是给定一个很小的增量值,试探一下方向。
1、方向的增量值:
2、不断迭代,当增量为很小时,意味着x应该是
#超参数
m=0.02
n=0.00000001
def fn(x):
return 1/2*x*x-10*x
def getdivide(x):
return (fn(x+0.00001)-fn(x))/0.00001
def getmixindex(x):
a = x
while True:
y=a-m*getdivide(a)
a=y
if abs(m*getdivide(a))<n:break
return a
print(getmixindex(100))
结果为:
第二部分:使用pytorch 求f=ax+by 回归问题.
数据存放为data.csv 使用pandas 读取,转为torch向量
1、处理好DataSet便以训练
2、构建模型
3、训练
import torch
from torch.utils.data import Dataset,DataLoader
import pandas as pd
class MyDataSet(Dataset):
def __init__(self,filename):
datasource = pd.read_csv(filename, header=None)
datasets = datasource.values
x_source = torch.Tensor(datasets[:, :2])
y_source = torch.Tensor(datasets[:, 3])
self.x=x_source
self.y=y_source
def __getitem__(self, item):
return self.x[item],self.y[item]
def __len__(self):
return len(self.x)
data=MyDataSet('data.csv')
dataloader=DataLoader(dataset=data,batch_size=4,shuffle=True)
class MyNet(torch.nn.Module):
def __init__(self):
super(MyNet,self).__init__()
self.line=torch.nn.Linear(2,1,bias=False)
def forward(self,x):
return self.line(x)
def getparam(self):
for param in self.parameters():
print(param)
mm=MyNet()
optim=torch.optim.Adam(params=mm.parameters(),lr=0.1)
lossfunction=torch.nn.MSELoss(reduction='sum')
print("前面结果")
mm.train()
print('参数',mm.getparam())
for j in range(1000):
sum=0
for i,data in enumerate(dataloader):
x,y=data
pred=mm(x)
optim.zero_grad()
loss=lossfunction(pred,torch.unsqueeze(y,1))
loss.backward()
print(optim.param_groups)
optim.step()
sum+=loss.item()
break
print(j+1,sum)
print("后面结果")
mm.eval()
print('参数',mm.getparam())
最后显示出
显然 a=3,b=-2可以满足,跟预先设置基本相同。