導航:首頁 > 網路問題 > 如何建立自己的神經網路跑數據集

如何建立自己的神經網路跑數據集

發布時間:2023-03-20 09:31:53

A. 如何在R語言中進行神經網路模型的建立

不能發鏈接,所以我復制過來了。

#載入程序和數據
library(RSNNS)
data(iris)
#將數據順序打亂
iris <- iris[sample(1:nrow(iris),length(1:nrow(iris))),1:ncol(iris)]
#定義網路輸入
irisValues <- iris[,1:4]
#定義網路輸出,並將數據進行格式轉換
irisTargets <- decodeClassLabels(iris[,5])
#從中劃分出訓練樣本和檢驗樣本
iris <- splitForTrainingAndTest(irisValues, irisTargets, ratio=0.15)
#數據標准化
iris <- normTrainingAndTestSet(iris)
#利用mlp命令執行前饋反向傳播神經網路演算法
model <- mlp(iris$inputsTrain, iris$targetsTrain, size=5, learnFunc="Quickprop", learnFuncParams=c(0.1, 2.0, 0.0001, 0.1),maxit=100, inputsTest=iris$inputsTest, targetsTest=iris$targetsTest)
#利用上面建立的模型進行預測
predictions <- predict(model,iris$inputsTest)
#生成混淆矩陣,觀察預測精度
confusionMatrix(iris$targetsTest,predictions)
#結果如下:
# predictions
#targets 1 2 3
# 1 8 0 0
# 2 0 4 0
# 3 0 1 10

B. 如何用python和scikit learn實現神經網路

1:神經網路演算法簡介

2:Backpropagation演算法詳細介紹

3:非線性轉化方程舉例

4:自己實現神經網路演算法NeuralNetwork

5:基於NeuralNetwork的XOR實例

6:基於NeuralNetwork的手寫數字識別實例

7:scikit-learn中BernoulliRBM使用實例

8:scikit-learn中的手寫數字識別實例

一:神經網路演算法簡介

1:背景

以人腦神經網路為啟發,歷史上出現過很多版本,但最著名的是backpropagation

2:多層向前神經網路(Multilayer Feed-Forward Neural Network)

C. 如何訓練神經網路

1、先別著急寫代碼

訓練神經網路前,別管代碼,先從預處理數據集開始。我們先花幾個小時的時間,了解數據的分布並找出其中的規律。

Andrej有一次在整理數據時發現了重復的樣本,還有一次發現了圖像和標簽中的錯誤。所以先看一眼數據能避免我們走很多彎路。

由於神經網路實際上是數據集的壓縮版本,因此您將能夠查看網路(錯誤)預測並了解它們的來源。如果你的網路給你的預測看起來與你在數據中看到的內容不一致,那麼就會有所收獲。

一旦從數據中發現規律,可以編寫一些代碼對他們進行搜索、過濾、排序。把數據可視化能幫助我們發現異常值,而異常值總能揭示數據的質量或預處理中的一些錯誤。

2、設置端到端的訓練評估框架

處理完數據集,接下來就能開始訓練模型了嗎?並不能!下一步是建立一個完整的訓練+評估框架。

在這個階段,我們選擇一個簡單又不至於搞砸的模型,比如線性分類器、CNN,可視化損失。獲得准確度等衡量模型的標准,用模型進行預測。

這個階段的技巧有:

· 固定隨機種子

使用固定的隨機種子,來保證運行代碼兩次都獲得相同的結果,消除差異因素。

· 簡單化

在此階段不要有任何幻想,不要擴增數據。擴增數據後面會用到,但是在這里不要使用,現在引入只會導致錯誤。

· 在評估中添加有效數字

在繪制測試集損失時,對整個測試集進行評估,不要只繪制批次測試損失圖像,然後用Tensorboard對它們進行平滑處理。

· 在初始階段驗證損失函數

驗證函數是否從正確的損失值開始。例如,如果正確初始化最後一層,則應在softmax初始化時測量-log(1/n_classes)。

· 初始化

正確初始化最後一層的權重。如果回歸一些平均值為50的值,則將最終偏差初始化為50。如果有一個比例為1:10的不平衡數據集,請設置對數的偏差,使網路預測概率在初始化時為0.1。正確設置這些可以加速模型的收斂。

· 人類基線

監控除人為可解釋和可檢查的損失之外的指標。盡可能評估人的准確性並與之進行比較。或者對測試數據進行兩次注釋,並且對於每個示例,將一個注釋視為預測,將第二個注釋視為事實。

· 設置一個獨立於輸入的基線

最簡單的方法是將所有輸入設置為零,看看模型是否學會從輸入中提取任何信息。

