課程本身就很吸引人,而且講述的非常清晰、深入。因爲我目前正在研究深度學習方面的內容,所以對這些理論知識掌握得比較好,學習來沒有什麼壓力,但是我在實踐上還沒有過深度學習的經歷,這也是我學習這門課程的原因。目前我們進行到了目標檢測章節,記錄一下心得。
大綱
第一章:零基礎入門深度學習
學習內容
在“手寫數字識別”任務中,課程使用創新性的“橫縱式”教學法進行深度學習建模介紹 ,非常適用於初學者。
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作爲我以後深度學習編程的首選。