Pytorch學習筆記之通過numpy實現線性擬合

2021-10-25 01:14:06 字數 3656 閱讀 4693

通過使用numpy庫編寫簡單的gradient descent資料位於附件之中

import torch

from torch import autograd

import numpy as np

import matplotlib.pyplot as plt

'''torch關於求導的簡單運用'''

# x = torch.tensor(1.)

# a = torch.tensor(1.,requires_grad=true)

# b = torch.tensor(2.,requires_grad=true)

# c = torch.tensor(3.,requires_grad=true)

## y = a**2*x + b*x + c

## print('before',a.grad,b.grad,c.grad)

# grads = autograd.grad(y,[a,b,c])

# print('after',grads[0],grads[1],grads[2])

"""函式名:loss_function(損失函式) """ #首先明確此次通過偏導想求擬合的直線方程為y = w*x + b

"""引數名:b:擬合曲線的biase(偏移量)"""

""" w:擬合曲線x的係數 """

""" points:待擬合資料 """

"""返回值:返回值為平方損失函式的均值 """

def loss_function(b,w,points):

totle_value = 0

for i in range(len(points)): #通過for迴圈達到求解對應b,w下的損失函式的值的目的

x = points[i,0]

y = points[i,1]

totle_value += ((w*x + b) - y)**2 #損失之的求解,其中w*x + b為**值,y為真實值,計算在當前w,b下每個**值偏離實際值之和

#平方損失函式

return totle_value/float(len(points))

"""函式名:grad_function(梯度函式) """

"""引數名:b_current:擬合曲線的biase(偏移量)"""

""" w_current:擬合曲線x的係數 """

""" points:待擬合資料 """

""" learning_rate:學習率 """

"""返回值:當前b,w值下update後新的b,w值 """

def grad_function(b_current,w_current,learning_rate,points): #本次函式中用到的是普通的gradient descent(梯度下降)

#所以對應的公式為w = w - ?*learningrate

b_gradent = 0 #設定當前梯度為0

w_gradent = 0

n = float(len(points)) #確定資料個數

for i in range(0,len(points)):

x = points[i,0]

y = points[i,1]

b_gradent += -(2/n)*(y - (w_current*x + b_current)) #求解b方向上梯度值,即loss函式對b的偏導值

w_gradent += -(2/n)*x*(y - (w_gradent*x + b_current)) #求解w方向上梯度值,即loss函式對w的偏導值

new_b = b_current - b_gradent*learning_rate #求解update之後的b的值

new_w = w_current - w_gradent*learning_rate #求解update之後的b的值

return [new_b,new_w]

"""函式名:loop_grad(梯度函式迴圈函式) """

"""引數名:b_start:擬合曲線的biase(偏移量) """

""" w_start:擬合曲線x的係數 """

""" points:待擬合資料 """

""" learning_rate:學習率 """

""" num_interation:步進次數 """

"""返回值:num_iteration次之後的b和w值 """

def loop_grad(points,b_start,w_start,learning_rate,num_iteration):

b = b_start

w = w_start

x = range(-100,100,1)

for i in range(0,num_iteration):

b,w = grad_function(b,w,learning_rate,np.array(points))

print(b,w)

y = w * x + b

plt.plot(x, y)

plt.show()

return [b,w]

"""函式名:run """

"""函式功能:實現步進求解 """

def run():

points = np.genfromtxt("d:\datadata\pytorch\pytorch_learn_by_dragen1860\datasets\l3_data.csv",delimiter=",")

learning_rate = 0.01

init_b = 3

init_w = 4

num_iteration = 100

print('running...')

[b,w] = loop_grad(points/100,init_b,init_w,learning_rate,num_iteration)

# print("b",b)

print("after iterations b = ,w = ,error = ".

format(num_iteration,b,w,loss_function(b,w,points/100)))

if __name__ == '__main__':

run()

本此使用的是簡單的梯度下降的方法求擬合曲線,所以一共通過三個函式實現功能,首先第乙個是損失函式loss_function,第二個需要的函式為梯度下降求解函式,第三個函式為梯度步進函式,梯度步進的函式主要是通過對梯度下降函式的迴圈來達到求得最佳解。

本次學習過程中遇到的問題,在進行梯度計算時,update兩次之後發生資料溢位現象,但是並未找到處理方式,因此採取最簡單的方法,將所有資料全部縮小100倍處理,若有大佬看出**有問題請指出,先說一聲謝謝。

附件為資料集

PyTorch學習筆記之Variable

深度學習的演算法本質上是通過反向傳播求導數,pytorch的autograd模組實現了此功能。autograd.variable是autograd中的核心類,它簡單封裝了tensor,並支援幾乎所有tensor的操作。tensor在被封裝為variable之後,可以呼叫它的.backward實現反向...

Pytorch 學習筆記

本渣的pytorch 逐步學習鞏固經歷,希望各位大佬指正,寫這個部落格也為了鞏固下記憶。a a b c 表示從 a 取到 b 步長為 c c 2 則表示每2個數取1個 若為a 1 1 1 即表示從倒數最後乙個到正數第 1 個 最後乙個 1 表示倒著取 如下 陣列的第乙個為 0 啊,第 0 個!彆扭 ...

Pytorch學習筆記

資料集 penn fudan資料集 在學習pytorch官網教程時,作者對penn fudan資料集進行了定義,並且在自定義的資料集上實現了對r cnn模型的微調。此篇筆記簡單總結一下pytorch如何實現定義自己的資料集 資料集必須繼承torch.utils.data.dataset類,並且實現 ...