· 過擬合一個batch

增加了模型的容量並驗證我們可以達到的最低損失。

· 驗證減少訓練損失

嘗試稍微增加數據容量。

D. 使用python在GPU上構建和訓練卷積神經網路

我將對代碼進行補充演練,以構建在數據集上訓練的任何類型的圖像分類器。在這個例子中,我將使用花卉數據集,其中包括102種不同類型的花。需要數據集和代碼都可以私信我。

Pytorch是機器學習和Python上的免費軟體包,非常易於使用。語法模擬numpy,因此,如果你在python中有一些科學計算經驗,那麼會相當有用的。賀寬只需幾行代碼,就可以下載預先訓練的數據集,使用定義的變換對圖像進叢襲行標准化,然後運行訓練。

創建和擴充數據集

為了增加數據集,我使用' google_images_download'API 從互聯網上下載了相關圖像。顯然,您可以使用此API不僅可以擴充現有數據集,還可以從頭開始創建自己的數據集。

確保從圖像中挑選出異常值(損壞的文件或偶然出現的無關圖像)。

圖像標准化

為了使圖像具有相同的大小和像素變化,可以使用pytorch的transfors模塊:

轉移學習

從頭開始訓練的模型可能不是最明智的選擇,因為有許多網路可用於各種數據集。簡單地說,像edge-和其他簡單形狀檢測器等低級特徵對於不同的模型是相似的,即使clasificators是針對不同目的進行訓練的。在本項目中,我使用了一個預訓練網路Resnet152,只有最後一個完全連接的層重新用於新任務,即使這樣也會產生相當好的效果。

在這里,我將除最後一層之外的所有層都設置為具有固定權重(requires_grad = False),因此只有最後層中的參數將通過梯度下降進行更新。

訓練模型

下面介紹一下進行訓練的函數:

如何獲得GPU?

當然,對CPU的訓練太慢了。根據我自己的經驗,在GPU僅需要一個小時就可以完成12次訓練周期,但是在CPU上相同數量的訓練周期可能需要花費大約15個小時。

如果您沒有本地可用的GPU,則可以考慮使用雲GPU。為了加速禪鄭亮CNN的訓練,我使用了floydhub(www.floydhub.com)上提供的雲GPU 。

這項服務非常指的使用:總有很好的文檔和大量的提示,所以你會很清楚的知道下一步需要如何去做。在floydhub上對於使用GPU的收費也是可以接受的。

首先,需要將數據集上傳到伺服器

然後,需要創建項目。需要在計算機上安裝floydhub客戶端,將數據集上載到其網站並在終端中運行以下命令:

其中'username'是您的登錄名,'i'是數據集所在的文件夾。

這樣子在訓練網路時就會很輕鬆了

結果和改進想法

得到的模型在數據集上訓練了1.5小時,並在驗證數據集上達到了95%的准確度。

E. 2.搭建一個神經網路模型訓練MNIST手寫體數字數據集中遇到的問題及解決方法

批量輸入後,如何使用numpy矩陣計算的方法計算各權值梯度,提高計算速度

def backprop(self, x, y): #x為多維矩陣。每列為一個x值。 y為多維矩陣。每列為一個y值。

batch_num=x.shape[1]

#print(x.shape)

#print(y.shape)

"""創建兩個變數,用來存儲所有b值和所有w值對應的梯度值。初始化為0.nabla_b為一個list,形狀與biases的形狀完全一致。nabla_w 為一個list,形狀與weights的形狀完全一致。

"""

nabla_b = [np.zeros(b.shape) for b in self.biases]

nabla_w = [np.zeros(w.shape) for w in self.weights]

# feedforward

"""activations,用來所有中間層和輸出層在一次前向計算過程中的最終輸出值,即a值。該值記錄下來,以供後期使用BP演算法求每個b和w的梯度。

"""

activation = x #x為本批多個x為列組成的矩陣。

activations = [x] # list to store all the activations, layer by layer

"""zs,用來所有中間層和輸出層在一次前向計算過程中的線性輸出值,即z值。該值記錄下來,以供後期使用BP演算法求每個b和w的梯度。

"""

zs = [] # list to store all the z vectors, layer by layer ,zs的每個元素為本batch的x對應的z為列構成的矩陣。


"""

通過一次正向計算,將中間層和輸出層所有的z值和a值全部計算出來,並存儲起來。供接下來求梯度使用。

"""

for b, w in zip(self.biases, self.weights):

#print(w.shape)

#print(np.dot(w, activation).shape)

#print(b.shape)

z = np.dot(w, activation)+b #z為本batch的x對應的z為列構成的矩陣。

zs.append(z)

activation = sigmoid(z)

