File "C:\Python33\lib\trml2pdf.py", line 319
為西華等地區用戶提供了全套網頁設計制作服務,及西華網站建設行業解決方案。主營業務為成都網站設計、網站建設、外貿網站建設、西華網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
raise ValueError, "Not enough space"
錯誤在這里,值錯誤,返回原因空間不夠
簡介
本例子是通過對一組邏輯回歸映射進行輸出,使得網絡的權重和偏置達到最理想狀態,最后再進行預測。其中,使用GD算法對參數進行更新,損耗函數采取交叉商來表示,一共訓練10000次。
2.python代碼
#!/usr/bin/python
import numpy
import theano
import theano.tensor as T
rng=numpy.random
N=400
feats=784
# D[0]:generate rand numbers of size N,element between (0,1)
# D[1]:generate rand int number of size N,0 or 1
D=(rng.randn(N,feats),rng.randint(size=N,low=0,high=2))
training_steps=10000
# declare symbolic variables
x=T.matrix('x')
y=T.vector('y')
w=theano.shared(rng.randn(feats),name='w') # w is shared for every input
b=theano.shared(0.,name='b') # b is shared too.
print('Initial model:')
print(w.get_value())
print(b.get_value())
# construct theano expressions,symbolic
p_1=1/(1+T.exp(-T.dot(x,w)-b)) # sigmoid function,probability of target being 1
prediction=p_10.5
xent=-y*T.log(p_1)-(1-y)*T.log(1-p_1) # cross entropy
cost=xent.mean()+0.01*(w**2).sum() # cost function to update parameters
gw,gb=T.grad(cost,[w,b]) # stochastic gradient descending algorithm
#compile
train=theano.function(inputs=[x,y],outputs=[prediction,xent],updates=((w,w-0.1*gw),(b,b-0.1*gb)))
predict=theano.function(inputs=[x],outputs=prediction)
# train
for i in range(training_steps):
pred,err=train(D[0],D[1])
print('Final model:')
print(w.get_value())
print(b.get_value())
print('target values for D:')
print(D[1])
print('prediction on D:')
print(predict(D[0]))
print('newly generated data for test:')
test_input=rng.randn(30,feats)
print('result:')
print(predict(test_input))
3.程序解讀
如上面所示,首先導入所需的庫,theano是一個用于科學計算的庫。然后這里我們隨機產生一個輸入矩陣,大小為400*784的隨機數,隨機產生一個輸出向量大小為400,輸出向量為二值的。因此,稱為邏輯回歸。
然后初始化權重和偏置,它們均為共享變量(shared),其中權重初始化為較小的數,偏置初始化為0,并且打印它們。
這里我們只構建一層網絡結構,使用的激活函數為logistic sigmoid function,對輸入量乘以權重并考慮偏置以后就可以算出輸入的激活值,該值在(0,1)之間,以0.5為界限進行二值化,然后算出交叉商和損耗函數,其中交叉商是代表了我們的激活值與實際理論值的偏離程度。接著我們使用cost分別對w,b進行求解偏導,以上均為符號表達式運算。
接著我們使用theano.function進行編譯優化,提高計算效率。得到train函數和predict函數,分別進行訓練和預測。
接著,我們對數據進行10000次的訓練,每次訓練都會按照GD算法進行更新參數,最后我們得到了想要的模型,產生一組新的輸入,即可進行預測。
從零開始用Python構建神經網絡
動機:為了更加深入的理解深度學習,我們將使用 python 語言從頭搭建一個神經網絡,而不是使用像 Tensorflow 那樣的封裝好的框架。我認為理解神經網絡的內部工作原理,對數據科學家來說至關重要。
這篇文章的內容是我的所學,希望也能對你有所幫助。
神經網絡是什么?
介紹神經網絡的文章大多數都會將它和大腦進行類比。如果你沒有深入研究過大腦與神經網絡的類比,那么將神經網絡解釋為一種將給定輸入映射為期望輸出的數學關系會更容易理解。
神經網絡包括以下組成部分
? 一個輸入層,x
? 任意數量的隱藏層
? 一個輸出層,?
? 每層之間有一組權值和偏置,W and b
? 為隱藏層選擇一種激活函數,σ。在教程中我們使用 Sigmoid 激活函數
下圖展示了 2 層神經網絡的結構(注意:我們在計算網絡層數時通常排除輸入層)
2 層神經網絡的結構
用 Python 可以很容易的構建神經網絡類
訓練神經網絡
這個網絡的輸出 ? 為:
你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數。
因此 W 和 b 的值影響預測的準確率. 所以根據輸入數據對 W 和 b 調優的過程就被成為訓練神經網絡。
每步訓練迭代包含以下兩個部分:
? 計算預測結果 ?,這一步稱為前向傳播
? 更新 W 和 b,,這一步成為反向傳播
下面的順序圖展示了這個過程:
前向傳播
正如我們在上圖中看到的,前向傳播只是簡單的計算。對于一個基本的 2 層網絡來說,它的輸出是這樣的:
我們在 NeuralNetwork 類中增加一個計算前向傳播的函數。為了簡單起見我們假設偏置 b 為0:
但是我們還需要一個方法來評估預測結果的好壞(即預測值和真實值的誤差)。這就要用到損失函數。
損失函數
常用的損失函數有很多種,根據模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數。
誤差平方和是求每個預測值和真實值之間的誤差再求和,這個誤差是他們的差值求平方以便我們觀察誤差的絕對值。
訓練的目標是找到一組 W 和 b,使得損失函數最好小,也即預測值和真實值之間的距離最小。
反向傳播
我們已經度量出了預測的誤差(損失),現在需要找到一種方法來傳播誤差,并以此更新權值和偏置。
為了知道如何適當的調整權值和偏置,我們需要知道損失函數對權值 W 和偏置 b 的導數。
回想微積分中的概念,函數的導數就是函數的斜率。
梯度下降法
如果我們已經求出了導數,我們就可以通過增加或減少導數值來更新權值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。
但是我們不能直接計算損失函數對權值和偏置的導數,因為在損失函數的等式中并沒有顯式的包含他們。因此,我們需要運用鏈式求導發在來幫助計算導數。
鏈式法則用于計算損失函數對 W 和 b 的導數。注意,為了簡單起見。我們只展示了假設網絡只有 1 層的偏導數。
這雖然很簡陋,但是我們依然能得到想要的結果—損失函數對權值 W 的導數(斜率),因此我們可以相應的調整權值。
現在我們將反向傳播算法的函數添加到 Python 代碼中
為了更深入的理解微積分原理和反向傳播中的鏈式求導法則,我強烈推薦 3Blue1Brown 的如下教程:
Youtube:
整合并完成一個實例
既然我們已經有了包括前向傳播和反向傳播的完整 Python 代碼,那么就將其應用到一個例子上看看它是如何工作的吧。
神經網絡可以通過學習得到函數的權重。而我們僅靠觀察是不太可能得到函數的權重的。
讓我們訓練神經網絡進行 1500 次迭代,看看會發生什么。 注意觀察下面每次迭代的損失函數,我們可以清楚地看到損失函數單調遞減到最小值。這與我們之前介紹的梯度下降法一致。
讓我們看看經過 1500 次迭代后的神經網絡的最終預測結果:
經過 1500 次迭代訓練后的預測結果
我們成功了!我們應用前向和方向傳播算法成功的訓練了神經網絡并且預測結果收斂于真實值。
注意預測值和真實值之間存在細微的誤差是允許的。這樣可以防止模型過擬合并且使得神經網絡對于未知數據有著更強的泛化能力。
下一步是什么?
幸運的是我們的學習之旅還沒有結束,仍然有很多關于神經網絡和深度學習的內容需要學習。例如:
? 除了 Sigmoid 以外,還可以用哪些激活函數
? 在訓練網絡的時候應用學習率
? 在面對圖像分類任務的時候使用卷積神經網絡
我很快會寫更多關于這個主題的內容,敬請期待!
最后的想法
我自己也從零開始寫了很多神經網絡的代碼
雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學習框架方便的搭建深層網絡而不需要完全理解其內部工作原理。但是我覺得對于有追求的數據科學家來說,理解內部原理是非常有益的。
這種練習對我自己來說已成成為重要的時間投入,希望也能對你有所幫助
用keras框架較為方便
首先安裝anaconda,然后通過pip安裝keras
以下轉自wphh的博客。
#coding:utf-8
'''
GPU?run?command:
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32?python?cnn.py
CPU?run?command:
python?cnn.py
2016.06.06更新:
這份代碼是keras開發初期寫的,當時keras還沒有現在這么流行,文檔也還沒那么豐富,所以我當時寫了一些簡單的教程。
現在keras的API也發生了一些的變化,建議及推薦直接上keras.io看更加詳細的教程。
'''
#導入各種用到的模塊組件
from?__future__?import?absolute_import
from?__future__?import?print_function
from?keras.preprocessing.image?import?ImageDataGenerator
from?keras.models?import?Sequential
from?keras.layers.core?import?Dense,?Dropout,?Activation,?Flatten
from?keras.layers.advanced_activations?import?PReLU
from?keras.layers.convolutional?import?Convolution2D,?MaxPooling2D
from?keras.optimizers?import?SGD,?Adadelta,?Adagrad
from?keras.utils?import?np_utils,?generic_utils
from?six.moves?import?range
from?data?import?load_data
import?random
import?numpy?as?np
np.random.seed(1024)??#?for?reproducibility
#加載數據
data,?label?=?load_data()
#打亂數據
index?=?[i?for?i?in?range(len(data))]
random.shuffle(index)
data?=?data[index]
label?=?label[index]
print(data.shape[0],?'?samples')
#label為0~9共10個類別,keras要求格式為binary?class?matrices,轉化一下,直接調用keras提供的這個函數
label?=?np_utils.to_categorical(label,?10)
###############
#開始建立CNN模型
###############
#生成一個model
model?=?Sequential()
#第一個卷積層,4個卷積核,每個卷積核大小5*5。1表示輸入的圖片的通道,灰度圖為1通道。
#border_mode可以是valid或者full,具體看這里說明:
#激活函數用tanh
#你還可以在model.add(Activation('tanh'))后加上dropout的技巧:?model.add(Dropout(0.5))
model.add(Convolution2D(4,?5,?5,?border_mode='valid',input_shape=(1,28,28)))?
model.add(Activation('tanh'))
#第二個卷積層,8個卷積核,每個卷積核大小3*3。4表示輸入的特征圖個數,等于上一層的卷積核個數
#激活函數用tanh
#采用maxpooling,poolsize為(2,2)
model.add(Convolution2D(8,?3,?3,?border_mode='valid'))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2,?2)))
#第三個卷積層,16個卷積核,每個卷積核大小3*3
#激活函數用tanh
#采用maxpooling,poolsize為(2,2)
model.add(Convolution2D(16,?3,?3,?border_mode='valid'))?
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,?2)))
#全連接層,先將前一層輸出的二維特征圖flatten為一維的。
#Dense就是隱藏層。16就是上一層輸出的特征圖個數。4是根據每個卷積層計算出來的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4
#全連接有128個神經元節點,初始化方式為normal
model.add(Flatten())
model.add(Dense(128,?init='normal'))
model.add(Activation('tanh'))
#Softmax分類,輸出是10類別
model.add(Dense(10,?init='normal'))
model.add(Activation('softmax'))
#############
#開始訓練模型
##############
#使用SGD?+?momentum
#model.compile里的參數loss就是損失函數(目標函數)
sgd?=?SGD(lr=0.05,?decay=1e-6,?momentum=0.9,?nesterov=True)
model.compile(loss='categorical_crossentropy',?optimizer=sgd,metrics=["accuracy"])
#調用fit方法,就是一個訓練過程.?訓練的epoch數設為10,batch_size為100.
#數據經過隨機打亂shuffle=True。verbose=1,訓練過程中輸出的信息,0、1、2三種方式都可以,無關緊要。show_accuracy=True,訓練時每一個epoch都輸出accuracy。
#validation_split=0.2,將20%的數據作為驗證集。
model.fit(data,?label,?batch_size=100,?nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)
"""
#使用data?augmentation的方法
#一些參數和調用的方法,請看文檔
datagen?=?ImageDataGenerator(
featurewise_center=True,?#?set?input?mean?to?0?over?the?dataset
samplewise_center=False,?#?set?each?sample?mean?to?0
featurewise_std_normalization=True,?#?divide?inputs?by?std?of?the?dataset
samplewise_std_normalization=False,?#?divide?each?input?by?its?std
zca_whitening=False,?#?apply?ZCA?whitening
rotation_range=20,?#?randomly?rotate?images?in?the?range?(degrees,?0?to?180)
width_shift_range=0.2,?#?randomly?shift?images?horizontally?(fraction?of?total?width)
height_shift_range=0.2,?#?randomly?shift?images?vertically?(fraction?of?total?height)
horizontal_flip=True,?#?randomly?flip?images
vertical_flip=False)?#?randomly?flip?images
#?compute?quantities?required?for?featurewise?normalization?
#?(std,?mean,?and?principal?components?if?ZCA?whitening?is?applied)
datagen.fit(data)
for?e?in?range(nb_epoch):
print('-'*40)
print('Epoch',?e)
print('-'*40)
print("Training...")
#?batch?train?with?realtime?data?augmentation
progbar?=?generic_utils.Progbar(data.shape[0])
for?X_batch,?Y_batch?in?datagen.flow(data,?label):
loss,accuracy?=?model.train(X_batch,?Y_batch,accuracy=True)
progbar.add(X_batch.shape[0],?values=[("train?loss",?loss),("accuracy:",?accuracy)]?)
"""
分享標題:python激活函數 pytharm激活
網站鏈接:http://vcdvsql.cn/article22/doiepjc.html
成都網站建設公司_創新互聯,為您提供外貿建站、、網站設計、營銷型網站建設、企業網站制作、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