1. 程式人生 > >深層網絡識別貓(吳恩達1課4周編程實例)

深層網絡識別貓(吳恩達1課4周編程實例)

.com float 一個 初始 通過 shape https src .cn

第四周編程

目標:建立一個深層的神經網絡識別貓

核心思想:

  1. 正向傳播技術分享圖片 技術分享圖片
  2. 反向傳播技術分享圖片

需要註意的事正反向傳播的初始值,技術分享圖片技術分享圖片

數據集:與第一個編程作業的數據集一樣

代碼流程:

  1. 根據神經網絡結構初始化參數(W,b)
  2. 將單元函數寫出來(linear,sigmoid,relu,sigmoid_backward,relu_backward)
  3. 正反向傳播,輸出梯度
  4. 單步梯度下降更新參數
  5. 預測函數
  6. 建立整合函數

代碼,穿插詳解與思路

16行:隨機初始化,將W1=(n1,n0)的矩陣存入字典parameters[‘W1‘]中

註意:隨機初始化時時* np.sqrt(2/layers_dims[l-1]),並不是吳恩達所說的*0.01

這是因為,這是一個多隱藏層的網絡,當*0.01時,反向傳播幾次之後會使得後面的深層網絡參數值變成0

詳細原因可看這四篇文章:

https://blog.csdn.net/shwan_ma/article/details/76257967

https://www.cnblogs.com/makefile/p/init-weight.html?utm_source=itdadao&utm_medium=referral

https://blog.csdn.net/marsggbo/article/details/77771497

https://blog.csdn.net/u013082989/article/details/53770851

(被吳恩達給坑了,一開始*0.01,cost一直不變。搞了好長時間)

21-38行:將單元函數列在這裏,是因為我想將這個model標準化,你可以在這裏添加你想添加的單元函數, 比如tanh函數,記得添加了一個tanh函數時,還要添加一個對應的tanh_backward函數。有正向傳播,就要有反向傳播

41-71行:propagate傳播函數。這裏代碼看起來復雜,實際上很容易理解。正向傳播就是一條路走到成本函數。第l層,正向傳播先計算出Z[l],再根據選擇的激活函數計算A[l]

反向傳播,先看一下核心思想中反向傳播。先根據激活函數,將dAl,和dZl傳入反向傳播計算的單元函數中。然後再一步一步計算出dW,db。假設L=5,那麽左後一層的A的激活函數是dA4,從dA[L-l]開始反向傳播計算

propagate函數傳出Y_p,是因為不想在預測函數中再寫一次正向傳播,所以添加了一個Y_p

122,123行:兩個超參數輸入。122行輸入的是layers_dims 即你想建立的神經網絡結構。

如:你想建立幾個隱藏層,每一層的隱藏層有幾個神經節點。通過一個列表組裝

123行輸入的是每一層的激活函數。由於我的單元函數只有relu和sigmoid函數,所以只有這兩個關鍵字可選進去

ps:通過列表組裝數據很不穩,一不小心就會傳錯參數。最好的方法是傳一個字典進去如

技術分享圖片

技術分享圖片

當然,中間調用layers_dims,activations的代碼也要發生點變化,人懶,不想改了

