- Python人工智慧教程
- 主頁
- Python人工智慧——基礎概念
- Python人工智慧——入門
- Python人工智慧——機器學習
- Python人工智慧——資料準備
- 監督學習:分類
- 監督學習:迴歸
- Python人工智慧——邏輯程式設計
- 無監督學習:聚類
- 自然語言處理
- Python人工智慧——NLTK包
- 時間序列資料分析
- Python人工智慧——語音識別
- Python人工智慧——啟發式搜尋
- Python人工智慧——遊戲
- Python人工智慧——神經網路
- 強化學習
- Python人工智慧——遺傳演算法
- Python人工智慧——計算機視覺
- Python人工智慧——深度學習
- Python人工智慧資源
- Python人工智慧——快速指南
- Python人工智慧——有用資源
- Python人工智慧——討論
Python人工智慧——深度學習
人工神經網路(ANN)是一種高效的計算系統,其核心思想借鑑了生物神經網路的類比。神經網路是機器學習的一種模型。在20世紀80年代中期和90年代初期,神經網路在架構方面取得了許多重要的進展。本章將詳細介紹人工智慧的一種方法——深度學習。
深度學習源於過去十年計算能力的爆炸式增長,成為該領域一個強有力的競爭者。因此,深度學習是一種特殊的機器學習,其演算法受到人腦結構和功能的啟發。
機器學習與深度學習
深度學習是目前最強大的機器學習技術。它之所以如此強大,是因為它在學習如何解決問題的同時,也學習了表示問題的最佳方法。以下是深度學習和機器學習的比較:
資料依賴性
第一個區別在於,當資料規模增加時,深度學習和機器學習的效能表現不同。當資料量很大時,深度學習演算法的效能非常好。
機器依賴性
深度學習演算法需要高階機器才能完美執行。另一方面,機器學習演算法也可以在低端機器上執行。
特徵提取
深度學習演算法可以提取高階特徵並嘗試從中學習。另一方面,需要專家來識別機器學習提取的大部分特徵。
執行時間
執行時間取決於演算法中使用的眾多引數。深度學習的引數比機器學習演算法多。因此,深度學習演算法的執行時間,特別是訓練時間,比機器學習演算法長得多。但深度學習演算法的測試時間比機器學習演算法短。
解決問題的方法
深度學習端到端地解決問題,而機器學習則採用傳統的方式解決問題,即將問題分解成多個部分。
卷積神經網路 (CNN)
卷積神經網路與普通神經網路相同,因為它們也由具有可學習權重和偏差的神經元組成。普通神經網路忽略輸入資料的結構,所有資料在饋送到網路之前都轉換為一維陣列。此過程適合常規資料,但是如果資料包含影像,則此過程可能會很麻煩。
CNN 可以輕鬆解決這個問題。它在處理影像時會考慮影像的二維結構,這使得它能夠提取影像特有的屬性。這樣,CNN 的主要目標是從輸入層中的原始影像資料到輸出層中的正確類別。普通神經網路和 CNN 之間的唯一區別在於輸入資料的處理方式和層型別。
CNN 的架構概述
從架構上講,普通神經網路接收輸入並透過一系列隱藏層對其進行轉換。每一層都透過神經元連線到另一層。普通神經網路的主要缺點是它們不能很好地擴充套件到完整的影像。
CNN 的架構具有排列在三維空間(寬度、高度和深度)中的神經元。當前層中的每個神經元都連線到前一層輸出的一小部分。這類似於將N×N 過濾器疊加在輸入影像上。它使用M 個過濾器來確保獲取所有細節。這M 個過濾器是特徵提取器,它們提取邊緣、角點等特徵。
用於構建 CNN 的層
構建 CNN 使用以下幾層:
輸入層 - 它按原樣獲取原始影像資料。
卷積層 - 這一層是 CNN 的核心構建塊,它執行大部分計算。此層計算神經元與輸入中各個區塊之間的卷積。
整流線性單元層 - 它將啟用函式應用於前一層的輸出。它為網路新增非線性,以便它可以很好地泛化到任何型別的函式。
池化層 - 池化有助於我們在網路發展過程中只保留重要的部分。池化層獨立地對輸入的每個深度切片進行操作並對其進行空間調整大小。它使用 MAX 函式。
全連線層/輸出層 - 此層計算最後一層的輸出分數。生成的輸出大小為1×1×L,其中 L 是訓練資料集的類別數。
安裝有用的 Python 包
您可以使用Keras,這是一個高階神經網路 API,用 Python 編寫,可以在 TensorFlow、CNTK 或 Theano 之上執行。它與 Python 2.7-3.6 相容。您可以從https://keras.io/瞭解更多資訊。
使用以下命令安裝 keras:
pip install keras
在conda環境中,您可以使用以下命令:
conda install –c conda-forge keras
使用 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 個摺疊的平均值和標準差。
影像分類器:深度學習的應用
卷積神經網路 (CNN) 解決影像分類問題,即將輸入影像歸類到哪個類別。您可以使用 Keras 深度學習庫。請注意,我們正在使用來自以下連結的貓和狗影像的訓練和測試資料集 https://www.kaggle.com/c/dogs-vs-cats/data。
匯入重要的 keras 庫和包,如下所示:
以下名為 sequential 的包將初始化神經網路作為順序網路。
from keras.models import Sequential
以下名為Conv2D的包用於執行卷積運算,這是 CNN 的第一步。
from keras.layers import Conv2D
以下名為MaxPoling2D的包用於執行池化運算,這是 CNN 的第二步。
from keras.layers import MaxPooling2D
以下名為Flatten的包是將所有生成的二維陣列轉換為單個長連續線性向量的過程。
from keras.layers import Flatten
以下名為Dense的包用於執行神經網路的全連線,這是 CNN 的第四步。
from keras.layers import Dense
現在,建立一個順序類的物件。
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)))
現在,透過使用展平將所有池化影像轉換為連續向量:
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'])
這裡的 optimizer 引數用於選擇隨機梯度下降演算法,loss 引數用於選擇損失函式,metrics 引數用於選擇效能指標。
現在,執行影像增強,然後將影像擬合到神經網路:
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)
這裡的 steps_per_epoch 包含訓練影像的數量。
現在模型已經訓練完畢,我們可以使用它進行預測,如下所示:
from keras.preprocessing import image
test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg',
target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
prediction = 'dog'
else:
prediction = 'cat'