1. 程式人生 > >深度學習與計算機視覺(PB-02)-資料增強

深度學習與計算機視覺(PB-02)-資料增強

在深度學習實踐中,當訓練資料量少時,可能會出現過擬合問題。根據Goodfellow等人的觀點,我們對學習演算法的任何修改的目的都是為了減小泛化誤差,而不是訓練誤差。

我們已經在sb[後續補充]中提到了不同型別的正則化手段來防止模型的過擬合,然而,這些都是針對引數的正則化形式,往往要求我們修改loss函式。事實上,還有其他方式防止模型過擬合,比如:

  • 1.修改網路本身架構
  • 2.增加資料

Dropout是通過修改網路本身結構以達到正則化效果的技術。Dropout是指在深度學習網路的訓練過程中,對於神經網路單元,按照一定的概率將其暫時從網路中丟棄。注意是暫時

,對於隨機梯度下降來說,由於是隨機丟棄,故而每一個mini-batch都在訓練不同的網路。

在這節,我們討論另外一種防止過擬合方法,叫做資料增強(data augmentation),該方法主要對訓練資料集進行一定的變換,改變圖片的外觀,然後將得到的‘新’圖片進行模型訓練。使用資料增強技術可以得到更多的資料。

備註:預測時候是不是也可以利用data augmentation,結果使用投票方法得到呢?

資料增強

資料增強主要是運用各種技術生成新的訓練樣本,比如隨機旋轉或平移等,雖然,‘新’的樣本在一定程度上改變了外觀,但是樣本的標籤保持不變。使用資料增強技術可以增加模型訓練的樣本資料,一般而言,當模型不斷地學習新的資料時,模型的泛化性會得到一定的提高。但是有一點需要注意,大多數情況下,資料增強會降低模型訓練的準確度,而會提高模型測試的準確度,因此,我們一般不參考資料增強下的訓練資料集的評估結果,而是參考測試集上的評估結果。

圖2.1:左:隨機從正態分佈產生250條資料,右:對分佈做微小的隨機干擾

圖2.1左,我們從標準的正態分佈中產生一定量的資料,如果對該資料訓練一個模型,可以得到一個很好的結果,但是在實際中,資料是很難嚴格滿足標準的正態分佈。相反,為了提高模型的通用性。我們對該分佈進行微小的隨機干擾,使得資料仍然滿足一個近似正態分佈,如圖2.1右,在此資料訓練得到的模型有更好的泛化性。

在計算機視覺中,使用資料增強是非常合理的,由於影象資料的特殊性,可以通過簡單的幾何變換從原始影象中獲額外的訓練資料,而且不改變影象的標籤,常見的變換有:

  • 翻轉: 水平翻轉或者上下翻轉影象
  • 旋轉:將影象在一定角度範圍內旋轉
  • 縮放:將影象在一定尺度內放大或者縮小
  • 裁剪:在原有影象上裁剪出一塊
  • 平移:將影象在一定尺度範圍內平移
  • 顏色變動:對影象的RGB顏色空間進行一些變換
  • 噪聲繞動:給影象加入一些人工生成的噪聲

視覺化

最直觀的明白資料增強的效果的最佳方法就是視覺化,可以很直觀地看到影象的外觀變化。為了實現這個視覺化,我們基於keras構建一個數據增強的python指令碼,名為augmentation_demo.py,並寫入以下程式碼:

#encoding:utf-8
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import load_img
import numpy as np
import argparse

其中ImageDataGenerator是keras中資料增強類,包含了各種變換方法。

接下來,我們解析命令列引數:

# 構造引數解析和解析引數
ap = argparse.ArgumentParser()
ap.add_argument('-i','--image',required=True,help = 'path to the input image')
ap.add_argument('-o','--ouput',required=True,help ='path to ouput directory to store augmentation examples')
ap.add_argument('-p','--prefix',type=str,default='image',help='output fielname prefix')
args = vars(ap.parse_args())

其中每個引數詳細如下:

  • –image:需要進行資料增強的原始影象路徑
  • –output:儲存影象的路徑
  • –prefix:字串,變換後的影象檔名

接下來,載入輸入影象,將其轉換為keras支援的array形式陣列,並對影象增加一個額外維度。