activations.append(activation)


"""

以下部分是採用BP演算法求解每個可訓練參數的計算方法。是權重更新過程中的關鍵。

"""

# backward pass

# 求出輸出層的delta值

delta = ((activations[-1]-y) * sigmoid_prime(zs[-1]))

nabla_b[-1] = delta.mean(axis=1).reshape(-1, 1)

nabla_w[-1] =np.dot(delta,activations[-2].transpose())/batch_num

# Note that the variable l in the loop below is used a little

# differently to the notation in Chapter 2 of the book. Here,

# l = 1 means the last layer of neurons, l = 2 is the

# second-last layer, and so on. It's a renumbering of the

# scheme in the book, used here to take advantage of the fact

# that Python can use negative indices in lists.

for l in range(2, self.num_layers):

z = zs[-l]

sp = sigmoid_prime(z)

delta = (np.dot(self.weights[-l+1].transpose(), delta) * sp)

nabla_b[-l] = delta.mean(axis=1).reshape(-1, 1)

nabla_w[-l] =np.dot(delta,activations[-l-1].transpose())/batch_num

return (nabla_b, nabla_w)


##梯度計算後,如何更新各權值


def update_mini_batch(self, mini_batch, eta):

"""Update the network's weights and biases by applying

gradient descent using backpropagation to a single mini batch.

The ``mini_batch`` is a list of tuples ``(x, y)``, and ``eta``

is the learning rate."""

""" 初始化變數,去存儲各訓練參數的微分和。

"""

nabla_b = [np.zeros(b.shape) for b in self.biases]

nabla_w = [np.zeros(w.shape) for w in self.weights]

""" 循環獲取batch中的每個數據,獲取各訓練參數的微分,相加後獲得各訓練參數的微分和。

"""

x_batch=None

y_batch=None

for x, y in mini_batch:

if( x_batch is None):

x_batch=x

else:

x_batch=np.append(x_batch,x,axis=1)

if( y_batch is None):

y_batch=y

else:

y_batch=np.append(y_batch,y,axis=1)

delta_nabla_b, delta_nabla_w = self.backprop(x_batch, y_batch)

nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]

nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]

""" 使用各訓練參數的平均微分和與步長的乘積,去更新每個訓練參數

"""

self.weights = [w-eta*nw

for w, nw in zip(self.weights, nabla_w)]

self.biases = [b-eta*nb

for b, nb in zip(self.biases, nabla_b)]

F. 小白對於神經網路的數據集的問題

標准數據集是神經網路的訓練基礎。訓練就相當於條件反射中的條件,是已知的條件。來源是「經驗」,是已知的映射組,當在神經網路中載入標准數州磨據集後,神經網路隨山盯機生成一組矩陣,用矩陣處理標准集中的輸入集後,用所得結果與標准輸出集比較,將誤差提出後根據誤差,向減少誤差的方向修改矩陣組,然後重復多次以後,誤差減逗跡和小到一定程度,標准輸入集輸入網路後能得到標准輸出集,訓練完成。這個矩陣組就是神經網路模型。神經網路就是用電腦在標准數據集上總結經驗,來對新的輸入進行映射

G. 構建ResNet卷積神經網路

2015年,微軟亞洲研究院的何凱明團隊發布了一種特殊的卷積神經網路——殘差神經網路(ResNet)。在殘差神經網路出現之前,最深的深度神經網路只有二三十層左右,這該神經網路卻可以在實驗中輕松達到上百層甚至上千層,另外不會佔用過多訓練時間,也正因如此,圖像識別准確率有了顯著增強。此模型更是在同年的ImageNet大賽中,獲得圖像分類、定位、檢測三個項目的冠軍。在國際大賽上取得如此優異的成績,證明了殘差神經網路是個實用性強且優異的模型。在本研究中的貓狗二分類的實驗中,也是基於殘差神經網路來構建分類模型的。
在本文中我們將把kaggle貓狗數據集應用於ResNet-18和ResNet-50網路模型。使用Resnet來探究當前使用卷積神經網路的准確率。如圖4-1為ResNet的經典網路結構圖——ResNet-18。

