臨夏市做網(wǎng)站電話/百度推廣助手電腦版
機(jī)緣
我最初使用CSDN估計(jì)是在2014年左右,當(dāng)時(shí)還在讀研,除了在當(dāng)時(shí)比較有名的BBS例如小木蟲(chóng)上進(jìn)行學(xué)術(shù)交流外,我發(fā)現(xiàn)很多問(wèn)題百度后,都會(huì)轉(zhuǎn)到CSDN,而且文章內(nèi)容頗為專業(yè),很多問(wèn)題也都有專業(yè)的回答,于是我知道了CSDN(從事多年)網(wǎng)。
2016年畢業(yè)后從事汽車(chē)研發(fā)工作,之后對(duì)CSDN的訪問(wèn)頻率不降反升,因?yàn)楣ぷ髦杏龅降暮芏鄬?shí)際技術(shù)問(wèn)題,在CSDN上仍能找到很有意義的指導(dǎo),直到2020年由于CSDN對(duì)我來(lái)說(shuō)已經(jīng)從一個(gè)“一次性”的搜索引擎,逐漸變?yōu)榱诵枰掷m(xù)關(guān)注的充電站,我注冊(cè)了CSDN賬號(hào)。
在2021年左右(或許更早),汽車(chē)行業(yè)中自動(dòng)駕駛領(lǐng)域一下出圈走紅。神經(jīng)元網(wǎng)絡(luò)、機(jī)器學(xué)習(xí)對(duì)我來(lái)說(shuō)并不是陌生的概念,早在2010年左右讀本科的時(shí)候就聽(tīng)說(shuō)過(guò)了,我對(duì)此領(lǐng)域也很好奇(用計(jì)算機(jī)寫(xiě)神經(jīng)元?這也太酷辣!),但是受限于當(dāng)時(shí)資料太少(以及受到當(dāng)時(shí)硬件性能的限制,深度學(xué)習(xí)領(lǐng)域也沒(méi)什么實(shí)質(zhì)性的發(fā)展),我僅能了解到一些初級(jí)概念,例如BP網(wǎng)絡(luò)。真是沒(méi)想到深度學(xué)習(xí)、人工智能以如此快的速度進(jìn)入到我的專業(yè)領(lǐng)域。以及后來(lái)的AIGC,已經(jīng)改變了我的工作模式!
出于對(duì)知識(shí)的好奇、對(duì)技術(shù)的追求(實(shí)際上是為了保持職業(yè)上的競(jìng)爭(zhēng)力)我決定潛心研究自動(dòng)駕駛技術(shù),就從底層的深度學(xué)習(xí)算法開(kāi)始。由于我本碩都是機(jī)械專業(yè),想進(jìn)入到深度學(xué)習(xí)領(lǐng)域還是有許多技術(shù)門(mén)檻需要征服,于是進(jìn)行了大量的學(xué)習(xí)。而我在選擇如何記錄學(xué)習(xí)過(guò)程時(shí),想到了CSDN的博客功能,機(jī)緣巧合在兩年前發(fā)了第一篇博客(學(xué)習(xí)筆記)。
收獲
最初CSDN博客對(duì)我來(lái)說(shuō)僅是一個(gè)學(xué)習(xí)筆記,記錄我的學(xué)習(xí)理解和學(xué)習(xí)感悟。后來(lái)我發(fā)現(xiàn):嘿!CSDN上愛(ài)學(xué)習(xí)的人可真多,我這學(xué)習(xí)筆記都有人看,這極大地鼓舞了我的學(xué)習(xí)信心,也堅(jiān)定了我持續(xù)創(chuàng)作的決心。
隨著學(xué)習(xí)的深入,我開(kāi)始從借鑒別人的代碼,逐漸可以自己進(jìn)行coding。而bug!是真的多次使我血壓飆升!我感覺(jué)debug就像在大海中游泳,我不知道離岸邊還要游多遠(yuǎn),最糟糕的是我甚至根本不知道游的方向?qū)Σ粚?duì)。而從CSDN上獲得的大量靈感,幫助我解決了很多很多bug,這是孤軍奮戰(zhàn)不可能達(dá)到的效果。
教是最好的學(xué)。我在解決這些bug,把我的學(xué)習(xí)過(guò)程寫(xiě)成博客幫助別人學(xué)習(xí)后,我又發(fā)現(xiàn)了一些理解不到位,或者有更好方法的地方,這又促進(jìn)了我的技術(shù)能力提升。
日常
我覺(jué)得現(xiàn)在已經(jīng)邁過(guò)了門(mén)檻期,學(xué)習(xí)和寫(xiě)博客已經(jīng)成為了日常生活的一部分,基于PyTorch一些常見(jiàn)的bug已經(jīng)基本淌過(guò)一遍,現(xiàn)在來(lái)到了比較穩(wěn)定的創(chuàng)作期,后續(xù)不會(huì)像以前創(chuàng)作東一榔頭西一棒槌,對(duì)于學(xué)習(xí)路線的規(guī)劃現(xiàn)在已逐漸清晰。
雖然我希望能盡早完成百篇博客的目標(biāo),但我更注重發(fā)文的質(zhì)而不是量,我的要求是每篇文章不講廢話、不講套話;技術(shù)問(wèn)題直擊靈魂,直奔主題;基于實(shí)操,不紙上談兵;要有自己的理解,文章有亮點(diǎn),不人云亦云,知其然也要知其所以然!
成就
我覺(jué)得寫(xiě)的最好的代碼是基于NumPy構(gòu)建LSTM網(wǎng)絡(luò)模型的代碼:
import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plttrain_x = np.linspace(0.01,1,600).reshape(100,6,1)
train_y = train_x * train_x + np.random.randn(100,6,1)/200def sigmoid(x):return 1/(1+np.exp(-x))class HiddenLayer():def __init__(self,input_size, hidden_size):self.w_f = np.random.randn(hidden_size, input_size) #定義各個(gè)門(mén)的權(quán)重, 忘記門(mén)self.w_i = np.random.randn(hidden_size, input_size) #輸入門(mén)self.w_g = np.random.randn(hidden_size, input_size) #新記憶門(mén)self.w_o = np.random.randn(hidden_size, input_size) #輸出門(mén)self.v_f = np.random.randn(hidden_size,hidden_size)self.v_i = np.random.randn(hidden_size,hidden_size)self.v_g = np.random.randn(hidden_size,hidden_size)self.v_o = np.random.randn(hidden_size,hidden_size)self.b_f = np.zeros([hidden_size, 1]) #輸入限定為一維向量self.b_i = np.zeros([hidden_size, 1])self.b_g = np.zeros([hidden_size, 1])self.b_o = np.zeros([hidden_size, 1])def forward(self, x, h_pre, c_pre): #h_pre為h_t-1, c_pre為c_t-1self.Fgate = sigmoid(np.dot(self.w_f, x) + np.dot(self.v_f, h_pre) + self.b_f)self.Igate = sigmoid(np.dot(self.w_i, x) + np.dot(self.v_i, h_pre) + self.b_i)self.Ggate = np.tanh(np.dot(self.w_g, x) + np.dot(self.v_g, h_pre) + self.b_g)self.Ogate = sigmoid(np.dot(self.w_o, x) + np.dot(self.v_o, h_pre) + self.b_o)c_cur = self.Fgate * c_pre + self.Igate * self.Ggate #c_cur為c_th_cur = self.Ogate * np.tanh(c_cur)return h_cur, c_curdef backward(self, Fgate, Igate, Ggate, Ogate, x, grad_cnext, Fgate_next, grad_hcur, c_cur,c_pre, h_pre):self.grad_ccur = grad_cnext * Fgate_next + grad_hcur * Ogate * (1 - np.tanh(c_cur) * np.tanh(c_cur))self.grad_hpre = self.grad_ccur*(np.dot(self.v_f.T, c_pre*Fgate*(1-Fgate)) + np.dot(self.v_g.T,Igate*(1-Ggate*Ggate)) + np.dot(self.v_i.T,Ggate*Igate*(1-Igate)))self.grad_wf = np.dot(self.grad_ccur * c_pre * Fgate * (1 - Fgate), x.T) #這里要注意矩陣的轉(zhuǎn)置!!!self.grad_wi = np.dot(self.grad_ccur * Ggate * Igate * (1 - Igate), x.T)self.grad_wg = np.dot(self.grad_ccur * Igate * (1 - Ggate * Ggate), x.T)self.grad_wo = np.dot(grad_hcur*np.tanh(c_cur)*Ogate*(1-Ogate),x.T)self.grad_vf = np.dot(self.grad_ccur * c_pre * Fgate * (1 - Fgate), h_pre.T)self.grad_vi = np.dot(self.grad_ccur * Ggate * Igate * (1 - Igate), h_pre.T)self.grad_vg = np.dot(self.grad_ccur * Igate * (1 - Ggate * Ggate), h_pre.T)self.grad_vo = np.dot(grad_hcur * np.tanh(c_cur) * Ogate * (1 - Ogate), h_pre.T)self.grad_bf = self.grad_ccur * c_pre * Fgate * (1 - Fgate)self.grad_bi = self.grad_ccur * Ggate * Igate * (1 - Igate)self.grad_bg = self.grad_ccur * Igate * (1 - Ggate * Ggate)self.grad_bo = grad_hcur * np.tanh(c_cur) * Ogate * (1 - Ogate)def step(self, lr=0.01):self.w_f = self.w_f - lr * self.grad_wfself.w_i = self.w_i - lr * self.grad_wiself.w_g = self.w_g - lr * self.grad_wgself.w_o = self.w_o - lr * self.grad_woself.v_f = self.v_f - lr*self.grad_vfself.v_i = self.v_i - lr * self.grad_viself.v_g = self.v_g - lr * self.grad_vgself.v_o = self.v_o - lr * self.grad_voself.b_f = self.b_f - lr*self.grad_bfself.b_i = self.b_i - lr * self.grad_biself.b_g = self.b_g - lr * self.grad_bgself.b_o = self.b_o - lr * self.grad_boclass OutputLayer():def __init__(self, hidden_size, output_size):self.w_h = np.ones([output_size, hidden_size])self.b_h = np.zeros([output_size, 1])def forward(self, h_cur):return np.dot(self.w_h, h_cur) + self.b_hdef backward(self,y,h_cur, train_data):delta = y - train_dataself.grad_wh = np.dot(delta, h_cur.T)self.grad_hcur = np.dot(self.w_h.T, delta)self.grad_bh = deltadef step(self, lr=0.001):self.w_h = self.w_h - lr * self.grad_whself.b_h = self.b_h - lr * self.grad_bh
————————————————
版權(quán)聲明:本文為CSDN博主「使者大牙」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_49963403/article/details/130428280
這段代碼從Python語(yǔ)法上來(lái)說(shuō)十分簡(jiǎn)單,沒(méi)有任何高級(jí)的技巧,可能僅學(xué)習(xí)Python不到一周的新手都能看得懂。但是其讓我引以為傲的地方是對(duì)LSTM網(wǎng)絡(luò)反向傳播的數(shù)學(xué)推導(dǎo),這即使在CSDN上應(yīng)該也算得上是首創(chuàng)。
這也提醒著我:不是為了會(huì)coding而學(xué)習(xí)coding,是為了要實(shí)現(xiàn)算法而學(xué)習(xí)coding。代碼的靈魂在于其背后的算法!
憧憬
目標(biāo)就是百篇博客吧,成為優(yōu)質(zhì)作者,博客專家(多么現(xiàn)實(shí)的目標(biāo))