人工智慧 (15) 深度學習

Jason990420發表於2019-12-23

檔案建立日期: 2019/12/23

最後修訂日期: None

相關軟體資訊:

| Windows 10 | Python 3.7.2 | numpy 1.17.3 | pandas 0.25.1 | Keras 2.3.1 | sklearn 0.21.3 |

參考檔案: AI with Python Tutorial

說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.

注: 本內容除人工智慧 (04) 尚未整好, 原則上已結束, 後面在各章節中會加入修訂, 主要以詳解為主, 或者另建新章節, 進度以編者時間而定.

標題: 人工智慧 (15) 深度學習

深度學習 ( DL, Deep Learning ) 對比 機器學習 (ML, Machine Learning)

  1. 資料依賴 - 資料很大時,深度學習演算法會表現出色。
  2. 機器依賴性 - 深度學習演算法需要高階機器才能完美執行。
  3. 特徵提取 - 深度學習演算法可以提取高階功能,並嘗試從中學習。
  4. 執行時間 - 深度學習比機器學習演算法具有更多的引數。因此,DL演算法的執行時間,特別是訓練時間,比ML演算法要多得多。但是DL演算法的測試時間少於ML演算法。
  5. 解決問題的方法 - 深度學習端到端地解決了問題,而機器學習則採用了傳統的解決問題的方式,即將問題分解為多個部分。

卷積神經網路(CNN, Convolutional Neural Network)

從輸入層中的原始影像資料轉到輸出層中的正確類別。 普通的NN和CNN之間的唯一區別在於輸入資料的處理方式和層的型別。
CNN的架構將神經元排列成3個維度,分別稱為寬度,高度和深度。該層中的每個神經元都連線到前一層輸出的一小塊。這類似於在輸入影像上疊加?×?濾鏡。它使用M個過濾器來確保獲取所有詳細資訊。這些M過濾器是特徵提取器,可提取諸如邊,角等特徵。

  1. 輸入層:按原樣獲取原始影像資料。
  2. 卷積層:該層計算輸入中的神經元和各個面片之間的卷積。
  3. 整流的線性單位層:它將啟用函式應用於上一層的輸出。它為網路增加了非線性。
  4. 池化層:池化層在輸入的每個深度切片上獨立執行,並在空間上調整其大小。
  5. 全連線層/輸出層:此層計算最後一層的輸出分數。

例 1. 使用ANN ( Artificial neural networks ) 建立線性迴歸器

# -----------------------------------------------------------------------------
# Building Linear Regressor using ANN
# ------------------------------------------------------------------------------

import numpy
import pandas as pd
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
from sklearn.datasets import load_boston

boston = load_boston()              # 載入波士頓房價資料集
X = pd.DataFrame(boston['data'])    # Shape (506, 13) 506筆13種特性
Y = pd.DataFrame(boston['target'])  # Shape (506,  1) 506筆房價

def baseline_model():
    # 建立線性層堆疊
    model_regressor = Sequential()
    # 新增NN層, 輸入 13, 輸出 13
    model_regressor.add(Dense(13, input_dim=13, kernel_initializer='normal',
        activation='relu'))
    # 新增NN層, 輸出 1
    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)
# 建立Keras迴歸器, 使用自建的base_line_model
estimator = KerasRegressor(build_fn=baseline_model,
        nb_epoch=100, batch_size=5, verbose=0)
# 建立KFold交叉驗證器
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()))

例 2. 使用CNNs ( Convolutional Neural Networks ) 作影像分類

# -----------------------------------------------------------------------------
# Image Classifier - Deep Learning
# 圖檔太大, 未確認內容是否有誤
# ------------------------------------------------------------------------------

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.preprocessing import image

# 建立線性層堆疊
S_classifier = Sequential()
# 建立 2D 卷積層
S_classifier.add(Conv2D(32, (3,3), input_shape=(64,64,3),activation='relu'))
# 建立最大池化
S_classifier.add(MaxPooling2D(pool_size = (2, 2)))
# 將輸入展平
S_classifier.add(Flatten())
# 新增NN層, 輸出 128, 啟用函式relu
S_classifier.add(Dense(units = 128, activation = 'relu'))
# 新增NN層, 輸出 1, 啟用函式sigmoid
S_classifier.add(Dense(units = 1, activation = 'sigmoid'))
# 配置學習過程
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy',
        metrics = ['accuracy'])
# 透過實時資料增強生成張量影像資料批次
train_datagen = image.ImageDataGenerator(rescale = 1./255,shear_range = 0.2,
        zoom_range = 0.2, horizontal_flip = True)
test_datagen = image.ImageDataGenerator(rescale = 1./255)
# 已下載貓狗影像集, 812MB https://www.kaggle.com/c/dogs-vs-cats/data
training_set = train_datagen.flow_from_directory('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')
# 訓練
S_classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs = 25,
        validation_data = test_set,validation_steps = 2000)
# 載入影像, 預測結果
test_image = image.load_img('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)

if result[0][0] == 1:
    prediction = 'dog'
else:
    prediction = 'cat'
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章