真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python激勵(lì)函數(shù) python激活函數(shù)

原來(lái)ReLU這么好用!一文帶你深度了解ReLU激活函數(shù)!

在神經(jīng)網(wǎng)絡(luò)中,激活函數(shù)負(fù)責(zé)將來(lái)自節(jié)點(diǎn)的加權(quán)輸入轉(zhuǎn)換為該輸入的節(jié)點(diǎn)或輸出的激活。ReLU 是一個(gè)分段線性函數(shù),如果輸入為正,它將直接輸出,否則,它將輸出為零。它已經(jīng)成為許多類(lèi)型神經(jīng)網(wǎng)絡(luò)的默認(rèn)激活函數(shù),因?yàn)槭褂盟哪P透菀子?xùn)練,并且通常能夠獲得更好的性能。在本文中,我們來(lái)詳細(xì)介紹一下ReLU,主要分成以下幾個(gè)部分:

創(chuàng)新互聯(lián)建站始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)10年累計(jì)超上千家客戶(hù)的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)營(yíng)銷(xiāo)推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶(hù),其中包括:OPP膠袋等企業(yè),備受客戶(hù)夸獎(jiǎng)。

1、Sigmoid 和 Tanh 激活函數(shù)的局限性

2、ReLU(Rectified Linear Activation Function)

3、如何實(shí)現(xiàn)ReLU

4、ReLU的優(yōu)點(diǎn)

5、使用ReLU的技巧

一個(gè)神經(jīng)網(wǎng)絡(luò)由層節(jié)點(diǎn)組成,并學(xué)習(xí)將輸入的樣本映射到輸出。對(duì)于給定的節(jié)點(diǎn),將輸入乘以節(jié)點(diǎn)中的權(quán)重,并將其相加。此值稱(chēng)為節(jié)點(diǎn)的summed activation。然后,經(jīng)過(guò)求和的激活通過(guò)一個(gè)激活函數(shù)轉(zhuǎn)換并定義特定的輸出或節(jié)點(diǎn)的“activation”。

最簡(jiǎn)單的激活函數(shù)被稱(chēng)為線性激活,其中根本沒(méi)有應(yīng)用任何轉(zhuǎn)換。 一個(gè)僅由線性激活函數(shù)組成的網(wǎng)絡(luò)很容易訓(xùn)練,但不能學(xué)習(xí)復(fù)雜的映射函數(shù)。線性激活函數(shù)仍然用于預(yù)測(cè)一個(gè)數(shù)量的網(wǎng)絡(luò)的輸出層(例如回歸問(wèn)題)。

非線性激活函數(shù)是更好的,因?yàn)樗鼈冊(cè)试S節(jié)點(diǎn)在數(shù)據(jù)中學(xué)習(xí)更復(fù)雜的結(jié)構(gòu) 。兩個(gè)廣泛使用的非線性激活函數(shù)是 sigmoid 函數(shù)和 雙曲正切 激活函數(shù)。

Sigmoid 激活函數(shù) ,也被稱(chēng)為 Logistic函數(shù)神經(jīng)網(wǎng)絡(luò),傳統(tǒng)上是一個(gè)非常受歡迎的神經(jīng)網(wǎng)絡(luò)激活函數(shù)。函數(shù)的輸入被轉(zhuǎn)換成介于0.0和1.0之間的值。大于1.0的輸入被轉(zhuǎn)換為值1.0,同樣,小于0.0的值被折斷為0.0。所有可能的輸入函數(shù)的形狀都是從0到0.5到1.0的 s 形。在很長(zhǎng)一段時(shí)間里,直到20世紀(jì)90年代早期,這是神經(jīng)網(wǎng)絡(luò)的默認(rèn)激活方式。

