日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

吴恩达深度学习第一章第二周编程作业

發布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 吴恩达深度学习第一章第二周编程作业 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、題目描述。
  • 二、相關庫
  • 三、編程步驟
    • 1.數據預處理
    • 2.模型的封裝
    • 3.模型的調用
    • 4.結果展示
  • 總結


前言

??本人處于初學階段,編程能力有限,代碼的編寫參考了網上的大神。

一、題目描述。


??我們需要訓練得到一個邏輯回歸分類器來對圖片進行二分類(是貓和不是貓),通過正向傳播和反向傳播來對參數進行優化。官方網站給出的題目形式是填空編程,這里我將給出完整的代碼,可能和官網上的有些出入,但是大致相同。

二、相關庫

1.numpy:強大的科學計算庫,主要用于矩陣的計算2.matplotlib:繪圖庫,可以繪制損失曲線3.h5py:是與H5文件中存儲的數據集進行交互的常用軟件包

三、編程步驟

1.數據預處理

lr_utils.py 用于圖片數據的讀取:

import numpy as np import h5py def load_dataset():train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r")train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set featurestrain_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labelstest_dataset = h5py.File('datasets/test_catvnoncat.h5', "r")test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set featurestest_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labelsclasses = np.array(test_dataset["list_classes"][:]) # the list of classestrain_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes

??每張圖片的大小為64*64像素,而每個像素點由RGB三原色組成,所以每張圖片的數據維度為(64,64,3),所以一張圖片需要12288個數據確定。load_dataset ?返回值的含義:

train_set_x_orig:訓練集圖像數據,一共209張,數據維度為(209,64,64,3) train_set_y_orig:訓練集的標簽集,維度為(1,209) test_set_x_orig:測試集圖像數據,一共50張,維度為(50,64,64,3) test_set_y_orig:測試集的標簽集,維度為(1,50) classes : 保存的是以bytes類型保存的兩個字符串數據,數據為:[b’non-cat’ b’cat’]

調用load_dataset函數。

train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()

我們可以利用matplotlib繪制其中的圖片。

plt.imshow(train_set_x_orig[27]) plt.show()

得到的結果如下:

??我們知道邏輯回歸的輸入x一般是一維向量,我們需要對 train_set_x_orig 和 test_set_x_orig 進行處理,從(209,64,64,3) 轉換為(12288,209)維度,可以利用numpy庫中的reshape()方法完成。numpy的shape通常返回一個元組,比如這里的 train_set_x_orig.shape 返回的元組為(209,64,64,3),所以train_set_x_orig.shape[0] 的值為 209 。

# 每一張圖片是64*64*3(這里的64*64表示像素點個數,3表示每個像素點由RGB三原色構成),將其轉換成列向量 train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T # 得到訓練集輸入數據,維度為(64*64*3,209) test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T # 得到測試集輸入數據,維度為(64*64*3,50)

??RGB的取值為0至255,我們需要將數據進行居中和標準化,將數據的每一行除以255。

# RGB的取值為(0,255),需要將數據進行居中和標準化,將數據集的每一行除以255(一般是將每一行數據除以該行數據的平均值) train_set_x = train_set_x_flatten / 255 test_set_x = test_set_x_flatten / 255

??至此,數據預處理基本完成,將上述操作封裝成函數 data_preprocess 。

def data_preprocess():"""數據預處理:return: train_set_x -訓練集(12288,209)train_set_y -訓練集標簽(1,209)test_set_x -測試集(12288,50)test_set_y -測試集標簽(1,50)"""# 獲得訓練集209條數據和測試集50條數據train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()plt.imshow(train_set_x_orig[27])plt.show()# 每一張圖片是64*64*3(這里的64*64表示像素點個數,3表示每個像素點由RGB三原色構成),將其轉換成列向量train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T # 得到訓練集輸入數據,維度為(64*64*3,209)test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T # 得到測試集輸入數據,維度為(64*64*3,50)# RGB的取值為(0,255),需要將數據進行居中和標準化,將數據集的每一行除以255(一般是將每一行數據除以該行數據的平均值)train_set_x = train_set_x_flatten / 255test_set_x = test_set_x_flatten / 255return train_set_x, train_set_y, test_set_x, test_set_y

2.模型的封裝

??我將邏輯回歸封裝成類 SimpleLogistic ,主要包括一下幾個部分:初始化,sigmoid函數,前向傳播和反向傳播計算梯度,參數優化,結果預測和主控模型。
初始化:輸入向量維度,迭代次數,學習率,權重矩陣和偏移量。

def __init__(self, dim, learning_rate, num_iterations):"""初始化邏輯回歸模型:param dim: 輸入向量的維度:param learning_rate: 梯度下降的學習率:param num_iterations: 梯度下降迭代次數"""self.dim = dimself.learning_rate = learning_rateself.num_iterations = num_iterationsself.w = np.zeros(shape=(self.dim, 1))self.b = 0

sigmoid 函數:

def sigmoid(self, z):""":param z: 任何大小的標量或數組:return: sigmoid(z)"""return 1 / (1 + np.exp(-z))

計算前向傳播和反向傳播并計算梯度(propagate):