# 載入影象,並轉化為numpy的array
print('[INFO] loading example image...')
image = load_img(args['image'])
image = img_to_array(image)
#增加一個維度
image = np.expand_dims(image,axis = 0) #在0位置增加資料,主要是batch size

初始化ImageDataGenerator:

aug = ImageDataGenerator(
    rotation_range=30,       # 旋轉角度
    width_shift_range=0.1,   # 水平平移幅度
    height_shift_range= 0.1, # 上下平移幅度
    shear_range=0.2,         # 逆時針方向的剪下變黃角度
    zoom_range=0.2,          # 隨機縮放的角度
    horizontal_flip=True,    # 水平翻轉
    fill_mode='nearest'      # 變換超出邊界的處理
)
# 初始化目前為止的圖片產生數量
total = 0

ImageDataGenerator類有很多引數,這裡無法一一列舉。想了解詳細的引數意義,請參閱官方的Keras文件. 相反,我們列出幾個最有可能實際中用到的:

  • rotation_range:控制隨機旋轉的角度,這裡我們設定為30度
  • width_shift_range和height_shift_range::主要控制水平和垂直移動。
  • shear_range:浮點數,剪下強度(逆時針方向的剪下變換角度)
  • zoom_range:浮點數或形如[lower,upper]的列表,隨機縮放的幅度,若為浮點數,則相當於[lower,upper] = [1 - zoom_range, 1+zoom_range]
  • horizontal_flip:是否對影象進行水平翻轉,一般而言,大多數影象進行水平翻轉是不改變原始的影象標籤的,但是一些特殊情況會改變影象的語義資訊。

備註:無論使用哪種變換方法,需要注意我們想要的是增加資料集,只改變影象表面的外觀,而不改變原始的影象語義資訊。

一旦ImageDataGenerato初始化後,我們就可以產生新的訓練資料集:

print("[INFO] generating images...")
imageGen = aug.flow(image,batch_size=1,save_to_dir=args['output'],save_prefix=args['prefix'],save_format='jpg')
for image in imageGen:
    total += 1
    # 只輸出10個案例樣本
    if total == 10:
        break

首先,初始化構造影象資料增強的生成器,並傳入引數——輸入影象,batch_size設定為1(因為我們這裡只增加一個影象),輸出的路徑等。然後,對imageGen生成器進行遍歷,imageGen每次被請求時都會自動生成一個新的訓練樣本。當新增10張圖時,就停止。

執行下列命令,產生資料增強結果:

$ python augmentation_demo.py --image jemma.png --output output

當指令碼執行完之後,你可以看到:

ls output/
image_0_1227.jpg image_0_2358.jpg image_0_4205.jpg image_0_4770.jpg ...

圖2.2,左:輸入影象,右:資料增強之後結果

如圖2.2右所示,每張影象都是經過隨機旋轉、剪下、縮放或水平翻轉得到的。對原始影象微小變換之後,可以看到‘新’影象都保留了原始的標籤:dog,從而使我們的神經網路在訓練時可以學習新的模式。

資料增強技術雖然有可能降低模型訓練時的準確度,但是,資料增強可以一定程度上降低過擬合,確保我們的模型可以更好地推廣到新的輸入樣本。更重要的是,當我們只有少量資料集時——往往是無法進行深度學習實踐的,那麼可以利用資料增強生成額外的訓練資料,從而減少訓練深度學習網路需要手工標記的資料。

實驗結果

在本節的第一部分中,我們將討論Flowers-17資料集,這是一個非常小的資料集(對計算機視覺任務的而言),以及資料增強如何幫助我們生成額外的訓練樣本。主要做2個實驗:

  • 在Flowers-17上訓練MiniVGGNet,不使用資料增強。

  • 在flower -17上使用資料增強技術訓練MIniVGGNet。

Flowers-17 資料集

Flowers-17資料集是一個細粒度分類資料,我們的任務是識別17種不同的花。影象資料集非常小,每個類只有80張影象,總共1360張圖片。在計算機視覺任務中,應用深度學習演算法一般要求每個類別差不多有1000 - 5000個數據,因此,Flowers-17資料集是嚴重不滿足。

我們稱Flowers-17為細粒度分類任務,因為所有類別都非常相似(主要花的物種)。事實上,我們可以把這些類別都看作子類別。雖然類別之間是不同的,但是存在相同的結構,比如花瓣,雄蕊、雌蕊等。

