反向传播 《PyTorch深度学习实践》

反向传播过程:先算损失,backward,得到梯度,用梯度下降做更新w
代码过程:
确定模型
定义损失函数(MSE均方损失)
更新优化w 使用sgd随机梯度下降
梯度下降---->随机梯度下降(拿单个样本的损失函数来更新)

import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
 
w = torch.tensor([1.0]) # w的初值为1.0
w.requires_grad = True # 需要计算梯度
 
def forward(x):   #y_hat 确定模型
    return x*w 
 
 
def loss(x, y):    #L   定义损失函数
    y_pred = forward(x)
    return (y_pred - y)**2
 
print("predict (before training)", 4, forward(4).item())
 
for epoch in range(100):  #更新优化w 使用sgd随机梯度下降
    for x, y in zip(x_data, y_data):
        l =loss(x,y) # 计算损失,l是tensor【正向】
        l.backward() #  反向传播 自动将loss计算图中每个梯度计算出来,得出L对w的偏导【反向】
        print('\tgrad:', x, y, w.grad.item())#w.grad.item()得到浮点数
        w.data = w.data - 0.01 * w.grad.data   # w权重更新,w.grad.data得到是tensor,但不建立计算图,不计算梯度
 
        w.grad.data.zero_() # 梯度清零
 
    print('progress:', epoch, l.item()) # 取出loss使用l.item,不要直接使用l(l是tensor会构建计算图)
 
print("predict (after training)", 4, forward(4).item())

注意:tensor张量 包含data(w),grad(L对w偏导)
l.data()得到是tensor,但不建立计算图,不计算梯度
l.item()得到是浮点数,标量
w.grad()得到是tensor
使用tensor就是在建立计算图

import numpy as np
import matplotlib.pyplot as plt
import torch

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

w1 = torch.Tensor([1.0]) #设定w1,w2,b为tensor好计算grad
w1.requires_grad = True
w2 = torch.Tensor([1.0])
w2.requires_grad = True
b = torch.Tensor([1.0])
b.requires_grad = True

def forward(x):   # y_ha = w1*x^2+w2*x+b
    return w1 * x**2 + w2 * x + b

def loss(x,y):
    y_pred = forward(x)
    return (y_pred-y) **2

print('Predict (befortraining)',4,forward(4))

for epoch in range(100):
    for x,y in zip(x_data,y_data):
        l = loss(x, y)
        l.backward() #反向传播,得到之前定义的tensor的grad
        print('\tgrad:',x,y,w1.grad.item(),w2.grad.item(),b.grad.item())
        w1.data = w1.data - 0.01 * w1.grad.data 
        w2.data = w2.data - 0.01 * w2.grad.data
        b.data = b.data - 0.01 * b.grad.data
        w1.grad.data.zero_() #梯度清零
        w2.grad.data.zero_()
        b.grad.data.zero_()
    print('Epoch:',epoch,l.item())

print('Predict(after training)',4,forward(4).item())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值