def propagate(self, X, Y):"""實現前向和后向傳播的成本函數及其梯度:param X:矩陣類型為(num_px * num_px * 3,訓練數量):param Y:真正的“標簽”矢量(如果非貓則為0,如果是貓則為1),矩陣維度為(1,訓練數據數量):return:grads -梯度計算結果cost -損失函數的結果"""m = X.shape[1]# 正向傳播A = self.sigmoid(np.dot(self.w.T, X) + self.b)cost = (-1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A)))# 反向傳播dw = (1 / m) * np.dot(X, (A - Y).T)db = (1 / m) * np.sum(A - Y)assert (dw.shape == self.w.shape)assert (isinstance(db, float) or isinstance(db, int))cost = np.squeeze(cost)assert (cost.shape == ())grads = {"dw": dw,"db": db}return grads, cost

優化參數(optimize):主要根據迭代次數和學習率,進行梯度下降,來對w和b的值進行更新

def optimize(self, X, Y, print_cost=False):"""通過梯度下降算法來優化w和b:param X:維度為(num_px * num_px * 3,訓練數據的數量)的數組。:param Y:真正的“標簽”矢量(如果非貓則為0,如果是貓則為1),矩陣維度為(1,訓練數據的數量):param print_cost:每一百步打印損失值:return:"""costs = []for i in range(self.num_iterations):grads, cost = self.propagate(X, Y)dw = grads["dw"]db = grads["db"]self.w = self.w - self.learning_rate * dwself.b = self.b - self.learning_rate * dbif i % 100 == 0:costs.append(cost)if print_cost and (i % 100 == 0):print("迭代的次數: %i , 誤差值: %f" % (i, cost))grads = {"dw": dw,"db": db}return grads, costs

結果預測(predict):當optimize完成后,我們可以根據優化后的參數來對圖片進行分類。

def predict(self, X):"""使用學習邏輯回歸參數logistic (w,b)預測標簽是0還是1:param X:維度為(num_px * num_px * 3,訓練數據的數量)的數據:return: Y_prediction - 包含X中所有圖片的所有預測【0 | 1】的一個numpy數組(向量)"""m = X.shape[1]Y_prediction = np.zeros((1, m))w = self.w.reshape(X.shape[0], 1)# 預測貓在圖片中的概率A = self.sigmoid(np.dot(w.T, X) + self.b)for i in range(A.shape[1]):Y_prediction[0, i] = 1 if A[0, i] > 0.5 else 0assert(A.shape == (1, m))return Y_prediction

主控模型(model):需要一個主控函數來對上述操作進行控制。

def model(self, X_train, Y_train, X_test, Y_test, print_cost=True):"""構建邏輯回歸模型:param X_train:numpy的數組,維度為(num_px * num_px * 3,m_train)的訓練集:param Y_train:numpy的數組,維度為(1,m_train)(矢量)的訓練標簽集:param X_test::param Y_test::param print_cost::return:"""assert (self.w.shape == (self.dim, 1))assert (isinstance(self.b, float) or isinstance(self.b, int))grads, costs = self.optimize(X_train, Y_train, print_cost) # 模型訓練Y_prediction_test = self.predict(X_test)Y_prediction_train = self.predict(X_train)print("訓練集準確性:", format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100), "%")print("測試集準確性:", format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100), "%")d = {"costs": costs,"Y_prediction_test": Y_prediction_test,"Y_prediciton_train": Y_prediction_train,"w": self.w,"b": self.b,"learning_rate": self.learning_rate,"num_iterations": self.num_iterations}return d

3.模型的調用

??我們通過 data_preprocess 對數據進行預處理,得到訓練集和測試集,將訓練集送到 SimpleLogistic 類中進行訓練,訓練完成后在測試集上進行測試。

if __name__ == '__main__':train_set_x, train_set_y, test_set_x, test_set_y = data_preprocess()dim = train_set_x.shape[0]learning_rate = 0.005num_iterations = 2000logistic = SimpleLogistic(dim=dim, learning_rate=learning_rate, num_iterations=num_iterations)# 初始化模型result = logistic.model(train_set_x, train_set_y, test_set_x, test_set_y)costs = np.squeeze(result['costs'])plt.plot(costs)plt.ylabel('cost')plt.xlabel('iterations (per hundreds)')plt.title("Learning rate =" + str(result["learning_rate"]))plt.show()

4.結果展示

總結

??此次作業大致分為兩個步驟:1.數據預處理:讀取數據,將其轉換成模型能處理的格式,然后將其劃分成訓練集和測試集。2.模型的搭建:設計sigmoid函數(根據numpy庫比較好實現);根據前傳播和反向傳播計算梯度(propagate);根據迭代次數和學習率,利用propagate模塊計算得到的梯度來對參數進行更新(optimize);根據optimize的結果,來對新樣本進行預測(predict);主控函數來管理這些操作的進行,讓外部僅輸入維度(維度其實也可以省略),訓練集,測試集,迭代次數和學習率即可得到一個訓練好的邏輯回歸分類器(model)。
??吳恩達老師在上課時講過,深度學習涉及到許多復雜的矩陣運算,多使用 assert 來對矩陣的維度進行監督。
??此次代碼已經放到百度網盤中,提取碼:k4ly。代碼不是很完善,請見諒。

總結

以上是生活随笔為你收集整理的吴恩达深度学习第一章第二周编程作业的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。