【TensorFlow】01 TensorFlow簡介與Python基礎(chǔ)
1043
2025-03-31
今天給大家?guī)淼氖蔷矸e神經(jīng)網(wǎng)絡(luò),聽上去是不是挺高大上的?它還有個更響亮的名字CNN,談到CNN應(yīng)該好多同學(xué)都略知一二吧,CNN在做圖像識別上有著很出色的效果,那我們今天對卷積神經(jīng)網(wǎng)絡(luò)一探究竟吧!
卷積神經(jīng)網(wǎng)絡(luò),CNN(Convolutional Neural Network),屬于深度學(xué)習(xí)技術(shù)的一種算法,主要是進(jìn)行特征學(xué)習(xí),通過分層網(wǎng)絡(luò)獲取分層次的特征信息去解決人工設(shè)計特征的這個難題。
(TIPS:深度學(xué)習(xí)包含多種技術(shù),CNN只是其中的一種,還包括:自動編碼器AutoEncoder,稀疏編碼Sparse Coding,限制玻爾茲曼機(jī)RBM,深信度網(wǎng)絡(luò)Deep Belief Networks,多層反饋循環(huán)神經(jīng)網(wǎng)絡(luò)RNN)
卷積神經(jīng)網(wǎng)絡(luò)
關(guān)于卷積神經(jīng)網(wǎng)絡(luò)我們?nèi)绾问褂猛ㄋ滓锥恼Z言來解釋它呢?
首先我們需要了解:它就是多層神經(jīng)網(wǎng)絡(luò),善于解決圖像識別問題。那如何去理解神經(jīng)網(wǎng)絡(luò)呢,我們可以簡單的想象一下那密密麻麻的漁網(wǎng),網(wǎng)上的那些節(jié)組成的就是網(wǎng)絡(luò),節(jié)點和節(jié)點之間有線連接著,可以想象成每個神經(jīng)元(節(jié)點)之間都產(chǎn)生連接。
那卷積神經(jīng)網(wǎng)絡(luò)為什么對于圖像識別分類有著更好的效果呢?
圖片數(shù)據(jù)對于機(jī)器來說是交大的數(shù)據(jù),尤其是對于高清圖片,機(jī)器讀取和學(xué)習(xí)的時間也就越長,難度可以說指數(shù)級上升。但是卷積神經(jīng)網(wǎng)絡(luò)它可以將數(shù)據(jù)龐大的圖片識別問題去不斷降維(就是從圖像中不斷去抽取細(xì)節(jié)特征,從小的慢慢看),使得該圖像最終能夠被訓(xùn)練。
那么卷積神經(jīng)網(wǎng)絡(luò)是怎樣工作的呢?
卷積神經(jīng)網(wǎng)絡(luò)是由三個層組成的,分別是:卷積層,池化層,全連接層。
卷積層與池化層聯(lián)合工作,形成卷積組,一層一層的去提取特征,最終通過數(shù)個全連接層完成分類。
卷積層的原理其實就是局部視野的原理,有一張30*30的圖片,我每次只看3*3的大小(步長為3,不重復(fù)看),看100次全部看完,這就是卷積(看下圖去理解卷積)。池化層呢,就是降低維度,學(xué)術(shù)上又叫下采樣,就是從原圖片中進(jìn)行采樣,對于一張720*1080的照片,池化層進(jìn)行采樣,每次采30*30的大小,這就是池化了(看下圖去理解池化)。總的來說,CNN是通過卷積來區(qū)分特征,并且通過卷積產(chǎn)生的權(quán)值共享和池化來降低網(wǎng)絡(luò)參數(shù)的數(shù)量級,最后的工作就和普通神經(jīng)網(wǎng)絡(luò)的工作一樣了。
卷積神經(jīng)網(wǎng)絡(luò)在圖像數(shù)據(jù)非常多的適合會有出乎意料的效果,但是數(shù)據(jù)集過少的時候往往效果不是很好,容易出現(xiàn)過擬合。
卷積
池化
LeNet介紹
我們來看看這一張圖,從原始圖片不斷提取,卷積。
先進(jìn)入一個卷積層C1,由6個5x5的卷積核組成,卷積出28x28的圖像,然后下采樣到14x14(S2),再進(jìn)一個卷積層C3,由16個5x5的卷積核組成,之后再下采樣到5x5(S4)。我們可以看出,C3-0跟S2-0,1,2連接,C3-1跟S2-1,2,3連接,后面依次類推。最后,通過全連接層C5、F6得到10個輸出,對應(yīng)10個數(shù)字的概率。
訓(xùn)練
卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練分為兩個階段:
階段一:
正向傳播
A、從樣本集中取一個樣本(X,Yp),將X輸入網(wǎng)絡(luò);
B、計算相應(yīng)的實際輸出Op。
在此階段,信息從輸入層經(jīng)過逐級的變換,傳送到輸出層。這個過程也是網(wǎng)絡(luò)在完成訓(xùn)練后正常運(yùn)行時執(zhí)行的過程。在此過程中,網(wǎng)絡(luò)執(zhí)行的是計算(實際上就是輸入與每層的權(quán)值矩陣相點乘,得到最后的輸出結(jié)果):
Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))
階段二:
反向傳播
A、算實際輸出Op與相應(yīng)的理想輸出Yp的差;
B、按極小化誤差的方法反向傳播調(diào)整權(quán)矩陣。
下面我們看看在Tensorflow中我們是怎么去做的吧!
前方代碼過于簡單,及時帶好眼睛!!!
數(shù)據(jù)準(zhǔn)備
教程的圖片從Cifar數(shù)據(jù)集中獲取,download_cifar.py從Keras自帶的Cifar數(shù)據(jù)集中獲取了部分Cifar數(shù)據(jù)集,并將其轉(zhuǎn)換為jpg圖片。
默認(rèn)從Cifar數(shù)據(jù)集中選取了3類圖片,每類50張圖,分別是
0 => 飛機(jī)? ?1 => 汽車? ?2 => 鳥
導(dǎo)入相關(guān)庫
import os#圖像讀取庫
from PIL import Image#矩陣運(yùn)算庫
import numpy as np
import Tensorflow as tf
配置信息
設(shè)置了一些變量增加程序的靈活性。圖片文件存放在data_dir文件夾中,train表示當(dāng)前執(zhí)行是訓(xùn)練還是測試,model-path約定了模型存放的路徑。
# 數(shù)據(jù)文件夾
data_dir = "data"
# 訓(xùn)練還是測試
train = True
# 模型文件路徑
model_path = "model/image_model"
數(shù)據(jù)讀取
pillow讀取的圖像像素值在0-255之間,需要?dú)w一化。
在讀取圖像數(shù)據(jù)、Label信息的同時,記錄圖像的路徑,方便后期調(diào)試。
定義placeholder(容器)
定義卷積網(wǎng)絡(luò)(Conv和Pooling部分)
定義全連接部分
定義損失函數(shù)和優(yōu)化器
定義模型保存器/載入器
訓(xùn)練階段執(zhí)行
如果trian為True,進(jìn)行訓(xùn)練。訓(xùn)練需要使用sess.run(tf.global_variables_initializer())初始化參數(shù),訓(xùn)練完成后,需要使用saver.save(sess, model_path)保存模型參數(shù)。
測試階段執(zhí)行
如果train為False,進(jìn)行測試,測試需要使用saver.restore(sess, model_path)讀取參數(shù)。
今天就到這里了,其實細(xì)心的同學(xué)你們會發(fā)現(xiàn)代碼大部分都是配置數(shù)據(jù)讀寫數(shù)據(jù),真正花在訓(xùn)練上的代碼也不是很多,其實對于深度學(xué)習(xí)也就是這個意思,主要工作并不是敲代碼,而是如何調(diào)參。TensorFlow在算法的封裝上確實是做的很好的,我們可以直接拿過來用。大家也快去試試吧!
代碼地址:
https://www.bytelang.com/o/s/c/uEOz1asEK6s=
感興趣的掃個二維碼吧!
卷積神經(jīng)網(wǎng)絡(luò) 深度學(xué)習(xí) 神經(jīng)網(wǎng)絡(luò)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。