人工神經網絡(ANN)是一種高效的計算系統,其核心思想是借鑑生物神經網絡的類比。神經網絡是機器學習的一種模型。在20世紀80年代中期和90年代初,神經網絡在架構上取得了重大進展。在這一章中,你將學到更多關於深度學習的知識,一種人工智慧的方法。
深度學習是從十年的爆炸性計算增長中產生的,是該領域的一個重要競爭者。因此,深度學習是一種特殊的機器學習,其算法受到人腦結構和功能的啓發。
Machine Learning v/s Deep Learning
深度學習是當今最強大的機器學習技術。它之所以如此強大,是因爲他們在學習如何解決問題的同時,學會了最好的方式來表示問題。下面比較了深度學習和機器學習;
Data Dependency
第一個不同點是基於數據規模增加時DL和ML的性能。當數據量較大時,深度學習算法表現得非常好。
Machine Dependency
深度學習算法需要高端機器才能完美工作。另一方面,機器學習算法也適用於低端機器。
Feature Extraction
深度學習算法可以提取高層次特徵,並嘗試從中學習。另一方面,需要專家來識別機器學習所提取的大部分特徵。
Time of Execution
執行時間取決於算法中使用的衆多參數。深度學習比機器學習算法有更多的參數。因此,DL算法的執行時間,特別是訓練時間比ML算法要長得多。但DL算法的測試時間比ML算法短。
Approach to Problem Solving
深度學習解決問題的端到端,而機器學習則使用傳統的解決問題的方法,即將問題分解成若干部分。
Convolutional Neural Network (CNN)
卷積神經網絡與普通神經網絡相同,因爲它們也由具有可學習權重和偏差的神經元組成。普通的神經網絡忽略了輸入數據的結構,將所有的數據轉換成一維數組,然後將其輸入網絡。此過程適合於常規數據,但是如果數據包含圖像,則該過程可能會很麻煩。
CNN很容易解決這個問題。它在處理圖像時考慮到圖像的二維結構,從而允許它們提取特定於圖像的屬性。這樣,CNNs的主要目標是從輸入層的原始圖像數據轉到輸出層的正確類。普通NNs和CNNs的唯一區別在於對輸入數據的處理和層的類型。
Architecture Overview of CNNs
在結構上,普通的神經網絡接收一個輸入並通過一系列的隱藏層將其轉換。在神經元的幫助下,每一層都與另一層相連。普通神經網絡的主要缺點是不能很好地擴展到完整的圖像。
cnn的結構是由3個維度的神經元組成,即寬度、高度和深度。當前層中的每個神經元都連接到前一層輸出的一小塊上。它類似於在輸入圖像上疊加a𝑵×𝑵濾波器。它使用M過濾器確保獲得所有細節。這些M過濾器是提取諸如邊、角等特徵的特徵提取器。
Layers used to construct CNNs
以下層用於構造CNNs−
輸入層−按原樣接受原始圖像數據。
卷積層−這一層是CNNs的核心組成部分,完成了大部分計算。這一層計算神經元和輸入中各種斑塊之間的卷積。
校正線性單元層−它將激活函數應用於前一層的輸出。它在網絡中加入了非線性,因此可以很好地推廣到任何類型的函數。
池層−池幫助我們在網絡中只保留重要的部分。池層在輸入的每個深度片上獨立運行,並在空間上調整其大小。它使用MAX函數。
全連接層/輸出層−此層計算最後一層的輸出分數。結果的輸出大小爲𝟏×𝟏×𝑳,其中L是訓練數據集類數。
Installing Useful Python Packages
您可以使用Keras,這是一個高級神經網絡API,用Python編寫,能夠在TensorFlow、CNTK或no之上運行。它與Python2.7-3.6兼容。您可以從https://keras.io/了解更多信息。
使用以下命令安裝keras−
pip install keras
在conda環境中,您可以使用以下命令−
conda install –c conda-forge keras
Building Linear Regressor using ANN
在本節中,您將學習如何使用人工神經網絡構建線性回歸器。您可以使用KerasRegressor來實現這一點。在本例中,我們使用波士頓房價數據集,其中波士頓的房產有13個數字。相同的Python代碼如下所示−
如圖所示導入所有必需的包;
import numpy import pandas from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold
現在,加載保存在本地目錄中的數據集。
dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None) dataset = dataframe.values
現在,將數據分爲輸入和輸出變量,即X和Y−
X = dataset[:,0:13] Y = dataset[:,13]
因爲我們使用的是基線神經網絡,所以定義模型−
def baseline_model():
現在,按照以下方式創建模型−
model_regressor = Sequential() model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal', activation = 'relu')) model_regressor.add(Dense(1, kernel_initializer = 'normal'))
接下來,編譯模型−
model_regressor.compile(loss='mean_squared_error', optimizer='adam') return model_regressor
現在,確定隨機種子的可重複性如下所示;
seed = 7 numpy.random.seed(seed)
在scikit learn中用作回歸估計器的Keras包裝器對象稱爲KerasRegressor。在本節中,我們將使用標準化數據集評估該模型。
estimator = KerasRegressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0) kfold = KFold(n_splits = 10, random_state = seed) baseline_result = cross_val_score(estimator, X, Y, cv = kfold) print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.mean(),Baseline_result.std()))
上面所示代碼的輸出將是模型對未顯示數據的問題性能的估計。這將是均方誤差,包括交叉驗證評估所有10倍的平均值和標準偏差。
Image Classifier: An Application of Deep Learning
卷積神經網絡(CNNs)解決了一個圖像分類問題,即輸入圖像屬於哪一類。可以使用深度學習lib庫。請注意,我們正在使用來自以下連結的貓和狗圖像的訓練和測試數據集:https://www.kaggle.com/c/dogs vs cats/data>https://www.kaggle.com/c/dogs vs cats/data>。
如圖所示導入重要的keras庫和包;
下面稱爲sequential的包將把神經網絡初始化爲sequential網絡。
from keras.models import Sequential
以下稱爲Conv2D的包用於執行卷積操作,這是CNN的第一步。
from keras.layers import Conv2D
以下名爲MaxPoling2D的包用於執行池操作,這是CNN的第二步。
from keras.layers import MaxPooling2D
以下稱爲扁平化的程序包是將所有生成的2D數組轉換爲單個長連續線性向量的過程。
from keras.layers import Flatten
下面這個名爲Dense的包用於執行神經網絡的完全連接,這是CNN的第四步。
from keras.layers import Dense
現在,創建sequential類的對象。
S_classifier = Sequential()
現在,下一步是對卷積部分進行編碼。
S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
這裡relu是整流器功能。
現在,CNN的下一步是對卷積後得到的特徵映射進行池操作。
S-classifier.add(MaxPooling2D(pool_size = (2, 2)))
現在,使用flattering−將所有匯集的圖像轉換爲連續向量;
S_classifier.add(Flatten())
接下來,創建一個完全連接的層。
S_classifier.add(Dense(units = 128, activation = 'relu'))
這裡,128是隱藏單元的數目。通常的做法是將隱藏單元的數量定義爲2的冪。
現在,初始化輸出層如下−
S_classifier.add(Dense(units = 1, activation = 'sigmoid'))
現在,編譯CNN,我們已經建立了&負;
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
這裡優化器參數是選擇隨機梯度下降算法,損失參數是選擇損失函數,度量參數是選擇性能度量。
現在,執行圖像增強,然後將圖像擬合到神經網絡中;
train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True) test_datagen = ImageDataGenerator(rescale = 1./255) training_set = train_datagen.flow_from_directory(」/Users/admin/training_set」,target_size = (64, 64),batch_size = 32,class_mode = 'binary') test_set = test_datagen.flow_from_directory('test_set',target_size = (64, 64),batch_size = 32,class_mode = 'binary')
現在,將數據擬合到我們創建的模型中;
classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs = 25,validation_data = test_set,validation_steps = 2000)
這裡每一個曆元的步驟都有訓練圖像的數量。
現在,由於模型已經過訓練,我們可以使用它進行如下預測;