細粒度分類任務對於深度學習實踐者來說是最具挑戰性的,因為這意味著我們的機器學習模型需要學習極端的細粒度特徵來區分非常相似的各個類。考慮到我們有限的train資料,這種細粒度的分類任務變得更加困難。

Flowers-17資料可以從地址 下載。

預處理

在此之前,我們處理影象時,一般是將它們調整為固定大小,忽略了縱橫比。對於一般的資料集,這樣做是可以接受的。但是,對於更具挑戰性的資料集,我們將影象大小調整到一個固定的大小時,需要保持長寬比。比如圖2.4:

圖2.4

左圖是輸入的原始影象,我們調整影象的大小為256×256(中間),忽略縱橫比,從中間圖可以看到影象發生了一定的扭曲。再對比右圖,考慮影象的縱橫比下,我們首先沿著較短的部分調整大小,比如這裡寬度調整為256,然後沿高度裁剪影象,使其高度為256。雖然我們在剪輯過程中丟棄了部分影象,但我們也保留了部分影象原始長寬比。保持一致的縱橫比可以使卷積神經網路學習到更有辨別力,一致性的特徵。這是我們處理更高階的資料集比如ImageNet用到的一種常見的技術。

為了瞭解預處理,讓我們對pyimagesearch專案結構增加一個AspectAwarePreprocessor類:

--- pyimagesearch
|    |--- __init__.py
|    |--- callbacks
|    |--- nn
|    |--- preprocessing
|        |--- __init__.py
|        |--- aspectawarepreprocessor.py
|        |--- imagetoarraypreprocessor.py
|        |--- simplepreprocessor.py
|    |--- utils

在preprocessing子模組下,新建一個檔案,名為aspectawarepreprocessor.py,並寫入以下程式碼;

#encoding:utf-8
# 載入所需要模組
import cv2     #安裝:pip install opencv-python
import imutils # 安裝:pip install imutils
class AspectAwarePreprocessor:
    def __init__(self,width,height,inter = cv2.INTER_AREA):
        # 定義所需要的變數
        self.width = width
        self.heigth = height
        self.inter = inter

就像在SimplePreprocessor中一樣,函式需要兩個引數(目標輸出影象的寬度和高度)以及調整影象所使用的插值方法。定義預處理函式如下:

    def preprocess(self,image):
    	# 獲取image的維度
        (h,w) = image.shape[:2]
        # 修剪時用到的增量
        dw = 0
        dh = 0

預處理函式傳入的是需要處理的影象。預處理主要包含兩步:

  • 1.確定最短的維度並沿著它調整大小
  • 2.沿最大維度裁剪影象,以獲得目標的寬度和高度

程式碼如下:

        if w < h:
            image = imutils.resize(image,width = self.width, inter = self.inter)
            dh = int((image.shape[0] - self.height) / 2.0)
        else:
            image = imutils.resize(image, height=self.height, inter=self.inter)
            dw = int((image.shape[1] - self.width) / 2.0)

我們需要重新抓取寬度和高度,並使用delta裁剪影象的中心:

        (h,w) = image.shape[:2]
        image = image[dh:h - dh,dw:w-dw]
        return cv2.resize(image,(self.width,self.height), interpolation=self.inter)

在裁剪過程中(由於舍入誤差),目標影象尺寸可能增加或者減小一個畫素,因此,我們呼叫cv2模組調整大小以確保我們的輸出影象滿足一定的寬度和高度。然後將預處理後的影象返回給呼叫函式。

資料預處理完之後,接下來主要構建模型以及對模型進行訓練和評估。

Flowers-17:不使用資料增強

首先,我們不對Flower-17資料進行資料增強,直接對原始資料訓練MiniVGGNe模型,新建一個指令碼檔案,名為minivggnet_flowers17.py,並寫入以下程式碼:

#encoding:utf-8
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from pyimagesearch.preprocessing import ImageToArrayPreprocessor as IAP
from pyimagesearch.preprocessing import AspectAwarePreprocessor as AAP
from pyimagesearch.preprocessing import ImageMove as IM #新增模組
from pyimagesearch.datasets import SimpleDatasetLoader as SDL
from pyimagesearch.nn.conv import MiniVGGNet as MVN
from keras.optimizers import SGD
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import argparse
import os