雙曲正切函數(shù) ,簡(jiǎn)稱(chēng) tanh,是一個(gè)形狀類(lèi)似的非線性激活函數(shù),輸出值介于-1.0和1.0之間。在20世紀(jì)90年代后期和21世紀(jì)初期,由于使用 tanh 函數(shù)的模型更容易訓(xùn)練,而且往往具有更好的預(yù)測(cè)性能,因此 tanh 函數(shù)比 Sigmoid激活函數(shù)更受青睞。

Sigmoid和 tanh 函數(shù)的一個(gè)普遍問(wèn)題是它們值域飽和了 。這意味著,大值突然變?yōu)?.0,小值突然變?yōu)?-1或0。此外,函數(shù)只對(duì)其輸入中間點(diǎn)周?chē)淖兓浅C舾小?/p>

無(wú)論作為輸入的節(jié)點(diǎn)所提供的求和激活是否包含有用信息,函數(shù)的靈敏度和飽和度都是有限的。一旦達(dá)到飽和狀態(tài),學(xué)習(xí)算法就需要不斷調(diào)整權(quán)值以提高模型的性能。

最后,隨著硬件能力的提高,通過(guò) gpu 的非常深的神經(jīng)網(wǎng)絡(luò)使用Sigmoid 和 tanh 激活函數(shù)不容易訓(xùn)練。在大型網(wǎng)絡(luò)深層使用這些非線性激活函數(shù)不能接收有用的梯度信息。錯(cuò)誤通過(guò)網(wǎng)絡(luò)傳播回來(lái),并用于更新權(quán)重。每增加一層,錯(cuò)誤數(shù)量就會(huì)大大減少。這就是所謂的 消失梯度 問(wèn)題,它能有效地阻止深層(多層)網(wǎng)絡(luò)的學(xué)習(xí)。

雖然非線性激活函數(shù)的使用允許神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)復(fù)雜的映射函數(shù),但它們有效地阻止了學(xué)習(xí)算法與深度網(wǎng)絡(luò)的工作。在2000年代后期和2010年代初期,通過(guò)使用諸如波爾茲曼機(jī)器和分層訓(xùn)練或無(wú)監(jiān)督的預(yù)訓(xùn)練等替代網(wǎng)絡(luò)類(lèi)型,這才找到了解決辦法。

為了訓(xùn)練深層神經(jīng)網(wǎng)絡(luò), 需要一個(gè)激活函數(shù)神經(jīng)網(wǎng)絡(luò),它看起來(lái)和行為都像一個(gè)線性函數(shù),但實(shí)際上是一個(gè)非線性函數(shù),允許學(xué)習(xí)數(shù)據(jù)中的復(fù)雜關(guān)系 。該函數(shù)還必須提供更靈敏的激活和輸入,避免飽和。

因此,ReLU出現(xiàn)了, 采用 ReLU 可以是深度學(xué)習(xí)革命中為數(shù)不多的里程碑之一 。ReLU激活函數(shù)是一個(gè)簡(jiǎn)單的計(jì)算,如果輸入大于0,直接返回作為輸入提供的值;如果輸入是0或更小,返回值0。

我們可以用一個(gè)簡(jiǎn)單的 if-statement 來(lái)描述這個(gè)問(wèn)題,如下所示:

對(duì)于大于零的值,這個(gè)函數(shù)是線性的,這意味著當(dāng)使用反向傳播訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),它具有很多線性激活函數(shù)的理想特性。然而,它是一個(gè)非線性函數(shù),因?yàn)樨?fù)值總是作為零輸出。由于矯正函數(shù)在輸入域的一半是線性的,另一半是非線性的,所以它被稱(chēng)為 分段線性函數(shù)(piecewise linear function ) 。

我們可以很容易地在 Python 中實(shí)現(xiàn)ReLU激活函數(shù)。

我們希望任何正值都能不變地返回,而0.0或負(fù)值的輸入值將作為0.0返回。

下面是一些修正的線性激活函數(shù)的輸入和輸出的例子:

輸出如下:

