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

反向传播 《PyTorch深度学习实践》,第1张

反向传播过程:先算损失,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() #  反向传播 得出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())

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/787059.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存