最近自己配置深度學習的各種框架,硬盤空間都快裝滿了,windows的環境配置着實是太麻煩了
卷積神經網絡可以算是深度神經網絡中很流行的網絡了。本文從基礎入手,介紹了卷積網絡的基本原理以及相關的其它技術,並利用卷積網絡做了一個簡單項目作爲示例參考。想入手 CNN 的朋友不可錯過~
卷積神經網絡之所以優於其它深度神經網絡是由於它特殊的操作。相比一次只計算圖像中的單個像素,CNN 將多個像素的信息組合在一起,因此能夠理解時間模式。
另外,CNN 可以「看到」一組像素組合成一條直線或者曲線。由於深度神經網絡通常都是多層卷積的堆疊,通過上一層得到了直線或者曲線後,下一層不再組合像素,而是將線組合成形狀,一層一層進行下去,直到形成完整的圖片。
深度學習建模過程:
(1)下載或者製作數據集
(2)數據讀取、清洗
(3)數據增強、特徵工程
(4)建立神經網絡/下載效果好的訓練好的模型
(5)進行學習根據metrics和loss評價模型準確度
(6)調整參數重新學習直到達到比較不錯的標準
使用fastai來進行這一切:
# 使用jupyternotebook進行試驗
%matplotlib inline
# 若引用的庫有更新會自動更新
%reload_ext autoreload
%autoreload 2
# import * 對於編程人員來說會有點難以接受,主要目的是方便實驗
from fastai import *
from fastai.vision import *
# 不怕不會,怕不知道怎麼學,在進行一切之前,首先要學會如下:
doc(get_transforms()) # 獲得該方法的文檔,學會使用該方法
# 使用上面的方法結合訪問官方文檔介紹網站來進行學習,官方文檔url文中最開始有提供。
'''
首先獲得數據集
'''
# 1.示例中的數據爲PETS,是一個用來進行貓狗品種分類的數據集。
path = untar_data(URLs.PETS) # 該方法首先下載數據集到目錄中,再進行解壓,返回解壓路徑
print(path) # 打印path,其爲下載的目錄
print(path.ls()) # 看看解壓路徑中的文件
paths_img = path/'images' # 該路徑爲圖像文件路徑,也就是真正的建模數據集
images = get_images_files(paths_img) # 該方法爲獲取路徑中的所有文件
print(images[:5])
# 2.加載路徑中的數據集
pat = r'/([^/]+)_\d+.jpg$' # 用於匹配圖片名字的表達式
tfms = get_transforms() # 這個用來進行數據增強
data = ImageDataBunch.from_name_re(paths_img, images, pat=pat, ds_tfms=tfms, size=224, bs=32) # 該方法使用數據加載對象ImageDataBunch的from_name_re(使用正則匹配文件名稱的方法),進行數據讀取。
data.show_batch(rows=3, figsize=(6,8)) # 看看數據的樣子
print(data.c) # 打印數據集中的分類數量
data.normalize(imagenet_stats) # normalize圖像,消除因爲激活函數而可能發生的梯度爆炸和梯度消失情況,加快梯度下降,很有用,詳細內容請看文章開始提供的pytorch教學鏈接裏面關於BN(batch_normal)的視頻
# 3.進行神經網絡建模和學習
'''
神經網絡訓練,可以概括爲如下步驟:
1.建立神經網絡模型,預先訓練好的比較好,表達能力更強
2.查找合適的學習率進行學習
3.進行學習(該步驟其實爲遷移學習:使用pretrained模型加上自己的分類,然後進行學習)
4.保留當前狀態
5.unfreeze:解凍模型所有權重,準備
6.查找合適的學習率。
7.再次進行學習,(進行fine tune:微調,在原有模型上加上自己的最後fully connection layer,然後進行所有權重訓練。)
'''
learn = create_cnn(data, models.resnet34, metrics=fastai.metrics.accuracy) # 該方法建立了一個resnet34網絡結構的CNN網絡,在訓練中打印metrics對應的方法來展示精度,注意:metrics不影響訓練精度。
learn.lr_find() # 查找合適的學習率
learn.recorder.plot() # 繪製y軸爲loss,x軸爲學習率的圖像
# 學習率應該選擇loss向下降程度最大點所對應的學習率
learn.fit_one_cycle(4, slice(lr)) # 進行訓練,4爲epoch數,slice(lr)是學習率範圍
learn.save('stage_1', return_path=True) # 保存第一階段遷移學習的參數,return_path=True是打印保存目錄
learn.unfreeze() # 該方法爲解凍所有權重
learn.lr_find()
learn.recorder.plot()
learn.fit_one_cycle(5, slice(lr)) # 開始fine tune,該lr爲上面一步圖像中下降最快的點對應的lr
learn.save('stage_2') # 保存第二階段fine tune的參數
# 4.查看分類錯的數據都是哪些
interp = ClassificationInterpretation.from_learner(learn)
losses,idxs = interp.top_losses() # 查找分類錯誤的圖像的索引
interp.plot_top_losses(9, figsize=(15,11)) # 打印出分類錯誤的圖像
# 5.分類一個試試
img = open_image(images[0])
label, idx, probability = learn.predict(img)
print('預測的分類爲{}, 概率爲{:.4f}'.format(label, probability[idx]))
# 至此完成了深度學習的建模!
嘿嘿嘿