飛槳PaddlePaddle-百度架構師手把手帶你零基礎實踐深度學習-學習心得

課程本身就很吸引人,而且講述的非常清晰、深入。因爲我目前正在研究深度學習方面的內容,所以對這些理論知識掌握得比較好,學習來沒有什麼壓力,但是我在實踐上還沒有過深度學習的經歷,這也是我學習這門課程的原因。目前我們進行到了目標檢測章節,記錄一下心得。

大綱

課程前言
第一章:零基礎入門深度學習
第二章:一個案例喫透深度學習
第三章:深度學習實踐應用——計算機視覺
第四章:目標檢測YoloV3
第五章:深度學習實踐應用——自然語言處理
第六章:情感分類
第七章:深度學習實踐應用——推薦系統
第八章:深度學習高階導入
拓展:【AI實戰案例項目集】

學習內容

一個案例喫透深度學習

在“手寫數字識別”任務中,課程使用創新性的“橫縱式”教學法進行深度學習建模介紹 ,非常適用於初學者。

paddle的代碼也是非常簡單易懂,更簡潔,下面選取了訓練過程的代碼

# 通過with語句創建一個dygraph運行的context
# 動態圖下的一些操作需要在guard下進行
with fluid.dygraph.guard():
    model = MNIST()
    model.train()
    train_loader = paddle.batch(paddle.dataset.mnist.train(), batch_size=16)
    optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001, parameter_list=model.parameters())
    EPOCH_NUM = 10
    for epoch_id in range(EPOCH_NUM):
        for batch_id, data in enumerate(train_loader()):
            #準備數據,格式需要轉換成符合框架要求
            image_data = np.array([x[0] for x in data]).astype('float32')
            label_data = np.array([x[1] for x in data]).astype('float32').reshape(-1, 1)
            # 將數據轉爲飛槳動態圖格式
            image = fluid.dygraph.to_variable(image_data)
            label = fluid.dygraph.to_variable(label_data)
            
            #前向計算的過程
            predict = model(image)
            
            #計算損失,取一個批次樣本損失的平均值
            loss = fluid.layers.square_error_cost(predict, label)
            avg_loss = fluid.layers.mean(loss)
            
            #每訓練了1000批次的數據,打印下當前Loss的情況
            if batch_id !=0 and batch_id  % 1000 == 0:
                print("epoch: {}, batch: {}, loss is: {}".format(epoch_id, batch_id, avg_loss.numpy()))
            
            #後向傳播,更新參數的過程
            avg_loss.backward()
            optimizer.minimize(avg_loss)
            model.clear_gradients()

    # 保存模型
    fluid.save_dygraph(model.state_dict(), 'mnist')

在這個案例中,數據處理是我願意收藏下來的:


imgs, labels = train_set[0], train_set[1]
print("訓練數據集數量: ", len(imgs))
# 獲得數據集長度
imgs_length = len(imgs)
# 定義數據集每個數據的序號,根據序號讀取數據
index_list = list(range(imgs_length))
# 讀入數據時用到的批次大小
BATCHSIZE = 100

# 隨機打亂訓練數據的索引序號
random.shuffle(index_list)

# 定義數據生成器,返回批次數據
def data_generator():

    imgs_list = []
    labels_list = []
    for i in index_list:
        # 將數據處理成期望的格式,比如類型爲float32,shape爲[1, 28, 28]
        img = np.reshape(imgs[i], [1, IMG_ROWS, IMG_COLS]).astype('float32')
        label = np.reshape(labels[i], [1]).astype('float32')
        imgs_list.append(img) 
        labels_list.append(label)
        if len(imgs_list) == BATCHSIZE:
            # 獲得一個batchsize的數據,並返回
            yield np.array(imgs_list), np.array(labels_list)
            # 清空數據讀取列表
            imgs_list = []
            labels_list = []

    # 如果剩餘數據的數目小於BATCHSIZE,
    # 則剩餘數據一起構成一個大小爲len(imgs_list)的mini-batch
    if len(imgs_list) > 0:
        yield np.array(imgs_list), np.array(labels_list)
    return data_generator

接下來,課程又通過拆分數據集、將單層網絡變成多層網絡、改變損失函數、設置合適的學習率等多種方法提高識別的精度。

計算機視覺

在第二週的學習中,老師對計算機視覺、卷積神經網絡進行了講解,之後給大家講述了幾種經典的圖像分類模型,分別是LeNet, AlexNet, VGG, GoogLeNet和ResNet,並將它們應用到眼疾篩查數據集上。除了LeNet不適合大尺寸的圖像分類問題之外,其它幾個模型在此數據集上損失函數都能顯著下降,在驗證集上的預測精度在90%左右。

# 定義 LeNet 網絡結構
class LeNet(fluid.dygraph.Layer):
    def __init__(self, num_classes=1):
        super(LeNet, self).__init__()

        # 創建卷積和池化層塊,每個卷積層使用Sigmoid激活函數,後面跟着一個2x2的池化
        self.conv1 = Conv2D(num_channels=1, num_filters=6, filter_size=5, act='sigmoid')
        self.pool1 = Pool2D(pool_size=2, pool_stride=2, pool_type='max')
        self.conv2 = Conv2D(num_channels=6, num_filters=16, filter_size=5, act='sigmoid')
        self.pool2 = Pool2D(pool_size=2, pool_stride=2, pool_type='max')
        # 創建第3個卷積層
        self.conv3 = Conv2D(num_channels=16, num_filters=120, filter_size=4, act='sigmoid')
        # 創建全連接層,第一個全連接層的輸出神經元個數爲64, 第二個全連接層輸出神經元個數爲分類標籤的類別數
        self.fc1 = Linear(input_dim=120, output_dim=64, act='sigmoid')
        self.fc2 = Linear(input_dim=64, output_dim=num_classes)
    # 網絡的前向計算過程
    def forward(self, x):
        x = self.conv1(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = self.pool2(x)
        x = self.conv3(x)
        x = fluid.layers.reshape(x, [x.shape[0], -1])
        x = self.fc1(x)
        x = self.fc2(x)
        return x

paddle對網絡結構的實現也是簡潔明瞭。

接下來我們學習了目標檢測,使用YoLoV3來對AI識蟲數據集來訓練模型。在新人練習賽中,大家再次在AI識蟲數據集上,對模型進行改進,並且比賽的結果排行榜有許多大佬取得了90分以上的成績,70分以上的人數佔了絕大一部分,可見這個課程的效果還是非常好的。

感受

在這21天的學習中,我收穫了不僅是深度學習的知識,更提升了自己的代碼水平,也掌握了paddle的用法,能夠用paddle自己完成一些簡單的模型,加入課程之後,每天有按時打卡的作業,能夠幫助大家鞏固所學的內容,每週也有實踐作業,讓大家更熟練地去運用paddle來完成自己的工作。

我非常喜歡這門課程,在21天帶學活動結束後,我也會持續關注後續的自然語言處理和推薦系統課程,並且讓paddle作爲我以後深度學習編程的首選。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章