文字分類 資料增強 模型微調

2021-10-03 05:49:55 字數 2656 閱讀 3414

目錄

文字分類

影象增廣

微調(遷移學習)

文字分類

影象增廣

大規模資料集是成功應用深度神經網路的前提。影象增廣(image augmentation)技術通過對訓練影象做一系列隨機改變,來產生相似但又不同的訓練樣本,從而擴大訓練資料集的規模。影象增廣的另一種解釋是,隨機改變訓練樣本可以降低模型對某些屬性的依賴,從而提高模型的泛化能力。例如,我們可以對影象進行不同方式的裁剪,使感興趣的物體出現在不同位置,從而減輕模型對物體出現位置的依賴性。我們也可以調整亮度、色彩等因素來降低模型對色彩的敏感度。可以說,在當年alexnet的成功中,影象增廣技術功不可沒。

定義繪圖函式show_images

def show_images(imgs, num_rows, num_cols, scale=2):

figsize = (num_cols * scale, num_rows * scale)

_, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)

for i in range(num_rows):

for j in range(num_cols):

axes[i][j].imshow(imgs[i * num_cols + j])

axes[i][j].axes.get_xaxis().set_visible(false)

axes[i][j].axes.get_yaxis().set_visible(false)

return axes

此函式可以繪製多張,數量為num_rows*num_cols,這些會被儲存在第乙個引數imgs陣列中。而axes[i][j].axes.get_xaxis().set_visible(false),axes[i[j].axes.get_yaxis().set_visible(false)分別將x軸和y軸刪除。

常用的影象增廣方法及函式詳見資料增強。

微調(遷移學習)

假設我們想從影象中識別出不同種類的椅子,然後將購買鏈結推薦給使用者。一種可能的方法是先找出100種常見的椅子,為每種椅子拍攝1,000張不同角度的影象,然後在收集到的影象資料集上訓練乙個分類模型。這個椅子資料集雖然可能比fashion-mnist資料集要龐大,但樣本數仍然不及imagenet資料集中樣本數的十分之一。這可能會導致適用於imagenet資料集的複雜模型在這個椅子資料集上過擬合。同時,因為資料量有限,最終訓練得到的模型的精度也可能達不到實用的要求。

為了應對上述問題,乙個顯而易見的解決辦法是收集更多的資料。然而,收集和標註資料會花費大量的時間和資金。例如,為了收集imagenet資料集,研究人員花費了數百萬美元的研究經費。雖然目前的資料採集成本已降低了不少,但其成本仍然不可忽略。

另外一種解決辦法是應用遷移學習(transfer learning),將從源資料集學到的知識遷移到目標資料集上。例如,雖然imagenet資料集的影象大多跟椅子無關,但在該資料集上訓練的模型可以抽取較通用的影象特徵,從而能夠幫助識別邊緣、紋理、形狀和物體組成等。這些類似的特徵對於識別椅子也可能同樣有效。

本節我們介紹遷移學習中的一種常用技術:微調(fine tuning)。如圖所示,微調由以下4步構成。

在源資料集(如imagenet資料集)上預訓練乙個神經網路模型,即源模型。

建立乙個新的神經網路模型,即目標模型。它複製了源模型上除了輸出層外的所有模型設計及其引數。我們假設這些模型引數包含了源資料集上學習到的知識,且這些知識同樣適用於目標資料集。我們還假設源模型的輸出層跟源資料集的標籤緊密相關,因此在目標模型中不予採用。

為目標模型新增乙個輸出大小為目標資料集類別個數的輸出層,並隨機初始化該層的模型引數。

在目標資料集(如椅子資料集)上訓練目標模型。我們將從頭訓練輸出層,而其餘層的引數都是基於源模型的引數微調得到的。

pretrained_net.fc = nn.linear(512, 2)

print(pretrained_net.fc)

此時,pretrained_net的fc層就被隨機初始化了,但是其他層依然儲存著預訓練得到的引數。由於是在很大的imagenet資料集上預訓練的,所以引數已經足夠好,因此一般只需使用較小的學習率來微調這些引數,而fc中的隨機初始化引數一般需要更大的學習率從頭訓練。pytorch可以方便的對模型的不同部分設定不同的學習引數,我們在下面**中將fc的學習率設為已經預訓練過的部分的10倍。

output_params = list(map(id, pretrained_net.fc.parameters()))

feature_params = filter(lambda p: id§ not in output_params, pretrained_net.parameters())

lr = 0.01

optimizer = optim.sgd([,

],lr=lr, weight_decay=0.001)

setup optimizer

params = filter(lambda p: p.requires_grad, model.parameters())

optimizer = torch.optim.adam(params, lr=1e-4)

將滿足條件的引數的 requires_grad 屬性設定為false, 同時 filter 函式將模型中屬性 requires_grad = true 的引數帥選出來,傳到優化器(以adam為例)中,只有這些引數會被求導數和更新

文字分類模型 BERT模型實戰之多文字分類

作者介紹 高開遠,漫威鐵粉 吸貓重症患者,本科就讀於哈爾濱工業大學,現為上海交通大學2017級碩士研究生,研究方向 知識圖譜 chatbot,大魚ai特約作者。01 transformer模型 bert模型就是以transformer基礎上訓練出來的,所以在開始之前我們首先複習一下目前nlp領域可以...

資料探勘 文字分類(五)

首先是取名詞,我們要把名詞取出來,是因為一篇文件,名詞最能夠代表這一篇文件屬於哪一類的,其他的形容詞,副詞之類的詞語並不能很好的代表某一類文件。所以要取名詞,這個當然是用正規表示式了。我們看一下分詞結果 名詞詞性的詞分詞工具會用n表示,那麼我們就用正規表示式去匹配n就好了。根據廖老師的python教...

文字分類 libsvm

關於 libsvm 的介紹以及相關 網上很多,感興趣可以找找。這是libsvm 這裡主要是針對之前學習過的幾種特徵篩選演算法用 libsvm 進行比較。採用搜狗實驗室的資料,選擇商業類文字 1001 篇,娛樂類文字 1208 篇,測試集 29904 篇。分別採用文件頻次,卡方分布,互資訊,資訊增益來...