深度学习-吴恩达第一课第二周课程作业
這周作業(yè)是,給出一張圖片,判斷這張圖是不是貓。
這是一個(gè)二分類問(wèn)題,結(jié)果是非0即1的,使用邏輯回歸(Logic Regression),可以說(shuō),了解這個(gè)回歸方法,有些python基礎(chǔ),會(huì)使用jupyter notebook就可以嘗試著碼一遍代碼,走完整個(gè)學(xué)習(xí)流程,能進(jìn)一步加深對(duì)邏輯回歸的了解,對(duì)下一步的學(xué)習(xí)也有好處。首先在寫代碼之前,需要把邏輯回歸向量化理解清楚,因?yàn)楹竺娲a不是用循環(huán)來(lái)寫的,是直接對(duì)矩陣進(jìn)行操作的,這就要求把回歸中的循環(huán)求和啊,相乘啊都用矩陣來(lái)表示,特別要注意矩陣的維度,不要搞混了,這就不細(xì)說(shuō)了。
?
1.數(shù)據(jù)導(dǎo)入
首先需要獲取數(shù)據(jù)集,這里貼一個(gè)GITHUB地址,可分別自行下載訓(xùn)練和測(cè)試數(shù)據(jù)集,數(shù)據(jù)集是后綴為.h5的文件,
要讓python文件能讀取這類文件,需要引入h5py庫(kù)。已安裝Anaconda的話應(yīng)該不需要再手動(dòng)下載這個(gè)庫(kù)了,Anaconda
中包含了很多常用的庫(kù)文件,如果沒(méi)有安裝Anaconda,可以直接用pip安裝:pip install h5py
?
安裝好以后,就可以在notebook上直接導(dǎo)入庫(kù),這個(gè)案例一共需要用到三個(gè)庫(kù),這塊就一起導(dǎo)入了:
import numpy as np import matplotlib.pyplot as plt import h5py?
h5py庫(kù)是用來(lái)讀取數(shù)據(jù)集的,有兩個(gè)數(shù)據(jù)集需要讀取,訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集:
train_data = h5py.File('D:\\jupyter\\datasets\\train_catvnoncat.h5','r') test_data = h5py.File('D:\\jupyter\\datasets\\test_catvnoncat.h5','r')后面的參數(shù)r表示只讀模式,這樣就把這兩個(gè)數(shù)據(jù)集導(dǎo)入到notebook中了,下面就需要對(duì)導(dǎo)入的數(shù)據(jù)進(jìn)行處理
在此之前,可以先來(lái)看看數(shù)據(jù)集到底是什么樣的,.h5文件中存儲(chǔ)的數(shù)據(jù)都是鍵值對(duì)(key-value),可以理解為key就是對(duì)一堆數(shù)據(jù)設(shè)定的一個(gè)標(biāo)簽,通過(guò)這個(gè)標(biāo)簽就可以獲取這個(gè)標(biāo)簽下的所有數(shù)據(jù),就拿train集來(lái)說(shuō):
#獲取其中的所有key值 list(train_data.keys())#這是輸出結(jié)果,有三個(gè) ['list_classes', 'train_set_x', 'train_set_y']#選其中一個(gè) train_data['train_set_x'].shape#輸出,這表示有209張圖,每張圖存儲(chǔ)格式為(64,64,3) (209, 64, 64, 3)圖像在計(jì)算機(jī)中的存儲(chǔ)形式,其實(shí)就是三個(gè)矩陣,這三個(gè)矩陣分別表示(red,green,blue)在每一個(gè)像素單元格的取值,
因?yàn)槲覀兌贾肋@三色可以組成任何色,這個(gè)案例中用到的圖像大小都是64*64*3,也就是由三個(gè)64*64的矩陣來(lái)存儲(chǔ)的
矩陣中每個(gè)元素的取值為0-255
再介紹一下三個(gè)key值,第一個(gè)是類別,針對(duì)這個(gè)問(wèn)題也就是,是否為貓;第二個(gè)是X集,也就是所有的特征值,屬性值,這里的X集并不是我們能直接使用的,還需要對(duì)它進(jìn)行處理,下面會(huì)講到;第三個(gè)是Y集,0/1 ,這里就要明確一點(diǎn),train數(shù)據(jù)集的樣本個(gè)數(shù),也就是m的值是209
?
?
2.數(shù)據(jù)處理
為了方便操作,先把數(shù)據(jù)都取出來(lái),X集和Y集分開(kāi):
train_data_x=train_data['train_set_x'][:] train_data_y=train_data['train_set_y'][:]test_data_x=test_data['test_set_x'][:] test_data_y=test_data['test_set_y'][:]下面要做的就是處理X集,相對(duì)麻煩,Y集直接重塑成1*209矩陣即可
#處理X集:獲取樣本個(gè)數(shù),將X集轉(zhuǎn)換為209*(64*64*3)形式 m_train=train_data_x.shape[0] train_data_finalX=train_data_x.reshape(m_train,-1).Tm_test=test_data_x.shape[0] test_data_finalX=test_data_x.reshape(m_test,-1).T#處理Y集 train_data_finalY=train_data_y.reshape(1,m_train) test_data_finalY=test_data_y.reshape(1,m_test)解釋一下這個(gè)數(shù)據(jù)格式轉(zhuǎn)化,我們?cè)谙蛄炕臅r(shí)候,需要的X集是(n*m)的,其中n是特征值或者叫做屬性值的個(gè)數(shù),m是樣本的個(gè)數(shù),在這里,樣本數(shù)是209,屬性值的個(gè)數(shù)就是64*64*3,就是把一個(gè)圖片的所有存儲(chǔ)值都合并在一起。通過(guò)reshape得到的是一個(gè)m(m=209)*n(n=64*64*3)的矩陣,所以還需要獲取它的轉(zhuǎn)置
如果不確定現(xiàn)在操作的矩陣的維數(shù),可以通過(guò)X.shape查看維數(shù)
?
最后一步,前面提到過(guò)X集中特征值的取值范圍在0-255,偏差較大,為使得分類器訓(xùn)練效果更好一些,可以對(duì)X集數(shù)據(jù)進(jìn)行規(guī)范處理,這里可以直接讓每一個(gè)特征值除以255,讓其處于0-1這個(gè)范圍
train_data_finalX=train_data_finalX/255 test_data_finalX=test_data_finalX/255?
?
3.訓(xùn)練模型
處理完數(shù)據(jù)以后,終于可以進(jìn)入正題了,下面分兩個(gè)階段來(lái)講,向前傳播和反向傳播。
向前傳播,就是根據(jù)X集的特征值,結(jié)合W權(quán)重,以及b值,經(jīng)過(guò) Z=W’X+b 得到Z值,然后計(jì)算出預(yù)測(cè)的Y值 a
反向傳播,就是求偏倒數(shù),這里的dw只是方便書(shū)寫,這其實(shí)是w對(duì)J的偏導(dǎo)數(shù),其他也一樣
#先定義sigmoid函數(shù),方便后面調(diào)用,這里的a是一個(gè)樣本數(shù)據(jù)得到的預(yù)測(cè)值 def sigmoid(z):a=1/(1+np.exp(-z))return a#初始化w(n*1)和b(常數(shù)) n_dim=train_data_finalX.shape[0] w=np.zeros([n_dim,1]) b=0#完成一次迭代 def propagate(w,b,x,y):#向前傳播,z(1*m),A(1*m)z=np.dot(w.T,x)+bA=sigmoid(z)m=x.shape[1]#損失函數(shù)J=-1/m*np.sum(y*np.log(A)+(1-y)*np.log(1-A))#反向傳播,其實(shí)就是求偏導(dǎo)#dz(1*m),dw(n*1),db常數(shù)dz=A-ydw=1/m*np.dot(x,dz.T)db=1/m*np.sum(dz)#將返回值封裝在dict中,比較方便獲取grands={'dw':dw,'db':db}return grands,J?
當(dāng)然一次迭代是無(wú)效的,需要多次迭代:
#多次迭代尋找最優(yōu)解(w,b) def optimize(w,b,x,y,alphs,n_iters,flag=True):#每一百次獲取一個(gè)代價(jià)值,保存在這個(gè)list中costs=[]#開(kāi)始迭代,每次迭代之前先獲取dw,db,用來(lái)更新w,b的值for i in range(n_iters):grands,J=propagate(w,b,x,y)dw=grands['dw']db=grands['db']w=w-dw*alphsb=b-db*alphs#打印代價(jià)值,后期可以用來(lái)繪制cost圖像if i % 100 == 0:costs.append(J)if flag:print('iters is ',i,' cost is ',J)#返回得到的w,bparams={'w':w,'b':b}return params,costs迭代完成以后,模型就訓(xùn)練好了,其實(shí)訓(xùn)練模型,說(shuō)白了在這個(gè)案例中就是獲得w和b
?
?
4.檢驗(yàn)?zāi)P?/strong>
那么這么訓(xùn)練出來(lái)的模型怎么樣呢,就需要用我們剛才處理過(guò)的測(cè)試集數(shù)據(jù)進(jìn)行預(yù)測(cè),也就是輸入X集,看得到的Y值是否正確,
從而可以知道我們這個(gè)模型的精確度是多少,也就是給出100張圖片,能有效判斷出幾張有貓?jiān)趦?nèi)的
def predict(w,b,X_test):#這個(gè)步驟是不是很熟悉,這就是前面訓(xùn)練模型時(shí)的向前傳播啊!z=np.dot(w.T,X_test)+bA=sigmoid(z)#初始化Y值m=X_test.shape[1]y_pred = np.zeros([1,m])#得到測(cè)試集預(yù)測(cè)到的Y值for i in range(m):if A[:,i] > 0.5:y_pred[:,i]=1else:y_pred[:,i]=0return y_pred?
?
5.整體實(shí)現(xiàn)
把模型訓(xùn)練和預(yù)測(cè)比較整合在一起:
def model(w,b,x_train,y_train,x_test,y_test,alpha,n_iters,flag):#訓(xùn)練模型params,costs=optimize(w,b,x_train,y_train,alpha,n_iters,flag)#獲取模型的中w,bw=params['w']b=params['b']#為了判斷模型對(duì)數(shù)據(jù)的擬合程度,這里添加了對(duì)訓(xùn)練集的預(yù)測(cè)y_pred_train=predict(w,b,x_train)y_pred_test=predict(w,b,x_test)#預(yù)測(cè)值和真實(shí)值做出比較,輸出相似程度百分比,也就是精確度print('train acc is ' ,np.mean(y_pred_train == y_train)*100,'%')print('test acc is ' ,np.mean(y_pred_test == y_test)*100,'%')b={'w':w,'b':b,'alpha':alpha,'costs':costs}return b?
接下來(lái)就萬(wàn)事具備只欠東風(fēng)了,這風(fēng)就是把訓(xùn)練數(shù)據(jù)喂給模型,然后拿測(cè)試數(shù)據(jù)檢驗(yàn)
這里用了兩個(gè)相差較大的學(xué)習(xí)因子訓(xùn)練模型,比較效果更加明顯:
b1=model(w,b,train_data_finalX,train_data_finalY,test_data_finalX,test_data_finalY,alpha=0.002,n_iters=2000,flag=True)b2=model(w,b,train_data_finalX,train_data_finalY,test_data_finalX,test_data_finalY,alpha=0.03,n_iters=2000,flag=False)輸出結(jié)果如下,注意b2模型沒(méi)有打印cost值
iters is 0 cost is 0.6931471805599453 iters is 100 cost is 0.5557515010876188 iters is 200 cost is 0.5068465769831775 iters is 300 cost is 0.47107861667750084 iters is 400 cost is 0.4423236413210922 iters is 500 cost is 0.41813940491641477 iters is 600 cost is 0.39724674562566165 iters is 700 cost is 0.37886680661383465 iters is 800 cost is 0.3624799165374718 iters is 900 cost is 0.3477178030467021 iters is 1000 cost is 0.33430809895082164 iters is 1100 cost is 0.322042799907918 iters is 1200 cost is 0.31075900404024404 iters is 1300 cost is 0.30032649931928485 iters is 1400 cost is 0.29063942055667524 iters is 1500 cost is 0.2816104491476511 iters is 1600 cost is 0.27316666681904955 iters is 1700 cost is 0.2652465214170832 iters is 1800 cost is 0.25779756133061105 iters is 1900 cost is 0.25077471388028166 train acc is 95.69377990430623 % test acc is 74.0 % train acc is 100.0 % test acc is 68.0 %?
下面我們繪制出cost圖像,更加直觀的看我們模型的訓(xùn)練過(guò)程:
plt.plot(b1['costs'],label=b1['alpha']) plt.plot(b2['costs'],label=b2['alpha']) plt.xlabel('per 100 iters') plt.ylabel('cost') plt.legend()?
從圖像中可以看到,學(xué)習(xí)因子選擇不當(dāng)導(dǎo)致模型梯度下降時(shí)幅度太大,走了很多彎路,0.03是故意選了一個(gè)不靠譜的學(xué)習(xí)因子,
可以看到在學(xué)習(xí)因子為0.002時(shí)針對(duì)測(cè)試集準(zhǔn)確率為74%,這個(gè)結(jié)果可能是有些不盡如人意,后面學(xué)習(xí)了更復(fù)雜的模型,再來(lái)試試會(huì)不會(huì)提高準(zhǔn)確度。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的深度学习-吴恩达第一课第二周课程作业的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微信oauth2.0授权
- 下一篇: 【转载】超简单集成HMS ML Kit