我們可以通過(guò)繪制一系列的輸入和計(jì)算出的輸出,得到函數(shù)的輸入和輸出之間的關(guān)系。下面的示例生成一系列從 -10到10的整數(shù),并計(jì)算每個(gè)輸入的校正線性激活,然后繪制結(jié)果。

運(yùn)行這個(gè)例子會(huì)創(chuàng)建一個(gè)圖,顯示所有負(fù)值和零輸入都突變?yōu)?.0,而正輸出則返回原樣:

ReLU函數(shù)的導(dǎo)數(shù)是斜率。負(fù)值的斜率為0.0,正值的斜率為1.0。

傳統(tǒng)上,神經(jīng)網(wǎng)絡(luò)領(lǐng)域已經(jīng)不能是任何不完全可微的激活函數(shù),而ReLU是一個(gè)分段函數(shù)。從技術(shù)上講,當(dāng)輸入為0.0時(shí),我們不能計(jì)算ReLU的導(dǎo)數(shù),但是,我們可以假設(shè)它為0。

tanh 和 sigmoid 激活函數(shù)需要使用指數(shù)計(jì)算, 而ReLU只需要max(),因此他 計(jì)算上更簡(jiǎn)單,計(jì)算成本也更低 。

ReLU的一個(gè)重要好處是,它能夠輸出一個(gè)真正的零值 。這與 tanh 和 sigmoid 激活函數(shù)不同,后者學(xué)習(xí)近似于零輸出,例如一個(gè)非常接近于零的值,但不是真正的零值。這意味著負(fù)輸入可以輸出真零值,允許神經(jīng)網(wǎng)絡(luò)中的隱層激活包含一個(gè)或多個(gè)真零值。這就是所謂的稀疏表示,是一個(gè)理想的性質(zhì),在表示學(xué)習(xí),因?yàn)樗梢约铀賹W(xué)習(xí)和簡(jiǎn)化模型。

ReLU看起來(lái)更像一個(gè)線性函數(shù),一般來(lái)說(shuō),當(dāng)神經(jīng)網(wǎng)絡(luò)的行為是線性或接近線性時(shí),它更容易優(yōu)化 。

這個(gè)特性的關(guān)鍵在于,使用這個(gè)激活函數(shù)進(jìn)行訓(xùn)練的網(wǎng)絡(luò)幾乎完全避免了梯度消失的問(wèn)題,因?yàn)樘荻热匀慌c節(jié)點(diǎn)激活成正比。

ReLU的出現(xiàn)使得利用硬件的提升和使用反向傳播成功訓(xùn)練具有非線性激活函數(shù)的深層多層網(wǎng)絡(luò)成為可能 。

很長(zhǎng)一段時(shí)間,默認(rèn)的激活方式是Sigmoid激活函數(shù)。后來(lái),Tanh成了激活函數(shù)。 對(duì)于現(xiàn)代的深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),默認(rèn)的激活函數(shù)是ReLU激活函數(shù) 。

ReLU 可以用于大多數(shù)類(lèi)型的神經(jīng)網(wǎng)絡(luò), 它通常作為多層感知機(jī)神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)的激活函數(shù) ,并且也得到了許多論文的證實(shí)。傳統(tǒng)上,LSTMs 使用 tanh 激活函數(shù)來(lái)激活cell狀態(tài),使用 Sigmoid激活函數(shù)作為node輸出。 而ReLU通常不適合RNN類(lèi)型網(wǎng)絡(luò)的使用。

偏置是節(jié)點(diǎn)上具有固定值的輸入,這種偏置會(huì)影響激活函數(shù)的偏移,傳統(tǒng)的做法是將偏置輸入值設(shè)置為1.0。當(dāng)在網(wǎng)絡(luò)中使用 ReLU 時(shí), 可以將偏差設(shè)置為一個(gè)小值,例如0.1 。

