#定義一些必要函式
def sigmoid(z):
a=1/(1+np.exp(-z))
assert(a.shape==z.shape)
cache=z
return a,cache
def relu(z):
a=za[z<=0]=0
assert(a.shape==z.shape)
cache=z
return a,cache
def backward_sigmoid(da,a):
da.reshape(a.shape)
dz=da*a*(1-a)
assert(dz.shape==da.shape)
return dz
def backward_relu(da,cache):
z=cache
dz=da
dz[z<=0]=0
assert(dz.shape==da.shape)
return dz
def initial_parameters(layerdims):
np.random.seed(3)
l=len(layerdims)
parameters={}
for l in range(1,
l):#之前寫成了l+1
parameters["w"+str(l)]=np.random.randn(layerdims[l],layerdims[l-1])*0.01
parameters["b"+str(l)]=np.zeros((layerdims[1],1))
assert( parameters["w"+str(l)].shape)==(layerdims[l],layerdims[l-1])
assert( parameters["b"+str(l)].shape)==(layerdims[1],1)
return parameters
def line(a_pre,w,b):
z=np.dot(w,a_pre)+b
assert(z.shape==(w.shape[0],a_pre.shape[1]))
cache=[a_pre,w,b]
#寫成[a_pre,w,b]與(a_pre,w,b)效果一樣
return z,cache
def cost(y,al):
m=y.shape[1]
cost=-np.sum(np.multiply(y,np.log(al))+np.multiply(1-y,np.log(1-al)))/m #之前少寫了np.sum
cost=np.squeeze(cost) #記得降維成乙個數字 自己寫的忘記加了
assert(cost.shape==()) #自己寫的忘記加了
return cost
def forward_propagate(x,parameters):
l=len(parameters)/2
#答案是//2有必要嗎?因為parameters必然是成對出現的!有必要的。因為可以取整。去掉小數點變成整數、不然是float型
caches=
a_pre=x
for l in range(1,l):
z,cache_line=line(a_pre,parameters["w"+str(l)],parameters["b"+str(l)])
a,cache_active=relu(z)
a_pre=a
zl,cache_line=line(a_pre,parameters["w"+str(l)],parameters["b"+str(l)])
al,cache_active=sigmoid(zl)
return al,caches
def backward_propagate(y,al,caches):
l=len(caches)
#原來/2了 這裡不應該/2
grads={}
# cost=cost(y,al)
#去掉這句話 不加了
m=y.shape[1]
dal=-np.divide(y,al)+np.divide(1-y,1-al)
assert(dal.shape==al.shape)
grads["da"+str(l)]=dal
# dzl=backward_sigmoid(dal,al)#修改 l層單獨處理,然後再走後面的
cache_line_l,cache_active_l=caches[l-1]
dzl=backward_sigmoid(dal,cache_active_l)
dz=dzl
#新增加
grads["dw"+str(l)]=np.dot(dz,cache_line_l[0].t)/m
grads["db"+str(l)]=np.sum(dz,axis=1,keepdims=true)/m
grads["da"+str(l-1)]=np.dot(cache_line_l[1].t,dz)
for l in reversed(range(
l-1)):
cache_line,cache_active=caches[l]
a_pre,w,b=cache_line
z=cache_active
dz=backward_relu(grads["da"+str(l+1)],z)
grads["dw"+str(l+1)]=np.dot(dz,a_pre.t)
grads["db"+str(l+1)]=np.sum(dz,axis=1,keepdims=true)/m
grads["da"+str(l)]=np.dot(w.t,dz)
# dz=backward_relu(grads["da"+str(l)],z)#錯誤就出在這裡,z是z(l+1)的這裡不匹配應該用z(l)的
return grads
#返回值裡也去掉cost
def updata_parameters(parameters,grads,learning_rate):
l=len(parameters)/
/2for l in rang(l):
parameters["w"+str(l+1)]=parameters["w"+str(l+1)]-learning_rate*grads["dw"+str(l+1)]
parameters["b"+str(l+1)]=parameters["b"+str(l+1)]-learning_rate*grads["db"+str(l+1)]
return parameters
吳恩達老師課程總結
吳恩達老師課程總結1 深度學習概論 目錄 1.1神經網路的概念 1.2用神經網路進行監督學習 1.3深度學習的興起 1.1神經網路的概念 隨著ai日益博取眼球,方興未艾,神經網路再度火熱,談及神經網路,首先我們要解決乙個問題,什麼是神經網路?在我看來,神經網路是一種強大的學習演算法,這種演算法受到人...
吳恩達深度學習課程筆記
一直以為機器學習的重點在於設計精巧 神秘的演算法來模擬人類解決問題。學了這門課程才明白如何根據實際問題優化 調整模型更為重要。事實上,機器學習所使用的核心演算法幾十年來都沒變過。什麼是機器學習呢?以二類分類監督學習為例,假設我們已經有了一堆訓練資料,每個訓練樣本可以看作n維空間裡的乙個點,那麼機器學...
Course吳恩達機器學習課程完結
andew ng老師的機器學習終於看完了,收穫還是蠻大的。我並不是在course上看的,我是在b站上看的,本來想在網易雲上看結果網易雲下架了。我course作業都完成了結果發現沒證書?excuse me?還得購買或者申請助學金?沒人告訴我,我就吃了這個虧,太窮了,沒工資,每個月能來錢的就國家500塊...