最後的分析步驟也就是,將識別錯誤的圖片打印出來而已

  1. import numpy as np
  2. import h5py
  3. import matplotlib.pyplot as plt
  4. import lr_utils
  5. import testCases_v2
  6. plt.rcParams[‘figure.figsize‘]=(5.0,4.0)
  7. plt.rcParams[‘image.interpolation‘]=‘nearest‘
  8. plt.rcParams[‘image.cmap‘]=‘gray‘
  9. #上面三句是設置圖形的默認格式
  10. np.random.seed(1)
  11. 產生可預測#隨機值
  12. def initialize_parameters(layers_dims):
  13. np.random.seed(3)
  14. parameters={}
  15. for l in range(1,len(layers_dims)):
  16. parameters[‘W‘+str(l)]=np.random.randn(layers_dims[l],layers_dims[l-1])*np.sqrt(2/layers_dims[l-1])
  17. parameters[‘b‘+str(l)]=np.zeros(shape=(layers_dims[l],1))
  18. return parameters
  19. # 單元函數
  20. def linear(A,W,b):
  21. Z=np.dot(W,A)+b
  22. return Z
  23. def sigmoid(Z):
  24. A=1/(1+np.exp(-Z))
  25. return A
  26. def relu(Z):
  27. A=np.maximum(0,Z)
  28. return A
  29. def sigmoid_backword(dA,Z):
  30. s=1/(1+np.exp(-Z))
  31. dZ=dA*s*(1-s)
  32. return dZ
  33. def relu_backword(dA,Z):
  34. dZ=dA.copy()
  35. dZ[Z<=0]=0
  36. return dZ
  37. #正反向傳播
  38. def propagate(X,Y,parameters,layers_dims,activations):
  39. m=X.shape[1]
  40. L=len(layers_dims)
  41. #正向傳播
  42. caches,grads={‘A0‘:X},{}
  43. for l in range(1,L):
  44. caches[‘Z‘+str(l)]=linear(caches[‘A‘+str(l-1)],parameters[‘W‘+str(l)],parameters[‘b‘+str(l)])
  45. if activations[l-1]==‘sigmoid‘:
  46. caches[‘A‘+str(l)]=sigmoid(caches[‘Z‘+str(l)])
  47. if activations[l-1]==‘relu‘:
  48. caches[‘A‘+str(l)]=relu(caches[‘Z‘+str(l)])
  49. Y_p=caches[‘A‘+str(L-1)]
  50. #成本函數
  51. cost=-np.sum(Y*np.log(Y_p)+(1-Y)*np.log(1-Y_p))/m
  52. cost=np.squeeze(cost)
  53. #反向傳播
  54. grads[‘dA‘+str(L-1)]=-(Y/Y_p)+(1-Y)/(1-Y_p)
  55. for l in range(1,L):
  56. if activations[-l]==‘sigmoid‘:
  57. grads[‘dZ‘+str(L-l)]=sigmoid_backword(grads[‘dA‘+str(L-l)],caches[‘Z‘+str(L-l)])
  58. if activations[-l]==‘relu‘:
  59. grads[‘dZ‘+str(L-l)]=relu_backword(grads[‘dA‘+str(L-l)],caches[‘Z‘+str(L-l)])
  60. grads[‘dW‘+str(L-l)]=np.dot(grads[‘dZ‘+str(L-l)],(caches[‘A‘+str(L-l-1)]).T)/m
  61. grads[‘db‘+str(L-l)]=np.sum(grads[‘dZ‘+str(L-l)],axis=1,keepdims=True)/m
  62. grads[‘dA‘+str(L-l-1)]=np.dot((parameters[‘W‘+str(L-l)]).T,grads[‘dZ‘+str(L-l)])
  63. return grads,Y_p,cost
  64. #更新參數
  65. def update_parameters(parameters,grads,learning_rate,layers_dims):
  66. L=len(layers_dims)
  67. for l in range(1,L):
  68. parameters[‘W‘+str(l)]=parameters[‘W‘+str(l)]-learning_rate*grads[‘dW‘+str(l)]
  69. parameters[‘b‘+str(l)]=parameters[‘b‘+str(l)]-learning_rate*grads[‘db‘+str(l)]
  70. return parameters
  71. #預測函數
  72. def predict(X,Y,parameters,layers_dims,activations):
  73. m=X.shape[1]
  74. grads,Y_p,cost=propagate(X,Y,parameters,layers_dims,activations)
  75. Y_p = np.round(Y_p)
  76. print(準確度:‘+str(float(np.sum((Y_p == Y))/m)))
  77. return Y_p
  78. #模型組合
  79. def model3(X,Y,num_iterations,learning_rate,layers_dims,activations,print_cost=False,isplot=True):
  80. np.random.seed(1)
  81. parameters=initialize_parameters(layers_dims)
  82. L=len(layers_dims)
  83. costs=[]
  84. for i in range(num_iterations):
  85. grads,Y_p,cost=propagate(X,Y,parameters,layers_dims,activations)
  86. parameters=update_parameters(parameters,grads,learning_rate,layers_dims)
  87. if i%100 == 0:
  88. costs.append(cost)
  89. if print_cost:
  90. print(‘after iteration of %d cost:%f‘%(i,cost))
  91. if isplot:
  92. plt.plot(np.squeeze(costs))
  93. plt.ylabel(‘cost‘)
  94. plt.title(‘Learning rate =‘+str(learning_rate))
  95. plt.show()
  96. return parameters
  97. train_set_x_orig , train_set_y , test_set_x_orig , test_set_y , classes = lr_utils.load_dataset()
  98. train_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T
  99. test_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T
  100. train_x = train_x_flatten / 255
  101. train_y = train_set_y
  102. test_x = test_x_flatten / 255
  103. test_y = test_set_y
  104. layers_dims = [12288,20,7,5,1]
  105. activations=[‘relu‘,‘relu‘,‘relu‘,‘sigmoid‘]
  106. parameters=model3(train_x,train_y,num_iterations=2500,learning_rate=0.0075,layers_dims=layers_dims,activations=activations,print_cost=True,isplot=False)
  107. Y_p=predict(test_x,test_y,parameters,layers_dims,activations)
  108. #分析
  109. def print_mislabeled_images(classes,X,y,p):
  110. a=p+y
  111. mislabeled_indices=np.asarray(np.where(a==1))
  112. plt.rcParams[‘figure.figsize‘] = (40.0, 40.0)
  113. num_images = len(mislabeled_indices[0])
  114. for i in range(num_images):
  115. index = mislabeled_indices[1][i]
  116. plt.subplot(2, num_images, i + 1)
  117. plt.imshow(X[:,index].reshape(64,64,3), interpolation=‘nearest‘)
  118. plt.axis(‘off‘)
  119. plt.title("Prediction: " + classes[int(p[0,index])].decode("utf-8") + " \n Class: " + classes[y[0,index]].decode("utf-8"))
  120. print_mislabeled_images(classes,test_x,test_y,Y_p)

深層網絡識別貓(吳恩達1課4周編程實例)