說明: 由於從官方下載的Flower-17資料是沒有標籤的,因此,我增加了一個模組ImageMove,主要是將圖片進行分類,對應到每一個標籤資料夾中,並使用0-16代表類別。

定義命令列引數,這裡只需要傳入圖片的資料路徑

ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=True,help="path to input dataset")args = vars(ap.parse_args())

這裡新增一個分類圖片模組,使用0-16代表不同的類別

print('[INFO] moving image to label folder.....')
im  = IM.MoveImageToLabel(dataPath=args['dataset'])
im.makeFolder()
im.move()

資料目錄結構:

原始目錄
flowers17/jpg/{image}
處理完之後的目錄
flowers17/{species}/{image}
flowers17/3/image_0241.jpg

處理完圖片目錄,接下來從資料中提取資料標籤

print("[INFO] loading images...")
imagePaths = list(paths.list_images(args["dataset"]))
classNames = [pt.split(os.path.sep)[-2] for pt in imagePaths]
classNames = [str(x) for x in np.unique(classNames)]

載入資料集,並對資料進行標準化處理

# 預處理模組
aap = AspectAwarePreprocessor(64, 64)
iap = ImageToArrayPreprocessor()
sdl = SimpleDatasetLoader(preprocessors=[aap, iap])
(data, labels) = sdl.load(imagePaths, verbose=500)
# 標準化
data = data.astype("float") / 255.0

將資料集分成train資料和test資料,並對標籤one-hot編碼化

(trainX, testX, trainY, testY) = train_test_split(data, labels,test_size=0.25, random_state=42)
trainY = LabelBinarizer().fit_transform(trainY)
testY = LabelBinarizer().fit_transform(testY)

初始化模型,並進行訓練

# 初始化模型和優化器
print("[INFO] compiling model...")
opt = SGD(lr=0.05)
model = MiniVGGNet.build(width=64, height=64, depth=3,
classes=len(classNames))
model.compile(loss="categorical_crossentropy", optimizer=opt,
metrics=["accuracy"])
# 訓練網路
print("[INFO] training network...")
H = model.fit(trainX, trainY, validation_data=(testX, testY),
batch_size=32, epochs=100, verbose=1)

在資料預處理部分,我們將圖片大小調整為64x64,因此,MiniVGGNet網路主要輸入shape為64x64x3(畫素寬,畫素高,通道數)的資料,類別個數是len(classNames),在本例中,它等於17。

使用SGD對模型進行訓練,訓練次數為100次,並對訓練過程進行視覺化。

# 評估模型效能
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
predictions.argmax(axis=1), target_names=classNames))
# loss和精度視覺化
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0, 100), H.history["loss"], label="train_loss")
plt.plot(np.arange(0, 100), H.history["val_loss"], label="val_loss")
plt.plot(np.arange(0, 100), H.history["acc"], label="train_acc")
plt.plot(np.arange(0, 100), H.history["val_acc"], label="val_acc")
plt.title("Training Loss and Accuracy")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend()
plt.show()

完成上述程式碼之後,執行下面命令,將得到MiniVGGNet模型訓練的結果

$ python minivggnet_flowers17.py --dataset yourpath/flowers17

結果如下

             precision    recall  f1-score   support
          0       0.36      0.50      0.42        16
          1       0.52      0.57      0.55        21
         10       0.83      0.62      0.71        16
         11       0.60      0.43      0.50        21
         12       0.62      0.69      0.65        26
         13       0.53      0.39      0.45        23
         14       0.74      0.58      0.65        24
         15       0.70      0.73      0.71        22
         16       0.82      0.82      0.82        17
          2       0.62      0.71      0.67        14
          3       0.79      0.65      0.71        23
          4       0.44      0.50      0.47        22
          5       0.76      0.64      0.70        25
          6       0.78      0.74      0.76        19
          7       0.26      0.36      0.30        14
          8       0.58      0.71      0.64        21
          9       0.79      0.94      0.86        16
avg / total       0.64      0.62      0.62       340

圖2.5

從輸出結果中可以看出,模型的準確率為64%,由於有限的資料集,該結果還可以接受的。但是從圖2.5中,我們可以看出模型出現了過擬合現象,訓練不到20次,訓練loss已經變得相當小。主要原因是資料量太少了,訓練資料集只有1020個樣本且每個類別只有60個樣本。

