PyTorch卷積神經網絡模型初建

最近自己配置深度學習的各種框架,硬盤空間都快裝滿了,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]))
 
# 至此完成了深度學習的建模!

在這裏插入圖片描述

嘿嘿嘿

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章