1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        「修煉開(kāi)始」一文帶你入門(mén)深度學(xué)習(xí)

        共 11738字,需瀏覽 24分鐘

         ·

        2020-11-28 19:46

        點(diǎn)擊上方“Jack Cui”,選擇“設(shè)為星標(biāo)

        第一時(shí)間關(guān)注技術(shù)干貨!


        一、前言

        大家好,我是?Jack。

        承諾的圖解?AI 算法系列教程,今天它來(lái)了!

        最近,寫(xiě)了很多 AI 趣味性算法教程,目前寫(xiě)了 14 篇,其中反響不錯(cuò)的教程有:

        ???你的紅色高跟鞋,AI 換臉技術(shù)初體驗(yàn)???讓圖片動(dòng)起來(lái),特朗普和蒙娜麗莎深情合唱???為藝術(shù)而生的驚艷算法???百年老照片修復(fù)算法,那些高顏值的父母!???「完美復(fù)刻」的人物肖像畫(huà)生成

        讀者們玩得很開(kāi)心,對(duì) AI 算法、深度學(xué)習(xí)也來(lái)了興趣。

        但僅限于開(kāi)心地跑包,這最多只能算是「調(diào)包俠」。

        既然來(lái)了興致,何不趁熱打鐵,多學(xué)些基礎(chǔ)知識(shí),爭(zhēng)取早日邁入「調(diào)參俠」的行列。

        大家一起煉丹,一起修煉。

        圖解 AI 算法系列教程,不僅僅是涉及深度學(xué)習(xí)基礎(chǔ)知識(shí),還會(huì)有強(qiáng)化學(xué)習(xí)、遷移學(xué)習(xí)等,再往小了講就比如拆解目標(biāo)檢測(cè)算法,對(duì)抗神經(jīng)網(wǎng)絡(luò)(GAN)等等。

        如果你喜歡這個(gè) AI 算法系列教程,一定要讓我知道,轉(zhuǎn)發(fā)在看支持,更文更有動(dòng)力!

        難度會(huì)逐漸增加,今天咱先熱熱身,來(lái)點(diǎn)輕松的,當(dāng)作這個(gè)系列的開(kāi)篇。

        二、深度學(xué)習(xí)

        深度學(xué)習(xí)(Deep Learning)是近年來(lái)發(fā)展十分迅速的研究領(lǐng)域,并且在人 工智能的很多子領(lǐng)域都取得了巨大的成功。從根源來(lái)講,深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)分支。

        深度學(xué)習(xí)就是從有限樣例中通過(guò)算法總結(jié)出一般性的規(guī)律,并可以應(yīng)用到新的未知數(shù)據(jù)上。

        比如,我們可以從一些歷史病例的集合中總結(jié)出癥狀疾病之間的規(guī)律。這樣,當(dāng)有新的病人時(shí),我們可以利用總結(jié)出來(lái)的規(guī)律來(lái)判斷這個(gè)病人得了什么疾病。

        那想學(xué)深度學(xué)習(xí),要掌握哪些基礎(chǔ)知識(shí)?直接上圖

        理了小半天的思維導(dǎo)圖,建議收藏!

        深度學(xué)習(xí)主要由上圖所示的幾個(gè)部分組成,想學(xué)一個(gè)深度學(xué)習(xí)算法的原理,就看它是什么樣的網(wǎng)絡(luò)結(jié)構(gòu),Loss 是怎么計(jì)算的,預(yù)處理和后處理都是怎么做的。

        權(quán)重初始化和學(xué)習(xí)率調(diào)整策略、優(yōu)化算法、深度學(xué)習(xí)框架就那么多,并且也不是所有都要掌握,比如深度學(xué)習(xí)框架,Pytorch 玩的溜,就能應(yīng)付大多數(shù)場(chǎng)景。

        先有個(gè)整體的認(rèn)知,然后再按照這個(gè)思維導(dǎo)圖,逐個(gè)知識(shí)點(diǎn)學(xué)習(xí),最后整合到一起,你會(huì)發(fā)現(xiàn),你也可以自己實(shí)現(xiàn)各種功能的算法了。

        深度學(xué)習(xí)的主要目的是從數(shù)據(jù)中自動(dòng)學(xué)習(xí)到有效的特征表示,它是怎么工作的?那得從神經(jīng)元說(shuō)起。

        隨著神經(jīng)科學(xué)、認(rèn)知科學(xué)的發(fā)展,我們逐漸知道人類(lèi)的智能行為都和大腦活動(dòng)有關(guān)。

        人腦神經(jīng)系統(tǒng)[1]是一個(gè)非常復(fù)雜的組織,包含近 860 億個(gè)神經(jīng)元,這 860 億的神經(jīng)元構(gòu)成了超級(jí)龐大的神經(jīng)網(wǎng)絡(luò)。

        我們知道,一個(gè)人的智力不完全由遺傳決定,大部分來(lái)自于生活經(jīng)驗(yàn)。也就是說(shuō)人腦神經(jīng)網(wǎng)絡(luò)是一個(gè)具有學(xué)習(xí)能力的系統(tǒng)。

        不同神經(jīng)元之間的突觸有強(qiáng)有弱,其強(qiáng)度是可以通過(guò)學(xué)習(xí)(訓(xùn)練)來(lái)不斷改變的,具有一定的可塑性,不同的連接又形成了不同的記憶印痕。

        而深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò),就是受人腦神經(jīng)網(wǎng)絡(luò)啟發(fā),設(shè)計(jì)的一種計(jì)算模型,它從結(jié)構(gòu)、實(shí)現(xiàn)機(jī)理和功能上模擬人腦神經(jīng)網(wǎng)絡(luò)。

        比如下圖就是一個(gè)最簡(jiǎn)單的前饋神經(jīng)網(wǎng)絡(luò),第 0 層稱(chēng)為輸入層,最后一層稱(chēng)為輸出層,其他中間層稱(chēng)為隱藏層。

        那神經(jīng)網(wǎng)絡(luò)如何工作的?網(wǎng)絡(luò)層次結(jié)構(gòu)、損失函數(shù)、優(yōu)化算法、權(quán)重初始化、學(xué)習(xí)率調(diào)整都是如何運(yùn)作的?

        反向傳播給你答案。前方,高能預(yù)警!

        三、反向傳播

        要想弄懂深度學(xué)習(xí)原理,必須搞定反向傳播[2]和鏈?zhǔn)角髮?dǎo)法則。

        先說(shuō)思維導(dǎo)圖里的網(wǎng)絡(luò)層級(jí)結(jié)構(gòu),一個(gè)神經(jīng)網(wǎng)絡(luò),可復(fù)雜可簡(jiǎn)單,為了方便推導(dǎo),假設(shè),你有這樣一個(gè)網(wǎng)絡(luò)層:

        第一層是輸入層,包含兩個(gè)神經(jīng)元 i1, i2 和截距項(xiàng) b1(偏置);

        第二層是隱含層,包含兩個(gè)神經(jīng)元 h1, h2 和截距項(xiàng) b2 ;

        第三層是輸出層 o1 和 o2 ,每條線上標(biāo)的 wi 是層與層之間連接的權(quán)重,激活函數(shù)我們默認(rèn)為 sigmoid 函數(shù)。

        在訓(xùn)練這個(gè)網(wǎng)絡(luò)之前,需要初始化這些 wi 權(quán)重,這就是權(quán)重初始化,這里就有不少的初始化方法,我們選擇最簡(jiǎn)單的,隨機(jī)初始化。

        隨機(jī)初始化的結(jié)果,如下圖所示:

        其中,輸入數(shù)據(jù):?i1=0.05, i2=0.10;

        輸出數(shù)據(jù)(期望的輸出) : o1=0.01, o2=0.99;

        初始權(quán)重: w1=0.15, w2=0.20, w3=0.25, w4=0.30, w5=0.40, w6=0.45, w7=0.50, w8=0.55。

        目標(biāo):給出輸入數(shù)據(jù) i1, i2(0.05 和 0.10),使輸出盡可能與原始輸出o1, o2(0.01 和 0.99)接近。

        神經(jīng)網(wǎng)絡(luò)的工作流程分為兩步:前向傳播反向傳播。

        1、前向傳播

        前向傳播是將輸入數(shù)據(jù)根據(jù)權(quán)重,計(jì)算到輸出層。

        1)輸入層->隱藏層

        計(jì)算神經(jīng)元 h1 的輸入加權(quán)和:

        神經(jīng)元后面,要跟個(gè)激活層,從而引入非線性因素,這就像人的神經(jīng)元一樣,讓細(xì)胞處于興奮抑制的狀態(tài)。

        數(shù)學(xué)模擬的形式就是通過(guò)激活函數(shù),大于閾值就激活,反之抑制。

        常用的激活函如思維導(dǎo)圖所示,這里以非常簡(jiǎn)單的 sigmoid 激活函數(shù)為例,它的函數(shù)形式如下:

        數(shù)學(xué)公式:

        使用 sigmoid 激活函數(shù),繼續(xù)計(jì)算,神經(jīng)元 h1 的輸出 o_h1:

        同理,可計(jì)算出神經(jīng)元 h2 的輸出 o_h2:

        2)隱藏層->輸出層

        計(jì)算輸出層神經(jīng)元 o1 和 o2 的值:

        這樣前向傳播的過(guò)程就結(jié)束了,根據(jù)輸入值和權(quán)重,我們得到輸出值為[0.75136079, 0.772928465],與實(shí)際值(目標(biāo))[0.01, 0.99]相差還很遠(yuǎn),現(xiàn)在我們對(duì)誤差進(jìn)行反向傳播,更新權(quán)值,重新計(jì)算輸出。

        2、反向傳播

        前向傳播之后,發(fā)現(xiàn)輸出結(jié)果與期望相差甚遠(yuǎn),這時(shí)候就要更新權(quán)重了。

        所謂深度學(xué)習(xí)的訓(xùn)練(煉丹),學(xué)的就是這些權(quán)重,我們期望的是調(diào)整這些權(quán)重,讓輸出結(jié)果符合我們的期望。

        而更新權(quán)重的方式,依靠的就是反向傳播。

        1)計(jì)算總誤差

        一次前向傳播過(guò)后,輸出值(預(yù)測(cè)值)與目標(biāo)值(標(biāo)簽值)有差距,那得衡量一下有多大差距。

        衡量的方法,就是用思維導(dǎo)圖中的損失函數(shù)。

        損失函數(shù)也有很多,咱們還是選擇一個(gè)最簡(jiǎn)單的,均方誤差(MSE loss)。

        均方誤差的函數(shù)公式:

        根據(jù)公式,直接計(jì)算預(yù)測(cè)值與標(biāo)簽值的總誤差:

        有兩個(gè)輸出,所以分別計(jì)算 o1 和 o2 的誤差,總誤差為兩者之和:

        2)隱含層->輸出層的權(quán)值更新

        以權(quán)重參數(shù) w5 為例,如果我們想知道 w5 對(duì)整體誤差產(chǎn)生了多少影響,可以用整體誤差對(duì) w5 求偏導(dǎo)求出。

        這是鏈?zhǔn)椒▌t,它是微積分中復(fù)合函數(shù)的求導(dǎo)法則,就是這個(gè):

        根據(jù)鏈?zhǔn)椒▌t易得:

        下面的圖可以更直觀的看清楚誤差是怎樣反向傳播的:

        現(xiàn)在我們來(lái)分別計(jì)算每個(gè)式子的值:

        計(jì)算

        計(jì)算:

        這一步實(shí)際上就是對(duì)sigmoid函數(shù)求導(dǎo),比較簡(jiǎn)單,可以自己推導(dǎo)一下。

        計(jì)算

        最后三者相乘:

        這樣我們就計(jì)算出整體誤差E(total)對(duì) w5 的偏導(dǎo)值。

        回過(guò)頭來(lái)再看看上面的公式,我們發(fā)現(xiàn):

        為了表達(dá)方便,用來(lái)表示輸出層的誤差:

        因此,整體誤差E(total)對(duì)w5的偏導(dǎo)公式可以寫(xiě)成:

        如果輸出層誤差計(jì)為負(fù)的話,也可以寫(xiě)成:

        最后我們來(lái)更新 w5 的值:

        這個(gè)更新權(quán)重的策略,就是思維導(dǎo)圖中的優(yōu)化算法, 是學(xué)習(xí)率,我們這里取0.5。

        如果學(xué)習(xí)率要根據(jù)迭代的次數(shù)調(diào)整,那就用到了思維導(dǎo)圖中的學(xué)習(xí)率調(diào)整。

        同理,可更新w6,w7,w8:

        3)隱含層->隱含層的權(quán)值更新

        方法其實(shí)與上面說(shuō)的差不多,但是有個(gè)地方需要變一下,在上文計(jì)算總誤差對(duì) w5 的偏導(dǎo)時(shí),是從out(o1)->net(o1)->w5,但是在隱含層之間的權(quán)值更新時(shí),是out(h1)->net(h1)->w1,而 out(h1) 會(huì)接受 E(o1) 和 E(o2) 兩個(gè)地方傳來(lái)的誤差,所以這個(gè)地方兩個(gè)都要計(jì)算。

        計(jì)算

        先計(jì)算:

        同理,計(jì)算出:

        兩者相加得到總值:

        再計(jì)算:

        再計(jì)算:

        最后,三者相乘:

        為了簡(jiǎn)化公式,用 sigma(h1) 表示隱含層單元 h1 的誤差:

        最后,更新 w1 的權(quán)值:

        同理,額可更新w2,w3,w4的權(quán)值:

        這樣誤差反向傳播法就完成了,最后我們?cè)侔迅碌臋?quán)值重新計(jì)算,不停地迭代。

        在這個(gè)例子中第一次迭代之后,總誤差E(total)由0.298371109下降至0.291027924。

        迭代10000次后,總誤差為0.000035085,輸出為[0.015912196,0.984065734](原輸入為[0.01,0.99]),證明效果還是不錯(cuò)的。

        這就是整個(gè)神經(jīng)網(wǎng)絡(luò)的工作原理,如果你跟著思路,順利看到這里。那么恭喜你,深度學(xué)習(xí)的學(xué)習(xí)算是通過(guò)了一關(guān)。

        四、Python 實(shí)現(xiàn)

        整個(gè)過(guò)程,可以用 Python 代碼實(shí)現(xiàn)。

        #coding:utf-8
        import?random
        import?math

        #
        #???參數(shù)解釋?zhuān)?/span>
        #???"pd_"?:偏導(dǎo)的前綴
        #???"d_"?:導(dǎo)數(shù)的前綴
        #???"w_ho"?:隱含層到輸出層的權(quán)重系數(shù)索引
        #???"w_ih"?:輸入層到隱含層的權(quán)重系數(shù)的索引

        class?NeuralNetwork:
        ????LEARNING_RATE?=?0.5

        ????def?__init__(self,?num_inputs,?num_hidden,?num_outputs,?hidden_layer_weights?=?None,?hidden_layer_bias?=?None,?output_layer_weights?=?None,?output_layer_bias?=?None):
        ????????self.num_inputs?=?num_inputs

        ????????self.hidden_layer?=?NeuronLayer(num_hidden,?hidden_layer_bias)
        ????????self.output_layer?=?NeuronLayer(num_outputs,?output_layer_bias)
        ????????self.init_weights_from_inputs_to_hidden_layer_neurons(hidden_layer_weights)
        ????????self.init_weights_from_hidden_layer_neurons_to_output_layer_neurons(output_layer_weights)

        ????def?init_weights_from_inputs_to_hidden_layer_neurons(self,?hidden_layer_weights):
        ????????weight_num?=?0
        ????????for?h?in?range(len(self.hidden_layer.neurons)):
        ????????????for?i?in?range(self.num_inputs):
        ????????????????if?not?hidden_layer_weights:
        ????????????????????self.hidden_layer.neurons[h].weights.append(random.random())
        ????????????????else:
        ????????????????????self.hidden_layer.neurons[h].weights.append(hidden_layer_weights[weight_num])
        ????????????????weight_num?+=?1

        ????def?init_weights_from_hidden_layer_neurons_to_output_layer_neurons(self,?output_layer_weights):
        ????????weight_num?=?0
        ????????for?o?in?range(len(self.output_layer.neurons)):
        ????????????for?h?in?range(len(self.hidden_layer.neurons)):
        ????????????????if?not?output_layer_weights:
        ????????????????????self.output_layer.neurons[o].weights.append(random.random())
        ????????????????else:
        ????????????????????self.output_layer.neurons[o].weights.append(output_layer_weights[weight_num])
        ????????????????weight_num?+=?1

        ????def?inspect(self):
        ????????print('------')
        ????????print('*?Inputs:?{}'.format(self.num_inputs))
        ????????print('------')
        ????????print('Hidden?Layer')
        ????????self.hidden_layer.inspect()
        ????????print('------')
        ????????print('*?Output?Layer')
        ????????self.output_layer.inspect()
        ????????print('------')

        ????def?feed_forward(self,?inputs):
        ????????hidden_layer_outputs?=?self.hidden_layer.feed_forward(inputs)
        ????????return?self.output_layer.feed_forward(hidden_layer_outputs)

        ????def?train(self,?training_inputs,?training_outputs):
        ????????self.feed_forward(training_inputs)

        ????????#?1.?輸出神經(jīng)元的值
        ????????pd_errors_wrt_output_neuron_total_net_input?=?[0]?*?len(self.output_layer.neurons)
        ????????for?o?in?range(len(self.output_layer.neurons)):

        ????????????#??E/?z?
        ????????????pd_errors_wrt_output_neuron_total_net_input[o]?=?self.output_layer.neurons[o].calculate_pd_error_wrt_total_net_input(training_outputs[o])

        ????????#?2.?隱含層神經(jīng)元的值
        ????????pd_errors_wrt_hidden_neuron_total_net_input?=?[0]?*?len(self.hidden_layer.neurons)
        ????????for?h?in?range(len(self.hidden_layer.neurons)):

        ????????????#?dE/dy??=?Σ??E/?z??*??z/?y??=?Σ??E/?z??*?w??
        ????????????d_error_wrt_hidden_neuron_output?=?0
        ????????????for?o?in?range(len(self.output_layer.neurons)):
        ????????????????d_error_wrt_hidden_neuron_output?+=?pd_errors_wrt_output_neuron_total_net_input[o]?*?self.output_layer.neurons[o].weights[h]

        ????????????#??E/?z??=?dE/dy??*??z?/?
        ????????????pd_errors_wrt_hidden_neuron_total_net_input[h]?=?d_error_wrt_hidden_neuron_output?*?self.hidden_layer.neurons[h].calculate_pd_total_net_input_wrt_input()

        ????????#?3.?更新輸出層權(quán)重系數(shù)
        ????????for?o?in?range(len(self.output_layer.neurons)):
        ????????????for?w_ho?in?range(len(self.output_layer.neurons[o].weights)):

        ????????????????#??E?/?w???=??E/?z??*??z?/?w??
        ????????????????pd_error_wrt_weight?=?pd_errors_wrt_output_neuron_total_net_input[o]?*?self.output_layer.neurons[o].calculate_pd_total_net_input_wrt_weight(w_ho)

        ????????????????#?Δw?=?α?*??E?/?w?
        ????????????????self.output_layer.neurons[o].weights[w_ho]?-=?self.LEARNING_RATE?*?pd_error_wrt_weight

        ????????#?4.?更新隱含層的權(quán)重系數(shù)
        ????????for?h?in?range(len(self.hidden_layer.neurons)):
        ????????????for?w_ih?in?range(len(self.hidden_layer.neurons[h].weights)):

        ????????????????#??E?/?w??=??E/?z??*??z?/?w?
        ????????????????pd_error_wrt_weight?=?pd_errors_wrt_hidden_neuron_total_net_input[h]?*?self.hidden_layer.neurons[h].calculate_pd_total_net_input_wrt_weight(w_ih)

        ????????????????#?Δw?=?α?*??E?/?w?
        ????????????????self.hidden_layer.neurons[h].weights[w_ih]?-=?self.LEARNING_RATE?*?pd_error_wrt_weight

        ????def?calculate_total_error(self,?training_sets):
        ????????total_error?=?0
        ????????for?t?in?range(len(training_sets)):
        ????????????training_inputs,?training_outputs?=?training_sets[t]
        ????????????self.feed_forward(training_inputs)
        ????????????for?o?in?range(len(training_outputs)):
        ????????????????total_error?+=?self.output_layer.neurons[o].calculate_error(training_outputs[o])
        ????????return?total_error

        class?NeuronLayer:
        ????def?__init__(self,?num_neurons,?bias):

        ????????#?同一層的神經(jīng)元共享一個(gè)截距項(xiàng)b
        ????????self.bias?=?bias?if?bias?else?random.random()

        ????????self.neurons?=?[]
        ????????for?i?in?range(num_neurons):
        ????????????self.neurons.append(Neuron(self.bias))

        ????def?inspect(self):
        ????????print('Neurons:',?len(self.neurons))
        ????????for?n?in?range(len(self.neurons)):
        ????????????print('?Neuron',?n)
        ????????????for?w?in?range(len(self.neurons[n].weights)):
        ????????????????print('??Weight:',?self.neurons[n].weights[w])
        ????????????print('??Bias:',?self.bias)

        ????def?feed_forward(self,?inputs):
        ????????outputs?=?[]
        ????????for?neuron?in?self.neurons:
        ????????????outputs.append(neuron.calculate_output(inputs))
        ????????return?outputs

        ????def?get_outputs(self):
        ????????outputs?=?[]
        ????????for?neuron?in?self.neurons:
        ????????????outputs.append(neuron.output)
        ????????return?outputs

        class?Neuron:
        ????def?__init__(self,?bias):
        ????????self.bias?=?bias
        ????????self.weights?=?[]

        ????def?calculate_output(self,?inputs):
        ????????self.inputs?=?inputs
        ????????self.output?=?self.squash(self.calculate_total_net_input())
        ????????return?self.output

        ????def?calculate_total_net_input(self):
        ????????total?=?0
        ????????for?i?in?range(len(self.inputs)):
        ????????????total?+=?self.inputs[i]?*?self.weights[i]
        ????????return?total?+?self.bias

        ????#?激活函數(shù)sigmoid
        ????def?squash(self,?total_net_input):
        ????????return?1?/?(1?+?math.exp(-total_net_input))

        ????def?calculate_pd_error_wrt_total_net_input(self,?target_output):
        ????????return?self.calculate_pd_error_wrt_output(target_output)?*?self.calculate_pd_total_net_input_wrt_input();

        ????#?每一個(gè)神經(jīng)元的誤差是由平方差公式計(jì)算的
        ????def?calculate_error(self,?target_output):
        ????????return?0.5?*?(target_output?-?self.output)?**?2

        ????def?calculate_pd_error_wrt_output(self,?target_output):
        ????????return?-(target_output?-?self.output)

        ????def?calculate_pd_total_net_input_wrt_input(self):
        ????????return?self.output?*?(1?-?self.output)

        ????def?calculate_pd_total_net_input_wrt_weight(self,?index):
        ????????return?self.inputs[index]


        #?文中的例子:

        nn?=?NeuralNetwork(2,?2,?2,?hidden_layer_weights=[0.15,?0.2,?0.25,?0.3],?hidden_layer_bias=0.35,?output_layer_weights=[0.4,?0.45,?0.5,?0.55],?output_layer_bias=0.6)
        for?i?in?range(10000):
        ????nn.train([0.05,?0.1],?[0.01,?0.09])
        ????print(i,?round(nn.calculate_total_error([[[0.05,?0.1],?[0.01,?0.09]]]),?9))


        #另外一個(gè)例子,可以把上面的例子注釋掉再運(yùn)行一下:

        #?training_sets?=?[
        #?????[[0,?0],?[0]],
        #?????[[0,?1],?[1]],
        #?????[[1,?0],?[1]],
        #?????[[1,?1],?[0]]
        #?]

        #?nn?=?NeuralNetwork(len(training_sets[0][0]),?5,?len(training_sets[0][1]))
        #?for?i?in?range(10000):
        #?????training_inputs,?training_outputs?=?random.choice(training_sets)
        #?????nn.train(training_inputs,?training_outputs)
        #?????print(i,?nn.calculate_total_error(training_sets))

        五、其他

        預(yù)處理和后處理就相對(duì)簡(jiǎn)單很多,預(yù)處理就是一些常規(guī)的圖像變換操作,數(shù)據(jù)增強(qiáng)方法等。

        后處理每個(gè)任務(wù)都略有不同,比如目標(biāo)檢測(cè)的非極大值抑制等,這些內(nèi)容可以放在以后再講。

        至于深度學(xué)習(xí)框架的學(xué)習(xí),那就是另外一大塊內(nèi)容了,深度學(xué)習(xí)框架是一種為了深度學(xué)習(xí)開(kāi)發(fā)而生的工具,庫(kù)和預(yù)訓(xùn)練模型等資源的總和。

        我們可以用 Python 實(shí)現(xiàn)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),但是復(fù)雜的神經(jīng)網(wǎng)絡(luò),還得靠框架,框架的使用可以大幅度降低我們的開(kāi)發(fā)成本。

        至于學(xué)哪種框架,看個(gè)人喜好,Pytorch 和 Tensorflow 都行。人生苦短,我選 Pytorch。

        六、學(xué)習(xí)資料推薦

        學(xué)完本文,只能算是深度學(xué)習(xí)入門(mén),還有非常多的內(nèi)容需要深入學(xué)習(xí)。

        推薦一些資料,方便感興趣的讀者繼續(xù)研究。

        視頻:

        • 吳恩達(dá)的深度學(xué)習(xí)公開(kāi)課[3]:https://mooc.study.163.com/university/deeplearning_ai

        書(shū)籍:

        • 《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》
        • 《PyTorch深度學(xué)習(xí)實(shí)戰(zhàn)》

        開(kāi)源項(xiàng)目:

        • Pytorch教程 1:https://github.com/yunjey/pytorch-tutorial
        • Pytorch教程 2:https://github.com/pytorch/tutorials

        視頻和書(shū)籍,公眾號(hào)后臺(tái)回復(fù)「666」有驚喜哦!

        七、絮叨

        學(xué)習(xí)的積累是個(gè)漫長(zhǎng)而又孤獨(dú)的過(guò)程,厚積才能薄發(fā),有不懂的知識(shí)就多看多想,要相信最后勝利的,是堅(jiān)持下去的那個(gè)人。

        本文硬核,如果喜歡,還望轉(zhuǎn)發(fā)、再看多多支持。

        我是 Jack,我們下期見(jiàn)。

        ·················END·················

        參考資料

        [1]

        推薦深度學(xué)習(xí)書(shū)籍: 《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》

        [2]

        反向傳播: https://www.cnblogs.com/charlotte77/p/5629865.html

        [3]

        吳恩達(dá)的深度學(xué)習(xí)公開(kāi)課: https://mooc.study.163.com/university/deeplearning_ai


        瀏覽 45
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            尻逼毛片 | 自偷自拍av | 亚洲一级免费视频 | 蜜桃91精品入口 | 国产精品呻吟久久av凹凸 | 人妻熟女88AⅤ | 国产一级婬乱A片AAA毛多网站 | 五月深爱网 | 艹逼网 | 成人无码免费一区二区三区视频 |