在訓(xùn)練神經(jīng)網(wǎng)絡(luò)之前,網(wǎng)絡(luò)的權(quán)值必須初始化為小的隨機(jī)值。當(dāng)在網(wǎng)絡(luò)中使用 ReLU 并將權(quán)重初始化為以零為中心的小型隨機(jī)值時(shí),默認(rèn)情況下,網(wǎng)絡(luò)中一半的單元將輸出零值。有許多啟發(fā)式方法來(lái)初始化神經(jīng)網(wǎng)絡(luò)的權(quán)值,但是沒(méi)有最佳權(quán)值初始化方案。 何愷明的文章指出Xavier 初始化和其他方案不適合于 ReLU ,對(duì) Xavier 初始化進(jìn)行一個(gè)小的修改,使其適合于 ReLU,提出He Weight Initialization,這個(gè)方法更適用于ReLU 。

在使用神經(jīng)網(wǎng)絡(luò)之前對(duì)輸入數(shù)據(jù)進(jìn)行縮放是一個(gè)很好的做法。這可能涉及標(biāo)準(zhǔn)化變量,使其具有零均值和單位方差,或者將每個(gè)值歸一化為0到1。如果不對(duì)許多問(wèn)題進(jìn)行數(shù)據(jù)縮放,神經(jīng)網(wǎng)絡(luò)的權(quán)重可能會(huì)增大,從而使網(wǎng)絡(luò)不穩(wěn)定并增加泛化誤差。 無(wú)論是否在網(wǎng)絡(luò)中使用 ReLU,這種縮放輸入的良好實(shí)踐都適用。

ReLU 的輸出在正域上是無(wú)界的。這意味著在某些情況下,輸出可以繼續(xù)增長(zhǎng)。因此,使用某種形式的權(quán)重正則化可能是一個(gè)比較好的方法,比如 l1或 l2向量范數(shù)。 這對(duì)于提高模型的稀疏表示(例如使用 l 1正則化)和降低泛化誤差都是一個(gè)很好的方法 。

.

怎么用python寫(xiě)tensorflow

開(kāi)始使用

TensorFlow并不是一個(gè)純粹的神經(jīng)網(wǎng)絡(luò)框架, 而是使用數(shù)據(jù)流圖進(jìn)行數(shù)值分析的框架.

TensorFlow使用有向圖(graph)表示一個(gè)計(jì)算任務(wù).圖的節(jié)點(diǎn)稱(chēng)為ops(operations)表示對(duì)數(shù)據(jù)的處理,圖的邊f(xié)low 描述數(shù)據(jù)的流向.

該框架計(jì)算過(guò)程就是處理tensor組成的流. 這也是TensorFlow名稱(chēng)的來(lái)源.

TensorFlow使用tensor表示數(shù)據(jù). tensor意為張量即高維數(shù)組,在python中使用numpy.ndarray表示.

TensorFlow使用Session執(zhí)行圖, 使用Variable維護(hù)狀態(tài).tf.constant是只能輸出的ops, 常用作數(shù)據(jù)源.

下面我們構(gòu)建一個(gè)只有兩個(gè)constant做輸入, 然后進(jìn)行矩陣乘的簡(jiǎn)單圖:

from tensorflow import Session, device, constant, matmul'''構(gòu)建一個(gè)只有兩個(gè)constant做輸入, 然后進(jìn)行矩陣乘的簡(jiǎn)單圖:'''#如果不使用with session()語(yǔ)句, 需要手動(dòng)執(zhí)行session.close().

#with device設(shè)備指定了執(zhí)行計(jì)算的設(shè)備:

# ? ?"/cpu:0": 機(jī)器的 CPU.

# ? ?"/gpu:0": 機(jī)器的第一個(gè) GPU, 如果有的話.

# ? ?"/gpu:1": 機(jī)器的第二個(gè) GPU, 以此類(lèi)推.

with Session() as session: ?# 創(chuàng)建執(zhí)行圖的上下文

