PyTorch深度學習實踐 反向傳播

2022-09-21 03:03:06 字數 3286 閱讀 8768

《pytorch深度學習實踐》完結合集_嗶哩嗶哩_bilibili

目錄在之前課程中介紹的線性模型就是乙個最簡單的神經網路的結構,其內部引數的更新過程如下:

對於簡單的模型來說可以直接使用表示式的方式來更新權重,但是如果網路結構比較複雜(如下圖),直接使用解析式的方式來更新顯然有些複雜且不太可能實現。

反向傳播就是為了解決這種問題。反向傳播的基本思想就是將網路看成一張圖,在圖上傳播梯度,從而使用鏈式傳播來計算梯度。首先介紹兩層的網路的計算圖的方式表示如下圖所示:

矩陣求導參考書籍鏈結如下:

如果把式子展開,將會有如下結果:

也就是多層線性模型的疊加是可以用乙個線性模型來實現的。因此為了提高模型的複雜程度,對於每一層的輸出增加乙個非線性的變化函式,如sigmoid等函式,如下圖所示:

反向傳播的鏈式求導的過程乙個例項如下圖所示:

得到相應導數之後就可以對於權重進行更新,如果x也只是乙個中間結果,則可以繼續向前傳導。

接下來可以看乙個完整的線性模型的計算圖示例,過程就是先進行前饋過程,在前饋到loss之後進行反向傳播,從而完成計算:

接下來介紹在pytorch中如何進行前饋和反饋計算。

首先需要介紹的是tensor,這是pytorch中構建動態圖的乙個重要組成部分,tensor中主要元素的是data(資料)和grad(導數),分別用於儲存權重值和損失函式對權重的導數。

使用pytorch實現上述的線性模型的**如下:

import torch

x_data = [1.0, 2.0, 3.0]

y_data = [2.0, 4.0, 6.0]

w = torch.tensor([1.0]) #初值為1.0

w.requires_grad = true # 需要計算梯度

def forward(x):

return x*w # 返回tensor

def loss(x, y):

y_pred = forward(x)

return (y_pred - y)**2

print("predict (before training)", 4, forward(4).item())

for epoch in range(100):

for x, y in zip(x_data, y_data):

l =loss(x,y) #l是乙個張量

l.backward() #將計算鏈路上需要梯度的地方計算出梯度,這一步之後計算圖釋放,每一次更新都建立新的計算圖

print('\tgrad:', x, y, w.grad.item())#item是為了把梯度中的數值取出為標量

w.data = w.data - 0.01 * w.grad.data # 權重更新時,使用標量,使用data的時候不會建立新的計算圖,注意grad也是乙個tensor

w.grad.data.zero_() # 更新之後將梯度資料清零

print('progress:', epoch, l.item())

print("predict (after training)", 4, forward(4).item())

1、手動推導線性模型y=w*x,損失函式loss=(ŷ-y)²下,當資料集x=2,y=4的時候,反向傳播的過程。

2、手動推導線性模型 y=w*x+b,損失函式loss=(ŷ-y)²下,當資料集x=1,y=2的時候,反向傳播的過程。

3、畫出二次模型y=w1x²+w2x+b,損失函式loss=(ŷ-y)²的計算圖,並且手動推導反向傳播的過程,最後用pytorch的**實現。

**如下:

import torch

import matplotlib.pyplot as plt

import numpy as np

x_data=[1.0,2.0,3.0]

y_data=[2.0,4.0,6.0]

w1=torch.tensor([1.0],requires_grad=true)

w2=torch.tensor([1.0],requires_grad=true)

b=torch.tensor([1.0],requires_grad=true)

epoch_list=

loss_list=

def forward(x):

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()

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())

print('predict (after training)', 4, forward(4))

plt.plot(epoch_list, loss_list)

plt.ylabel('loss')

plt.xlabel('epoch')

plt.show()

視覺化loss如下:

PyTorch深度學習實踐(四) 反向傳播

b站 pytorch深度學習實踐 反向傳播 1 tensor包含data 和 grad w.data w.grad.data 數值計算,不構建計算圖。w.grad.item 取出數值。w.grad.data.zero 清零 2 w是tensor型別,data和grad也是tensor型別,注意取值時...

三 PyTorch 深度學習 反向傳播

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 需要計算梯度 defforward x return x w w是乙個tensor defloss ...

PyTorch深度學習實踐 Overview

pytorch是乙個基於torch的python開源機器學習庫,用於自然語言處理等應用程式。它主要由facebookd的人工智慧小組開發,不僅能夠 實現強大的gpu加速,同時還支援動態神經網路。pytorch是乙個動態的框架,而tensorflow是靜態框架 2.x版本也為動態框架優先 靜態框架就是...