此外,從圖2.5中可以看到訓練精度在不到20次的迭代中已經超過了95%,在最後一次迭代中獲得了100%的準確性——很明顯地發生了過擬合。由於缺乏大量的訓練資料,MiniVGGNet對訓練資料的樣本學到了過於細微的特徵,無法推廣到測試資料。為了避免過擬合,我們可以應用正則化技術——在本章的上下文中,我們的正則化方法主要是資料增強。在實踐中,您還將包括其他形式的正則化(權值衰減、Dropout等),以進一步減少過擬合的影響。

Flowers-17: Data Augmentation

這一部分,我們將與上節相同的訓練過程,唯一不同的是對原始資料進行了資料增強。新建一個指令碼,名為minivggnet_flowers17_data_aug.py,並寫入以下程式碼:

#encoding:utf-8
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from pyimagesearch.preprocessing import ImageToArrayPreprocessor as IAP
from pyimagesearch.preprocessing import AspectAwarePreprocessor as AAP
from pyimagesearch.preprocessing import ImageMove as IM
from pyimagesearch.datasets import SimpleDatasetLoader as SDL
from pyimagesearch.nn.conv import MiniVGGNet as MVN
from keras.preprocessing.image import ImageDataGenerator # 資料增強類
from keras.optimizers import SGD
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import argparse
import os

與minivggnet_flowers17.py一樣,不同的是第10行新增了資料增強模組。

接下來同樣進行資料預處理

ap  = argparse.ArgumentParser()
ap.add_argument('-d','--dataset',required=True,help='path to input dataset')
args = vars(ap.parse_args())
print('[INFO] moving image to label folder.....')
im  = IM.MoveImageToLabel(dataPath=args['dataset'])
im.makeFolder()
im.move()
print("[INFO] loading images...")
imagePaths = [ x for x in list(paths.list_images(args['dataset'])) if x.split(os.path.sep)[-2] !='jpg']
classNames = [pt.split(os.path.sep)[-2] for pt in imagePaths ]
classNames = [str(x) for x in np.unique(classNames)]
aap = AAP.AspectAwarePreprocesser(64,64)
iap = IAP.ImageToArrayPreprocess()
sdl = SDL.SimpleDatasetLoader(preprocessors = [aap,iap])
(data,labels) = sdl.load(imagePaths,verbose = 500)
data = data.astype('float') / 255.0
(trainX,testX,trainY,testY) = train_test_split(data,labels,test_size=0.25,random_state  =43)
trainY = LabelBinarizer().fit_transform(trainY)
testY = LabelBinarizer().fit_transform(testY)

資料預處理完之後,在模型訓練之前,我們對train資料進行資料增強處理。

aug = ImageDataGenerator(rotation_range=30, width_shift_range=0.1,height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,horizontal_flip=True, fill_mode="nearest")

主要的變換有:

  • 隨機旋轉±30度
  • 水平和垂直平移0.2
  • 裁剪0.2
  • 縮放0.2
  • 水平翻轉

通常而言,這些調整的引數值需要根據你的具體資料進行設定,一般而言,旋轉幅度控制在[0,30]之間,水平和垂直平移控制在[0.1,0.2](縮放也是一樣的),如果水平翻轉沒有改變圖片的語義資訊,標籤沒有發生變化,則應該也使用水平翻轉。

接下來。對模型進行初始化

print("[INFO] compiling model...")
opt = SGD(lr=0.05)
model = MVN.MiniVGGNet.build(width=64, height=64, depth=3,classes=len(classNames))
model.compile(loss="categorical_crossentropy", optimizer=opt,metrics=["accuracy"])

由於我們使用了資料增強處理,因此,訓練模型部分,需要簡單進行調整

# 訓練模型
print("[INFO] training network...")
# 這裡使用fit_generator
H = model.fit_generator(aug.flow(trainX, trainY, batch_size=32),validation_data=(testX, testY), steps_per_epoch=len(trainX) // 32,epochs=100, verbose=1)

需要注意的是,這裡使用的是.fit_generator而不是.fit,第一個引數為aug.flow,生成經過資料增強或標準化後的batch資料。flow輸入的是對應的訓練資料和標籤。

steps_per_epoch的含義是一個epoch分成多少個batch_size, 每個epoch以經過模型的樣本數達到samples_per_epoch時,記一個epoch結束。如果說訓練樣本樹N=1000,steps_per_epoch = 10,那麼相當於一個batch_size=100。

接下來,開始訓練模型,並對結果進行視覺化。

# 評估網路
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
predictions.argmax(axis=1), target_names=classNames))