with device('/cpu:0'): ?# 指定運(yùn)算設(shè)備

mat1 = constant([[3, 3]]) ?# 創(chuàng)建源節(jié)點(diǎn)

mat2 = constant([[2], [2]])

product = matmul(mat1, mat2) # 指定節(jié)點(diǎn)的前置節(jié)點(diǎn), 創(chuàng)建圖

result = session.run(product) # 執(zhí)行計(jì)算 ? ? ? ?print(result)123456789101112131415161718

下面使用Variable做一個(gè)計(jì)數(shù)器:

from tensorflow import Session, constant, Variable, add, assign, initialize_all_variables

state = Variable(0, name='counter') # 創(chuàng)建計(jì)數(shù)器one = constant(1) # 創(chuàng)建數(shù)據(jù)源: 1val = add(state, one) # 創(chuàng)建新值節(jié)點(diǎn)update = assign(state, val) # 更新計(jì)數(shù)器setup = initialize_all_variables() # 初始化Variablewith Session() as session:

session.run(setup) # 執(zhí)行初始化

print(session.run(state)) # 輸出初值

for i in range(3):

session.run(update) # 執(zhí)行更新

print(session.run(state)) # 輸出計(jì)數(shù)器值12345678910111213

在使用變量前必須運(yùn)行initialize_all_variables()返回的圖, 運(yùn)行Variable節(jié)點(diǎn)將返回變量的值.

本示例中將構(gòu)建圖的過(guò)程寫(xiě)在了上下文之外, 而且沒(méi)有指定運(yùn)行設(shè)備.

上面示例中session.run只接受一個(gè)op作為參數(shù), 實(shí)際上run可以接受op列表作為輸入:

session.run([op1, op2])1

上述示例一直使用constant作為數(shù)據(jù)源, feed可以在運(yùn)行時(shí)動(dòng)態(tài)地輸入數(shù)據(jù):

from tensorflow import Session, placeholder, mul, float32

input1 = placeholder(float32)

input2 = placeholder(float32)

output = mul(input1, input2)with Session() as session: ? ?print session.run(output, feed_dict={input1: [3], input2: [2]})1234567

實(shí)現(xiàn)一個(gè)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)

神經(jīng)網(wǎng)絡(luò)是應(yīng)用廣泛的機(jī)器學(xué)習(xí)模型, 關(guān)于神經(jīng)網(wǎng)絡(luò)的原理可以參見(jiàn)這篇隨筆, 或者在tensorflow playground上體驗(yàn)一下在線demo.

首先定義一個(gè)BPNeuralNetwork類(lèi):

class BPNeuralNetwork:

def __init__(self):

self.session = tf.Session()

self.input_layer = None

self.label_layer = None

self.loss = None

self.trainer = None

self.layers = [] ? ?def __del__(self):

self.session.close()1234567891011

編寫(xiě)一個(gè)生成單層神經(jīng)網(wǎng)絡(luò)函數(shù),每層神經(jīng)元用一個(gè)數(shù)據(jù)流圖表示.使用一個(gè)Variable矩陣表示與前置神經(jīng)元的連接權(quán)重, 另一個(gè)Variable向量表示偏置值, 并為該層設(shè)置一個(gè)激勵(lì)函數(shù).

def make_layer(inputs, in_size, out_size, activate=None):

weights = tf.Variable(tf.random_normal([in_size, out_size]))

basis = tf.Variable(tf.zeros([1, out_size]) + 0.1)

result = tf.matmul(inputs, weights) + basis ? ?if activate is None: ? ? ? ?return result ? ?else: ? ? ? ?return activate(result)12345678

使用placeholder作為輸入層.

self.input_layer = tf.placeholder(tf.float32, [None, 2])1

placeholder的第二個(gè)參數(shù)為張量的形狀, [None, 1]表示行數(shù)不限, 列數(shù)為1的二維數(shù)組, 含義與numpy.array.shape相同.這里, self.input_layer被定義為接受二維輸入的輸入層.

