简单梯度下降
一、对y=x^2 +2*x+1进行梯度下降
1.1 用python
x =1
learning_rate =0.1 #学习率
epoches =10
y =lambda x:x**2 +2*x+1 #简单曲线
for epoch in range(epoches):
dx =2*x+2
x = x-learning_rate*dx;
print(x)
out:
-0.7852516352000001
1.2 使用pytorch
import torch
x = torch.randn(1,1,requires_grad =True) #x取随机值
print('grad',x.grad,'data',x.data)
out:
grad None data tensor([[0.2101]])
设置学习率及学习周期
learning_rate =0.1
epoches =10
for epoch in range(epoches):
y = x**2+2*x+1
y.backward()
print("grad",x.grad.data) #x的梯度值
x.data = x.data - learning_rate*x.grad.data #更新x
x.grad.data.zero_()
print(x.data)
二、python+numpy拟合简单曲线 y=2*x
import numpy as np
x_data = np.array([1.,2.,3])
y_data = np.array([2,4,6])
epoches = 10
lr =0.1
w = 0
cost = []
for epoch in range(epoches):
y_pred = x_data*w
loss = (y_pred - y_data)**2/2*len(x_data)
cost.append(sum(loss))
#print(cost)
dw = -2 *(y_data-y_pred)@x_data.T/x_data.shape[0]
w = w - lr*dw
print(w)
out
1.9999999999965319
三、pytorch拟合简单曲线
import torch #导入库
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[2.0],[4.0],[6.0]])
epoches = 10
lr =0.1
w =torch.zeros(1,1,requires_grad =True)
#print(w.data)
cost = []
for epoch in range(epoches):
y_pred = x_data*w
# print(y_pred)
#Loss
loss = torch.mean((y_pred-y_data)**2)
#print(loss.data)
# print(loss.data.numpy())
cost.append(loss.data.item())
#print(cost)
#print(cost)
loss.backward()
#print(w.grad.data)
#参数更新
w.data = w.data - lr*w.grad.data
w.grad.data.zero_()
print(w)
out:
tensor([[2.]], requires_grad=True)
四、pytorch简单线性类y=cx
import torch
import torch.nn as nn
import torch.functional as F
class Model(nn.Module):
'''
初始化
'''
def __init__(self):
super(Model,self).__init__()
self.linear = nn.Linear(1,1,bias =False)
'''
前向
反馈
'''
def forward(self,x):
y_pred = self.linear(x)
return y_pred
实例化
model = Model()
输入数据
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[2.0],[4.0],[6.0]])
criterion = nn.MSELoss(size_average= True) # 注意此处改为True#注意这里改为True
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
epoches = 20
cost = []
for epoch in range(epoches):
y_pred = model(x_data)
loss = criterion(y_pred,y_data)
print(loss)
cost.append(loss.item()) #由于只有一个值 直接item()
optimizer.zero_grad()#清零梯度
loss.backward()#计算梯度
#参数更新
optimizer.step()
list(model.parameters())
out:
[Parameter containing:
tensor([[2.]], requires_grad=True)]