配置優化演算法和超參

2021-10-19 10:37:55 字數 2691 閱讀 2681

配置優化演算法和超參

當搭建好神經網路模型後,需要經過訓練才能用來做**。而訓練的過程就是網路模型中的引數被優化的過程,通常採用反向傳播演算法和指定的 optimizer 更新引數,本文重點介紹在 oneflow 中如何設定 optimizer 和 超參(hyperparameters) 。

文章主要內容如下:

• 用於訓練的作業函式和用於**的作業函式的配置示例;

• optimizer 及 學習策略的使用;

• 由於錯誤配置導致的常見錯誤及解決方法

可以在不了解 oneflow 設計和概念的情況下,直接採用 配置示例 部分的訓練或**配置;更詳細的說明請參考optimizer api 文件

作業函式配置的基本概念

在 識別 mnist 手寫體數字 一文中,已經了解了 oneflow.global_function 裝飾器及作業函式的概念,本文的配置,建立在此基礎上。

可以通過向該裝飾器傳遞 function_config 引數達到配置作業函式的目的。

如果對於 oneflow.global_function 還不了解,請先參閱 識別 mnist 手寫體數字 及 作業函式的定義與呼叫。

配置示例

**配置

以下**中定義了乙個用於**的作業函式:eval_job。

通過 get_eval_config() 定義了 eval_job() 的配置,並將 get_eval_config() 作為 @flow.global_function 的引數,應用到 eval_job() 函式。同時,通過設定引數 type=「predict」 來表明該作業函式用於**,這樣,oneflow 不會在這個作業函式中進行反向傳播。

def get_eval_config():

config = flow.function_config()

config.default_data_type(flow.float)

return config

@flow.global_function(type=「predict」, get_eval_config())

def eval_job() -> tp.numpy:

訓練配置

如果指定 @flow.global_function 的 type 引數為 train,就能夠得到乙個用於訓練的作業函式。

以下**中,train_job 為用於訓練的作業函式,採用預設的 function_config 配置(因此沒有向 function_config 傳參)。

因為 oneflow 會為 train 型別的作業函式進行反向傳播,因此需要在作業函式中指定 optimizer、學習率等超引數的設定:

@flow.global_function(type=「train」)

def train_job(

images: tp.numpy.placeholder((batch_size, 1, 28, 28), dtype=flow.float),

labels: tp.numpy.placeholder((batch_size,), dtype=flow.int32),

) -> tp.numpy:

with flow.scope.placement(「gpu」, 「0:0」):

logits = lenet(images, train=true)

loss = flow.nn.sparse_softmax_cross_entropy_with_logits(

labels, logits, name=「softmax_loss」

)

lr_scheduler = flow.optimizer.piecewiseconstantscheduler(, [0.1])

flow.optimizer.sgd(lr_scheduler, momentum=0).minimize(loss)

return loss

以上**中:

flow.optimizer.piecewiseconstantscheduler 設定了學習率(0.1)及學習策略(piecewiseconstantscheduler,分段縮放策略),oneflow 中還內建了其它學習策略,如:cosinescheduler、customscheduler、inversetimescheduler 等。

在 flow.optimizer.sgd(lr_scheduler, momentum=0).minimize(loss) 設定 optimizer 為 sgd,並指定優化目標為 loss。oneflow 中內建了多種 optimizer,它們分別是:sgd、adam、adamw、lazyadam、lars、rmsprop,可參閱 api 文件獲取使用方法及演算法細節。

faq• 報錯 check failed: job().job_conf().train_conf().has_model_update_conf()

如果作業函式的 type 為 「train」,但是沒有設定 optimizer 及優化目標,那麼在反向傳播時,oneflow 會因為不知道如何更新引數而報錯。解決方法:為訓練作業函式配置 optimizer並指定優化目標。

• 報錯 check failed: needbackwardop

如果作業函式的 type 為 「predict」,卻(錯誤地)配置了 optimizer 時,因為 oneflow 不會為 predict 型別的作業函式生成反向圖,所以此時 optimizer 無法拿到反向的資料。解決方法:去掉 predict 型別的作業函式中的 optimizer 相關語句。

配置優化演算法和超參

配置優化演算法和超參 當搭建好神經網路模型後,需要經過訓練才能用來做 而訓練的過程就是網路模型中的引數被優化的過程,通常採用反向傳播演算法和指定的 optimizer 更新引數,本文重點介紹在 oneflow 中如何設定optimizer和超參 hyperparameters 可以在不了解 onef...

機器學習超引數優化演算法進化史

背景 由於深度學習和傳統機器學習的超引數性質差異較大,二者的超引數優化演算法原理和偏向也不同,以下演算法整理更適用於傳統機器學習.1.先盲目地搜尋 網格搜尋 grid search,gs 和 隨機搜尋 random search,rs 2.要有繼承性地搜尋 貝葉斯優化演算法 bayesian opt...

超超超輕量人臉檢測和關鍵點識別演算法

適用於移動端或者邊緣計算的輕量人臉檢測和關鍵點檢測模型,模型僅僅1m多。主要基於retinaface結構簡化,刪除了前面幾個大特徵圖上的head,因此小目標的人臉檢測可能會有影響,在一般應用場景下影響不大。這裡速度最快的是mobilenet v2 0.1,效果如圖 最終使用mobilenet pan...