同樣使用placeholder表示訓(xùn)練數(shù)據(jù)的標(biāo)簽:

self.label_layer = tf.placeholder(tf.float32, [None, 1])1

使用make_layer為神經(jīng)網(wǎng)絡(luò)定義兩個(gè)隱含層, 并用最后一層作為輸出層:

self.loss = tf.reduce_mean(tf.reduce_sum(tf.square((self.label_layer - self.layers[1])), reduction_indices=[1]))1

tf.train提供了一些優(yōu)化器, 可以用來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò).以損失函數(shù)最小化為目標(biāo):

self.trainer = tf.train.GradientDescentOptimizer(learn_rate).minimize(self.loss)1

使用Session運(yùn)行神經(jīng)網(wǎng)絡(luò)模型:

initer = tf.initialize_all_variables()# do trainingself.session.run(initer)

for i in range(limit):

self.session.run(self.trainer, feed_dict={self.input_layer: cases, self.label_layer: labels})12345

使用訓(xùn)練好的模型進(jìn)行預(yù)測(cè):

self.session.run(self.layers[-1], feed_dict={self.input_layer: case})1

完整代碼:

import tensorflow as tfimport numpy as npdef make_layer(inputs, in_size, out_size, activate=None):

weights = tf.Variable(tf.random_normal([in_size, out_size]))

basis = tf.Variable(tf.zeros([1, out_size]) + 0.1)

result = tf.matmul(inputs, weights) + basis ? ?if activate is None: ? ? ? ?return result ? ?else: ? ? ? ?return activate(result)class BPNeuralNetwork:

def __init__(self):

self.session = tf.Session()

self.input_layer = None

self.label_layer = None

self.loss = None

self.optimizer = None

self.layers = [] ? ?def __del__(self):

self.session.close() ? ?def train(self, cases, labels, limit=100, learn_rate=0.05):

# 構(gòu)建網(wǎng)絡(luò)

self.input_layer = tf.placeholder(tf.float32, [None, 2])

self.label_layer = tf.placeholder(tf.float32, [None, 1])

self.layers.append(make_layer(self.input_layer, 2, 10, activate=tf.nn.relu))

self.layers.append(make_layer(self.layers[0], 10, 2, activate=None))

self.loss = tf.reduce_mean(tf.reduce_sum(tf.square((self.label_layer - self.layers[1])), reduction_indices=[1]))

self.optimizer = tf.train.GradientDescentOptimizer(learn_rate).minimize(self.loss)

initer = tf.initialize_all_variables() ? ? ? ?# 做訓(xùn)練

self.session.run(initer) ? ? ? ?for i in range(limit):

self.session.run(self.optimizer, feed_dict={self.input_layer: cases, self.label_layer: labels}) ? ?def predict(self, case):

return self.session.run(self.layers[-1], feed_dict={self.input_layer: case}) ? ?def test(self):

x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])

y_data = np.array([[0, 1, 1, 0]]).transpose()

test_data = np.array([[0, 1]])

self.train(x_data, y_data)

print(self.predict(test_data))

nn = BPNeuralNetwork()

nn.test()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

上述模型雖然簡(jiǎn)單但是使用不靈活, 作者采用同樣的思想實(shí)現(xiàn)了一個(gè)可以自定義輸入輸出維數(shù)以及多層隱含神經(jīng)元的網(wǎng)絡(luò), 可以參見(jiàn)dynamic_bpnn.py

import tensorflow as tfimport numpy as npdef make_layer(inputs, in_size, out_size, activate=None):

weights = tf.Variable(tf.random_normal([in_size, out_size]))

basis = tf.Variable(tf.zeros([1, out_size]) + 0.1)