ResNet-18都是由BasicBlock組成,從圖4-2也可得知50層及以上的ResNet網路模型由BottleBlock組成。在我們就需要將我們預處理過的數據集放入現有的Resnet-18和ResNet-50模型中去訓練,首先我們通過前面提到的圖像預處理把訓練圖像裁剪成一個96x96的正方形尺寸,然後輸入到我們的模型中,這里就介紹一下ResNet-18的網路模型的結構,因為ResNet50與第五章的ResNet-34模型結構相仿。
ResNet-18的模型結構為:首先第一層是一個7×7的卷積核,輸入特徵矩陣為[112,112,64],經過卷積核64,stride為2得到出入特徵矩陣[56,56,64]。第二層一開始是由一個3×3的池化層組成的,接著是2個殘差結構,一開始的輸入的特徵矩陣為[56,56,64],需要輸出的特徵矩陣shape為[28,28,128], 然而主分支與shortcut的輸出特徵矩陣shape必須相同,所以[56,56,64]這個特徵矩陣的高和寬從56通過主分支的stride為2來縮減為原來的一半即為28,再通過128個卷積核來改變特徵矩陣的深度。然而這里的shortcut加上了一個1x1的卷積核,stride也為2,通過這個stride,輸入的特徵矩陣的寬和高也縮減為原有的一半,同時通過128個卷積核將輸入的特徵矩陣的深度也變為了128。第三層,有2個殘差結構,輸入的特徵矩陣shape是[28,28,128],輸出特徵矩陣shape是[14,14,256], 然而主分支與shortcut的輸出特徵矩陣shape必須相同,所以[14,14,256]這個特徵矩陣的高和寬從14通過主分支的stride為2來縮減為原來的一半即為7,再通過128個卷積核來改變特徵矩陣的深度。然而這里的shortcut加上了一個1×1的卷積核,stride也為2,通過這個stride,輸入的特徵矩陣的寬和高也縮減為原有的一半,同時通過256個卷積核將輸入的特徵矩陣的深度也變為了256。第四層,有2個殘差結構,經過上述的相同的變化過程得到輸出的特徵矩陣為[7,7,512]。第五層,有2個殘差結構, 經過上述的相同的變化過程得到輸出的特徵矩陣為[1,1,512]。接著是平均池化和全連接層。

H. 從零開始用Python構建神經網路

從零開始用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:https://youtu.be/tIeHLnjs5U8
整合並完成一個實例
既然我們已經有了包括前向傳播和反向傳播的完整 Python 代碼,那麼就將其應用到一個例子上看看它是如何工作的吧。

神經網路可以通過學習得到函數的權重。而我們僅靠觀察是不太可能得到函數的權重的。
讓我們訓練神經網路進行 1500 次迭代,看看會發生什麼。 注意觀察下面每次迭代的損失函數,我們可以清楚地看到損失函數單調遞減到最小值。這與我們之前介紹的梯度下降法一致。

讓我們看看經過 1500 次迭代後的神經網路的最終預測結果:

經過 1500 次迭代訓練後的預測結果
我們成功了!我們應用前向和方向傳播演算法成功的訓練了神經網路並且預測結果收斂於真實值。
注意預測值和真實值之間存在細微的誤差是允許的。這樣可以防止模型過擬合並且使得神經網路對於未知數據有著更強的泛化能力。
下一步是什麼?
幸運的是我們的學習之旅還沒有結束,仍然有很多關於神經網路和深度學習的內容需要學習。例如:
? 除了 Sigmoid 以外,還可以用哪些激活函數
? 在訓練網路的時候應用學習率
? 在面對圖像分類任務的時候使用卷積神經網路
我很快會寫更多關於這個主題的內容,敬請期待!
最後的想法
我自己也從零開始寫了很多神經網路的代碼
雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學習框架方便的搭建深層網路而不需要完全理解其內部工作原理。但是我覺得對於有追求的數據科學家來說,理解內部原理是非常有益的。
這種練習對我自己來說已成成為重要的時間投入,希望也能對你有所幫助

閱讀全文

與如何建立自己的神經網路跑數據集相關的資料

熱點內容
網路共享中心沒有網卡 瀏覽:493
電腦無法檢測到網路代理 瀏覽:1350
筆記本電腦一天會用多少流量 瀏覽:476
蘋果電腦整機轉移新機 瀏覽:1349
突然無法連接工作網路 瀏覽:962
聯通網路怎麼設置才好 瀏覽:1191
小區網路電腦怎麼連接路由器 瀏覽:933
p1108列印機網路共享 瀏覽:1187
怎麼調節台式電腦護眼 瀏覽:603
深圳天虹蘋果電腦 瀏覽:841
網路總是異常斷開 瀏覽:584
中級配置台式電腦 瀏覽:895
中國網路安全的戰士 瀏覽:605
同志網站在哪裡 瀏覽:1380
版觀看完整完結免費手機在線 瀏覽:1432
怎樣切換默認數據網路設置 瀏覽:1080
肯德基無線網無法訪問網路 瀏覽:1254
光纖貓怎麼連接不上網路 瀏覽:1377
神武3手游網路連接 瀏覽:938
局網列印機網路共享 瀏覽:975