《機器學習(周志華)》筆記--神經網絡(6)--其他常見神經網絡:深度學習模型、深度學習的興起(歷史)、卷積神經網絡(CNN)、局部連接、權值共享、卷積操作(convolution)、池化操作(pooling)、隨機失活(dropout)、Lenet-5


四、其他常見神經網絡

1、深度學習模型

  感知機只包括輸入層和輸出層,只能處理線性任務,為了處理非線性任務,在輸入和輸出之間加入了隱層,隱層的目的是對數據進行加工處理傳遞給輸出層。

  為了解決更為復雜的問題,我們需要提升模型的學習能力,這時要增加模型的復雜度,有兩種策略:

    (1)一種是隱層保持不變,增加隱層神經元數目

    (2)一種是增加隱層的數目

  事實證明,增加隱層數目比增加隱層神經元數目更有效,隨着隱層數目不斷增加,神經網絡越來越復雜,這就是深度學習模型

  究竟多少層的神經網絡算是深度神經網絡模型,沒有確切的定義。對於深層神經網絡模型因為模型復雜度提升了,也帶了一定的問題:參數增加,級連難度增加,需要更多的數據進行訓練,層數增加,誤差梯度在反向傳播時有可能會出現梯度消失的現象,因此難以直接使用經典的BP算法訓練,而且過擬合的風險加大。

  典型的深度學習模型就是很深層的神經網絡。

    

 2、深度學習的興起(歷史)

  •  2006年 , Hinton發表了深度學習的 Nature 文章。

  •  2012年 , Hinton 組參加 ImageNet 競賽 , 使用 CNN 模型以超過第二名10個百分點的成績奪得當年競賽的冠軍。

  •  伴隨雲計算、大數據時代的到來,計算能力的大幅提升,使得深度學習模型在計算機視覺、自然語言處理、語音識別等眾多領域都取得了較大的成功。

  可以說,深度學習模型是現如今主流的機器學習方法。

3.1、卷積神經網絡(CNN)

  CNN是人工神經網絡的一種,CNN源於日本福島於1980年提出的感受頁模型,1998年,Lecun等人提出了Lenet-5卷積神經網絡模型,用於手寫字體識別。

  現如今,CNN成為深度學習領域的熱點,特別是在圖像分類和模式識別方面。

  CNN相較於其他神經網絡的特殊性在於權值共享和局部連接兩個方面。CNN用局部感知和權值共享大大減少了參數,同時還具備其它優點。它們與自然圖像自身具有的特性:特征的局部性與重復性完美貼合。

  局部連接:

    (是什么)即網絡部分連通,每個神經元只與上一層的部分神經元相連,只感知局部,而不是整幅圖像。(滑窗實現)

    (可行性)局部像素關系緊密,較遠像素相關性弱。

    因此只需要局部感知,在更高層將局部的信息綜合起來就得到了全局的信息。

    受啟發於生物視覺系統:局部敏感;對外界認知從局部到全局。

  權值共享: 

    (是什么)從一個局部區域學習到的信息,應用到圖像的其它地方去。即用一個相同的卷積核去卷積整幅圖像,相當於對圖像做一個全圖濾波。一個卷積核對應的特征比如是邊緣,那么用該卷積核去對圖像做全圖濾波,即是將圖像各個位置的邊緣都濾出來。(幫助實現不變性)。不同的特征靠多個不同的卷積核實現。

    (可行性)圖像的局部統計特征在整幅圖像上具有重復性(即位置無關性)。即如果圖像中存在某個基本圖形,該基本圖形可能出現在任意位置,那么不同位置共享相同權值可實現在數據的不同位置檢測相同的模式。比如我們在第一個窗口卷積后得到的特征是邊緣,那么這個卷積核對應的就是邊緣特征的提取方式,那么我們就可以用這個卷積核去提取其它區域的邊緣特征。

簡單卷積神經網絡:

from keras.datasets import mnist
import matplotlib.pyplot as plt
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers.convolutional import Conv2D,MaxPooling2D
from keras import backend
backend.set_image_data_format('channels_first')
(X_train,y_train),(X_test,y_test)=mnist.load_data()


X_train=X_train.reshape(-1,1,28,28).astype('float32')
X_test = X_test.reshape(-1,1,28,28).astype('float32')