# loss和精度視覺化
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0, 100), H.history["loss"], label="train_loss")
plt.plot(np.arange(0, 100), H.history["val_loss"], label="val_loss")
plt.plot(np
            
           

相關推薦

深度學習計算機視覺(PB-02)-資料增強

在深度學習實踐中,當訓練資料量少時,可能會出現過擬合問題。根據Goodfellow等人的觀點,我們對學習演算法的任何修改的目的都是為了減小泛化誤差,而不是訓練誤差。 我們已經在sb[後續補充]中提到了不同型別的正則化手段來防止模型的過擬合,然而,這些都是針對引數的正則化形式,往往要求我們

深度學習計算機視覺(PB-09)-使用HDF5儲存大資料

到目前為止,我們使用的資料集都能夠全部載入到記憶體中。對於小資料集,我們可以載入全部影象資料到記憶體中,進行預處理,並進行前向傳播處理。然而,對於大規模資料集(比如ImageNet),我們需要建立資料生成器,每次只訪問一小部分資料集(比如mini-batch),然後對batch資料進行預處理

深度學習計算機視覺(PB-04)-rank-N準確度

在我們深入討論高階深度學習主題(如遷移學習)之前,先來了解下rank-1、rank-5和rank-N準確度的概念。當你在閱讀深度學習相關文獻時,尤其是關於計算機視覺和影象分類,你很可能會看到關於rank-N 準確度。例如,幾乎所有在ImageNet資料集上驗證的機器學習方法的論文都給出了ra

深度學習計算機視覺(PB-03)-特徵提取

從這節開始,我們將討論關於遷移學習的內容,即用預先訓練好的模型(往往是在大型資料上訓練得到的)對新的資料進行學習. 首先,從傳統的機器學習場景出發,即考慮兩個分類任務: 第一個任務是訓練一個卷積神經網路來識別影象中的狗和貓。 第二個任務是訓練一個卷積神經網路識別三

深度學習計算機視覺(PB-08)-應用深度學習最佳途徑

在Starter Bundle第10章中,我們提到了訓練一個神經網路模型所需要的四個因素,即: 資料集 loss函式 神經網路結構 優化演算法 有了這四個因素,實際上我們是可以訓練任何深度學習模型,但是,我們如何訓練得到一個最優的深度學習模型?如果效果

深度學習計算機視覺(PB-10)-Kaggle之貓狗比賽

在第9節中,我們提到了當資料太大無法載入到記憶體中時,如何使用HDF5儲存大資料集——我們自定義了一個python指令碼將原始影象資料集序列化為高效的HDF5資料集。在HDF5資料集中讀取影象資料集可以避免I/O延遲問題,從而加快訓練過程。 假設我們有N張儲存在磁碟上的影象資料,之前的做

深度學習計算機視覺(PB-07)-優化演算法

在之前的章節中,我們只研究和使用了隨機梯度下降法(SGD)來優化網路模型,但是,在深度學習中還有其他高階的優化演算法,這些高階方法可以加速訓練過程或者提高準確度: 在可接受的準確度下,高階演算法可以減少訓練時間(比如更少的迭代次數epochs)。 模型可以更好的適應其他超引

深度學習計算機視覺(PB-06)-模型整合

在本章中,我們將探討整合方法的概念——多個分類器合併成一個大型元分類器的過程。將多個模型的平均結果最為最終結果,可以比隨機的單一模型獲得更高的效能(比如準確度)。事實上,幾乎你所看到的在ImageNet資料挑戰賽上獲得最佳的結果都是通過整合多個卷積神經網路結果得到的。 首先,我們將討論下

深度學習計算機視覺(PB-05)-網路微調

在第3節中,我們學習瞭如何將預訓練好的卷積神經網路作為特徵提取器。通過載入預訓練好的模型,可以提取指定層的輸出作為特徵向量,並將特徵向量儲存到磁碟。有了特徵向量之後,我們就可以在特徵向量上訓練傳統的機器學習演算法(比如在第3節中我們使用的邏輯迴歸模型)。當然對於特徵向量,我們也可以使用手工提

深度學習計算機視覺(PB-12)-ResNet

系列學習: 深度學習與計算機視覺(PB-13)—ImageNet資料集準備 深度學習與計算機視覺(PB-12)—ResNet 深度學習與計算機視覺(PB-11)—GoogLeNet 深度學習與計算機視覺(PB-10)—Kaggle之貓狗比賽 深度學習與計算

分享《深度學習計算機視覺演算法原理框架應用》《大資料架構詳解從資料獲取到深度學習》PDF資料

下載:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w 更多資料分享:http://blog.51cto.com/3215120 《深度學習與計算機視覺 演算法原理、框架應用》PDF,帶書籤,347頁。《大資料架構詳解:從資料獲取到深度學習》PDF,帶書籤,3

分享《深度學習計算機視覺演算法原理框架應用》PDF《大資料架構詳解從資料獲取到深度學習》PDF +資料

下載:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w 更多分享資料:https://www.cnblogs.com/javapythonstudy/ 《深度學習與計算機視覺 演算法原理、框架應用》PDF,帶書籤,347頁。《大資料架構詳解:從資料獲取到深度學

# cs231n 深度學習計算機視覺(資料彙總)--程式碼及說明 python3.x和python2.x的版本(每次更新完成的作業)

cs231n 深度學習與計算機視覺(資料彙總)–程式碼及說明 python3.x和python2.x的版本(每次更新完成的作業) 標籤(空格分隔): 神經網路 1.python2.x版本 程式碼、課程 2.python3.x版本 這個是2017

【逐夢AI】深度學習計算機視覺應用實戰課程(BAT工程師主講,無人汽車,機器人,神經網絡)

bat 神經網絡 深度學習 深度學習框架 0基礎 http 提取 框架 以及 【逐夢AI】深度學習與計算機視覺應用實戰課程(BAT工程師主講,無人汽車,機器人,神經網絡)網盤地址:https://pan.baidu.com/s/1G0_WS-uHeSyVvvl_4bQnlA

分享《深度學習計算機視覺算法原理框架應用》《大數據架構詳解從數據獲取到深度學習》PDF數據集

書簽 部分 https log pdf 深入 -s 更多 實用 下載:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w 更多資料分享:http://blog.51cto.com/3215120 《深度學習與計算機視覺 算法原理

深度學習計算機視覺: 搞懂反向傳播演算法的四個基本方程

BP演算法,在深度神經網路的發展中有著舉足輕重的地位,對於反向傳播演算法的推導過程,各種資料介紹可謂是多不勝數。但,由於深度神經網路的複雜性,要比較深刻的理解反向傳播演算法還是需要自己手動的推導一遍。 本文以前篇深度學習與計算機視覺: 深度學習必知基本概念以及鏈式求導介紹了神經網路的反向傳播中的鏈式求導法則

深度學習計算機視覺深度學習必知基本概念以及鏈式求導

深度學習與計算機視覺,開篇。 深度學習的幾個基本概念 反向傳播演算法中的鏈式求導法則。 關於反向傳播四個基本方程的推導過程,放在下一篇。 深度學習基礎 深度學習的幾度沉浮的歷史就不多說了,這裡梳理下深度學習的一些基本概念,做個總結記錄,內容多來源於網路。 神

李飛飛深度學習計算機視覺公開課

今天開始學習李飛飛老師的公開課。希望可以順利入門深度學習。一、k最近鄰與線性分類器     k近鄰分類器工作方式是高效的得到本聯合訓練集。附:python處理資料基礎:import numpy as np # Create the following rank 2 arra

深度學習計算機視覺核心技術應用(學習目錄簡介)

    無意中看到舉辦的深度學習與計算機視覺的課程培訓,看到培訓的內容,很是感興趣,有種把之前零散學習到的東西進行了一次總結。因此我想根據培訓課程的目錄把我之前的學習的一些內容以及個人經驗進行一次全面的總結,也當做一次複習吧!     深度學習是近十年來人工智

深度學習計算機視覺系列(10)_細說卷積神經網路

1. 前言 前面九講對神經網路的結構,元件,訓練方法,原理等做了介紹。現在我們回到本系列的核心:計算機視覺,神經網路中的一種特殊版本在計算機視覺中使用最為廣泛,這就是大家都知道的卷積神經網路。卷積神經網路和普通的神經網路一樣,由『神經元』按層級結構組成