result = tf.matmul(inputs, weights) + basis ? ?if activate is None: ? ? ? ?return result ? ?else: ? ? ? ?return activate(result)class BPNeuralNetwork:

def __init__(self):

self.session = tf.Session()

self.loss = None

self.optimizer = None

self.input_n = 0

self.hidden_n = 0

self.hidden_size = []

self.output_n = 0

self.input_layer = None

self.hidden_layers = []

self.output_layer = None

self.label_layer = None

def __del__(self):

self.session.close() ? ?def setup(self, ni, nh, no):

# 設(shè)置參數(shù)個(gè)數(shù)

self.input_n = ni

self.hidden_n = len(nh) ?#隱藏層的數(shù)量

self.hidden_size = nh ?#每個(gè)隱藏層中的單元格數(shù)

self.output_n = no ? ? ? ?#構(gòu)建輸入層

self.input_layer = tf.placeholder(tf.float32, [None, self.input_n]) ? ? ? ?#構(gòu)建標(biāo)簽層

self.label_layer = tf.placeholder(tf.float32, [None, self.output_n]) ? ? ? ?#構(gòu)建隱藏層

in_size = self.input_n

out_size = self.hidden_size[0]

inputs = self.input_layer

self.hidden_layers.append(make_layer(inputs, in_size, out_size, activate=tf.nn.relu)) ? ? ? ?for i in range(self.hidden_n-1):

in_size = out_size

out_size = self.hidden_size[i+1]

inputs = self.hidden_layers[-1]

self.hidden_layers.append(make_layer(inputs, in_size, out_size, activate=tf.nn.relu)) ? ? ? ?#構(gòu)建輸出層

self.output_layer = make_layer(self.hidden_layers[-1], self.hidden_size[-1], self.output_n) ? ?def train(self, cases, labels, limit=100, learn_rate=0.05):

self.loss = tf.reduce_mean(tf.reduce_sum(tf.square((self.label_layer - self.output_layer)), reduction_indices=[1]))

self.optimizer = tf.train.GradientDescentOptimizer(learn_rate).minimize(self.loss)

initer = tf.initialize_all_variables() ? ? ? ?#做訓(xùn)練

self.session.run(initer) ? ? ? ?for i in range(limit):

self.session.run(self.optimizer, feed_dict={self.input_layer: cases, self.label_layer: labels}) ? ?def predict(self, case):

return self.session.run(self.output_layer, feed_dict={self.input_layer: case}) ? ?def test(self):

x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])

y_data = np.array([[0, 1, 1, 0]]).transpose()

test_data = np.array([[0, 1]])

self.setup(2, [10, 5], 1)

self.train(x_data, y_data)

print(self.predict(test_data))

nn = BPNeuralNetwork()

nn.test()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576

python2.7中的一個(gè)代碼在python3.5中運(yùn)行不了,要如何改

zip(input_vec,?self.weights)假設(shè)這里出來(lái)的數(shù)據(jù)結(jié)構(gòu)是?[(1,?4),?(2,?5),?(3,?6)]

那么lambda?(x,?w):?x?*?w?在2.7版本就直接接收?元祖(1,?4)這樣子的數(shù)據(jù)類(lèi)型當(dāng)做一個(gè)參數(shù),

(x,w)=依次=(1,?4),?(2,?5),?(3,?6),

但是這個(gè)寫(xiě)法在3.5的時(shí)候?,狗日的不認(rèn)識(shí)map(lambda?(x,?w)。。。x[0]?*?x[1]

替代方式我沒(méi)去研究?在3.5的時(shí)候?我是直接把?x=(1,?4)。。用的時(shí)候x[0]?*?x[1]

(reduce(lambda?a,?b:?a?+?b,

map(lambda?x:?x[0]?*?x[1],??

zip(input_vec,?weights))

,?0.0))


本文題目:python激勵(lì)函數(shù) python激活函數(shù)
網(wǎng)址分享:http://weahome.cn/article/doishcg.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部