#格式化數據0~1
X_train = X_train/255
X_test = X_test/255

#進行one-hot編碼
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]

#構建模型
model = Sequential()
model.add(Conv2D(32,(5,5),input_shape=(1,28,28),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
model.summary()
model.fit(X_train,y_train,epochs=2,batch_size=200)
scores = model.evaluate(X_test,y_test)
print('acc:%.2f%%' % (scores[1]*100))

圖象識別實例:

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input, decode_predictions
import numpy as np

def percent(value):
    return '%.2f%%' % (value * 100)


model = VGG16(weights='imagenet', include_top=True)


# Input:要識別的圖像
img_path = 'tiger.jpg'

#img_path = 'tiger.jpg' 並轉化為224*224的標准尺寸
img = image.load_img(img_path, target_size=(224, 224))


x = image.img_to_array(img) #轉化為浮點型
x = np.expand_dims(x, axis=0)#轉化為張量size為(1, 224, 224, 3)
x = preprocess_input(x)

# 預測,取得features,維度為 (1,1000)
features = model.predict(x)

# 取得前五個最可能的類別及概率
pred=decode_predictions(features, top=5)[0]


#整理預測結果,value
values = []
bar_label = []
for element in pred:
    values.append(element[2])
    bar_label.append(element[1])

#繪圖並保存
fig=plt.figure(u"Top-5 預測結果")
ax = fig.add_subplot(111) 
ax.bar(range(len(values)), values, tick_label=bar_label, width=0.5, fc='g')
ax.set_ylabel(u'probability') 
ax.set_title(u'Top-5') 
for a,b in zip(range(len(values)), values):
    ax.text(a, b+0.0005, percent(b), ha='center', va = 'bottom', fontsize=7)

fig = plt.gcf()
plt.show()

3.2、卷積神經網絡(CNN)結構

  CNN結構:輸入層,卷積層(convolution)、池化層(pooling)、隨機失活(dropout),全連接層、輸出層

      

3.3、卷積操作(convolution)

      

  我們用一個filter,往我們的圖片上“蓋”,覆蓋一塊跟filter一樣大的區域之后,對應元素相乘,然后求和。計算一個區域之后,就向其他區域挪動,接着計算,直到把原圖片的每一個角落都覆蓋到了為止。這個過程就是 “卷積”。

  卷積核與輸入項的點積運算,卷積的結果稱為特征圖CNN主要就是通過一個個的卷積核,不斷地提取特征,從局部的特征到總體的特征,從而進行圖像識別等等功能。

  我們要學習的就是各個卷積核中的參數。

3.4、池化操作(pooling)

      

  池化(下采樣):是為了提取一定區域的主要特征,並減少參數數量,防止模型過擬合。

  兩種常用的方式:平均池化,最大池化。

 3.5、隨機失活(dropout)

  在訓練的過程隨機忽略部分神經元,對於處於失活狀態的神經,它的不會對下層的神經元有任何影響,同時在反向傳播誤差時,與其相連的權值也不會進行任何修改,但這樣可以使模型泛化性更強。

      

 4、Lenet-5

    

    wide = (wide + 2 * padding - kernel_size) / stride + 1

    height = (height + 2 * padding - kernel_size) / stride + 1

#Lenet-5
from keras.models import Sequential 
from keras.layers import Dense,Flatten
from keras.layers.convolutional import Conv2D,MaxPooling2D
from keras import backend
backend.set_image_data_format('channels_first')
model = Sequential()
model.add(Conv2D(filters=6,kernel_size=(5,5),input_shape=(1,32,32)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=16,kernel_size=(5,5)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(120,activation='relu'))
model.add(Dense(84,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.summary()

5、AlexNet

    

  AlexNet與lenet5類似,但比lenet5更為復雜,利用了兩塊GPU進行計算,大大提高了運算效率,並且在ILSVRC-2012( ImageNet Large Scale Visual Recognition Challenge)競賽中獲得了top-5測試的15.3%error rate, 獲得第二名的方法error rate 是 26.2%。

 6、VGG16

    

  該模型參加2014年的 ImageNet圖像分類與定位挑戰賽,取得了優異成績:在分類任務上排名第二,在定位任務上排名第一。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM