task2:使用numpy或者pytorch进行简单梯度下降

一、对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)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值