劍指Offer_#21_調整陣列順序使奇數位於偶數前面
一、引言
使用谷歌提供的object detection api影象識別框架,我們可以很方便地重新訓練一個預訓練模型,用於自己的具體業務。以我所使用的ssd_mobilenet_v1預訓練模型為例,訓練所需引數都在training資料夾下的ssd_mobilenet_v1_coco.config中預先配置了,只需對少量路徑引數做修改即可。
但是這種“傻瓜式”的訓練引數配置方法有很大不足。一是無法理解訓練引數背後的原理,不利於技術積累;二是一旦遇到需要優化的問題時,不知道如何調整訓練引數。例如,我使用預設配置的訓練引數對模型進行長期訓練後,發現模型始終無法收斂,loss值一直在3~5的範圍內波動,沒有繼續下降。但在沒有弄清楚訓練引數如何調整之前,我一直沒能解決該問題。
所以,我們必須弄清楚每個訓練引數的出處、含義、數值調整範圍,才能自行對訓練檔案做合理配置,從而靈活解決各類訓練問題。
本文以ssd_mobilenet_v1預訓練模型為例,詳細解釋其訓練引數的含義及調整範圍。對其它預訓練模型的訓練引數的分析方法類似,不再逐一展開。
二、正文
首先簡單解釋一下,object_detection api框架將訓練引數的配置、引數的可配置數值的宣告、引數類的定義,分開放置在不同資料夾裡。訓練引數的配置放在了training資料夾下的.config檔案中,引數的可配置數值的宣告寫在了protos資料夾下對應引數名的.proto檔案中,引數類的定義則放在了object_detection總資料夾下對應引數名的子資料夾裡或者是core資料夾裡。
.config檔案裡包含5個部分:model, train_config, train_input_reader, eval_config, eval_input_reader。以ssd_mobilenet_v1_pets.config為例,開啟該檔案,按照從上到下、從外層到內層的順序,依次解釋各訓練引數。
2.1 model{}
包含了ssd{ }。
2.1.1 ssd { }
包含了SSD演演算法使用的各類訓練引數。從2.1.2開始逐個展開解釋。
2.1.2 num_classes
分類數目。例如,我要把所有待檢測目標區分成6類,則這裡寫6。
2.1.3 box_coder、faster_rcnn_box_coder
box_coder {
faster_rcnn_box_coder {
y_scale: 10.0
x_scale: 10.0
height_scale: 5.0
width_scale: 5.0
}
}
這部分引數用於設定box編解碼的方式。可選引數值:
FasterRcnnBoxCoder faster_rcnn_box_coder = 1;
MeanStddevBoxCoder mean_stddev_box_coder = 2;
SquareBoxCoder square_box_coder = 3;
KeypointBoxCoder keypoint_box_coder = 4;
SSD演演算法借鑑了Faster-RCNN的思想,所以這裡的設定應該選faster_rcnn_box_coder。
Faster-RCNN中,bounding box的座標值可以用兩種不同的座標系表示:一種座標系以圖片左上角作為原點,我稱其為絕對座標系;另一種座標系以用於參考的anchor boxes的中心點位置作為原點,我稱其為相對座標系。
所謂box編碼就是以anchor box為參照系,將box的絕對座標值和絕對尺寸,轉換為相對於anchor box的座標值和尺寸。所謂box解碼就是將box的相對座標值和相對尺寸,轉換回絕對座標值和絕對尺寸。
在SSD演演算法中,anchor box的概念被叫做default box。box編解碼中的box,則是指預測框(predicted box,也叫做bounding box)和真實框(ground-truth box)。SSD中的box編碼,就是以default box為參照系,將predicted box和ground-truth box轉換為用相對於default box的數值來表示;SSD中的box解碼,則是將predicted box和ground-truth box轉換回用絕對座標系數值表示。
faster_rcnn_box_coder的解釋詳見box_coders資料夾下的faster_rcnn_box_coder.py。重點分析這組轉換公式即可:
ty = (y - ya) / ha
tx = (x - xa) / wa
th = log(h / ha)
tw = log(w / wa)
( x, y, w, h是待編碼box的中心點座標值、寬、高;xa, ya, wa, ha是anchor box的中心點座標值、寬、高; tx, ty, tw, th則是編碼後的相對中心點座標值、寬、高。在轉換中用除法實現了歸一化)
此處的y_scale、x_scale、height_scale、width_scale則是對ty、tx、th、tw的放大比率。
2.1.4 matcher、argmax_matcher
matcher {
argmax_matcher {
matched_threshold: 0.5
unmatched_threshold: 0.5
ignore_thresholds: false
negatives_lower_than_unmatched: true
force_match_for_each_row: true
}
}
這部分引數用於設定default box和ground-truth box之間的匹配策略。
可選引數值:
ArgMaxMatcher argmax_matcher = 1;
BipartiteMatcher bipartite_matcher = 2;
SSD演演算法中,採用了ArgMaxMatcher策略,所以這裡選擇argmax_matcher。所謂ArgMaxMatcher策略,就是選取最大值策略。在matchers資料夾的argmax_matcher.py裡有詳細解釋。
在SSD演演算法中,用default box和ground-truth box的IOU值(一種定量的相似度)來作為閾值標準,設定了matched_threshold、unmatched_threshold兩個閾值。分為三種子情況:
(1)當IOU >= matched_threshold時:default box和ground-truth box匹配,default box記為正樣本。
(2)當IOU < unmatched_threshold時:default box和ground-truth box不匹配。引入另一個引數negatives_lower_than_unmatched。negatives_lower_than_unmatched=true時:所有不匹配default box記為負樣本;negatives_lower_than_unmatched=false時:所有不匹配default box被忽略。
(3)當matched_threshold >IOU >= matched_threshold時:記為中間態,並引入另一個引數negatives_lower_than_unmatched。negatives_lower_than_unmatched=true時:所有中間態default box被忽略;negatives_lower_than_unmatched=false時:所有中間態default box被記為負樣本。上述引數例中兩個閾值都是0.5,故沒有中間態。
ignore_thresholds: 沒有找到具體解釋。應該是顯式地指定是否單獨設定ignore閾值。
force_match_for_each_row:設定為true,以確保每個ground-truth box都至少有一個default box與之對應,防止有些ground-truth沒有default box對應。否則,這些ground-truth box最後將沒有bounding box迴歸對應,也就是產生了漏檢。
在SSD演演算法中,將所有ground-truth box按行排列、將所有default box按列排列,形成一個矩陣。矩陣的每一格記錄ground-truth box和default box的匹配結果。匹配分兩步:
(1)對每行的ground-truth box,採用ArgMax策略,選擇與它的IOU最大的default box進行匹配;
(2)對剩餘的每一個沒有匹配到ground-truth box的default box,選擇所有與它的IOU大於match threshold的ground-truth box進行匹配。
這樣,每個ground-truth box至少有一個default box與它匹配。
2.1.5 similarity_calculator、iou_similarity
similarity_calculator {
iou_similarity {
}
}
這個引數選擇使用何種相似度計算標準。在匹配過程中,用default box和ground-truth box的相似度來判斷二者是否匹配。在2.1.4小節中,已經解釋了SSD演演算法是採用IOU值來定量衡量相似度的,故這裡選擇數值iou_similarity。
2.1.6 anchor_generator、ssd_anchor_generator
anchor_generator {
ssd_anchor_generator {
num_layers: 6
min_scale: 0.2
max_scale: 0.95
aspect_ratios: 1.0
aspect_ratios: 2.0
aspect_ratios: 0.5
aspect_ratios: 3.0
aspect_ratios: 0.3333
}
}
這部分選擇anchor box的生成器(一組生成公式),配置了生成器所需的部分引數。
Anchor box的生成器可以有如下選擇:
GridAnchorGenerator grid_anchor_generator = 1;
SsdAnchorGenerator ssd_anchor_generator = 2;
MultiscaleAnchorGenerator multiscale_anchor_generator = 3;
ssd_anchor_generator這部分設定了生成default box所需的一些引數。詳細解釋可參考SSD的論文。這裡只解釋一下各引數的基本含義。
num_layers: 數值為6,代表提取特徵用的6個層。SSD演演算法借鑑了特徵金字塔的思想,從6個feature map層同步提取特徵。
min_scale和max_scale:我目前的理解是:scale是同層的default boxes中的小正方形寬相對於resize的輸入影象寬的比率。在SSD論文中,min_scale是指該比率在最低層feature map的值,max_scale是指該比率在最高層feature map的值。至於中間4層feature map上的比率值,論文中是以線性插值的方式來獲得的(但參考程式碼中不是這樣確定各層比率的)。
aspect_ratios:指定了同一個feature map層上的default box的寬長比。例如,這裡aspect ratios指定了5種寬長比,利用圖1的公式(Sk: scale*resize width; ar: aspect_ratios)可以計算出6種不同寬長的default boxes(包括2種正方形、4種長方形)。注意:某些feature map層不使用3和1/3這一對aspect_ratios,故只生成4個default boxes。詳細解釋可參考SSD的論文。
圖1——default box寬長計算公式
2.1.7 image_resizer、fixed_shape_resizer
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
這部分引數設定了對輸入影象的resize策略。可選引數:
KeepAspectRatioResizer keep_aspect_ratio_resizer = 1;
FixedShapeResizer fixed_shape_resizer = 2;
傳統SSD300模型中,輸入影象被統一resize為300*300。故這裡選擇fixed_shape_resizer,且height和width均設定為300。
2.1.8 box_predictor
box_predictor {
convolutional_box_predictor {
min_depth: 0
max_depth: 0
num_layers_before_predictor: 0
use_dropout: false
dropout_keep_probability: 0.8
kernel_size: 1
box_code_size: 4
apply_sigmoid_to_scores: false
conv_hyperparams {
activation: RELU_6,
regularizer {
l2_regularizer {
weight: 0.00004
}
}
initializer {
truncated_normal_initializer {
stddev: 0.03
mean: 0.0
}
}
batch_norm {
train: true,
scale: true,
center: true,
decay: 0.9997,
epsilon: 0.001,
}
}
}
}
這部分設定了預測器相關層的引數。
關於Box predictor的解釋詳見core資料夾下的box_predictor.py。Box predictors輸入高層的feature map,輸出兩類預測:(1)編碼後的predicted box的相對位置;(2)predicted box裡的物體類別。
Box predictor的可選引數範圍:
ConvolutionalBoxPredictor convolutional_box_predictor = 1;
MaskRCNNBoxPredictor mask_rcnn_box_predictor = 2;
RfcnBoxPredictor rfcn_box_predictor = 3;
WeightSharedConvolutionalBoxPredictorweight_shared_convolutional_box_predictor = 4;
這些引數值的具體定義詳見predictors資料夾。這裡選用了convolutional_box_predictor,其含義是在所有feature maps後額外增加一箇中間1x1卷積層。選擇原因不明。
關於convolutional_box_predictor{ }內的許多引數的含義及數值範圍,詳見protos資料夾下的box_predictor.proto檔案。下面逐個簡單說明一下。
min_depth和max_depth:在位置迴歸和類別檢測之前額外插入的feature map層深度的最小值和最大值。當max_depth=0時,表示在位置迴歸和類別檢測之前,額外插入的feature map層數=0。
num_layers_before_predictor:在檢測器之前的額外convolutional層的層數。
use_dropout:對class prediction是否使用dropout來防止過擬合。
dropout_keep_probability:如果使用了dropout,dropout的數值保留概率。
kernel_size:最後的卷積核的尺寸。
box_code_size:我的理解是box需要編碼的引數個數。SSD演演算法裡是cx, cy, w, h這4個引數需要編碼,所以box_code_size=4。
apply_sigmoid_to_scores:最後class prediction輸出時是否採用sigmoid。
conv_hyperparams{ }:卷積操作超引數的設定。詳見protos資料夾裡的hyperparams.proto。
activation:啟用函式。目前可以選擇NONE、RELU、RELU_6。這裡選擇了RELU_6。關於啟用函式的細節,請自行查閱資料。
regularizer:正則化操作。目前可以選擇l1_regularizer、l2_regularizer。這裡選擇了l2_regularizer。例子裡L2_regularizer的weight值只有0.00004,所以正則化操作對loss的影響較小。關於L1正則化、L2正則化的細節,請自行查閱資料。
Initializer{ }:隨機數初始化機制設定。可選引數如下:
TruncatedNormalInitializer truncated_normal_initializer = 1;
VarianceScalingInitializer variance_scaling_initializer = 2;
RandomNormalInitializer random_normal_initializer = 3;
這裡選擇了truncated_normal_initializer。
truncated_normal_initializer:截斷的正態分佈隨機數初始化機制。如果數值超過mean兩個stddev,則丟棄。
batch_norm{ }:關於Batch Normalization(批標準化)的一些引數設定。Batch Normalization可以強制將輸入啟用函式的數值分佈拉回標準正態分佈,以防止訓練過程中產生反向梯度消失,加速訓練收斂。批標準化中會用到兩個引數γ和β,分別定量化縮放和平移操作。細節請自行參閱相關資料。這裡解釋一下batch_norm的一些引數::
train:true——如果為true,則在訓練過程中batch norm變數的值會更新,也就是得到了訓練。如果為false,則在訓練過程中batch norm變數的值不會更新。
scale: true——如果為true,則乘以γ;如果為false,則不使用γ。
center: true——如果為true,則加上β的偏移量;如果為false,則忽略β。
decay: 0.9997——衰減率。作用存疑。
epsilon: 0.001——新增到方差的小浮點數,以避免除以零。
2.1.9feature_extractor
feature_extractor {
type: 'ssd_mobilenet_v1'
min_depth: 16
depth_multiplier: 1.0
conv_hyperparams {
activation: RELU_6,
regularizer {
l2_regularizer {
weight: 0.00004
}
}
initializer {
truncated_normal_initializer {
stddev: 0.03
mean: 0.0
}
}
batch_norm {
train: true,
scale: true,
center: true,
decay: 0.9997,
epsilon: 0.001,
}
}
}
這部分設定了特徵提取器相關層的引數。
不同模型的feature extractor的基類定義,詳見meta_architectures資料夾下的對應檔案。例如SSD模型的SSDFeatureExtractor基類,定義在meta_architectures資料夾下的ssd_meta_arch.py檔案裡。
不同預訓練模型的feature extractor的類定義,詳見models資料夾下的對應檔案。例如ssd_mobilenet_v1預訓練模型的feature extractor類,定義在models資料夾下的
ssd_mobilenet_v1_feature_extractor.py檔案裡。
models資料夾下的feature extractor類,是meta_architectures資料夾下的feature extractor基類的子類。
下面解釋一下相關引數。
type:例子中使用了預訓練模型ssd_moiblenet_v1的feature_extractor,所以這裡填寫'ssd_mobilenet_v1'。
min_depth:最小的特徵提取器的深度。這裡填16。原因不明。
depth_multiplier:是施加在每個input通道上的卷積核的數目。用於計算深度卷積分離後的輸出通道總數。這裡是一個浮點數。
conv_hyperparams超引數的含義和配置同2.1.8小節,不再重複解釋。
2.1.10 loss
loss {
classification_loss {
weighted_sigmoid {
}
}
localization_loss {
weighted_smooth_l1 {
}
}
hard_example_miner {
num_hard_examples: 3000
iou_threshold: 0.99
loss_type: CLASSIFICATION
max_negatives_per_positive: 3
min_negatives_per_image: 0
}
classification_weight: 1.0
localization_weight: 1.0
}
這部分設定了損失函式loss相關的引數。
loss{ }可選引數:
// Localization loss to use.
optional LocalizationLoss localization_loss = 1;
// Classification loss to use.
optional ClassificationLoss classification_loss = 2;
// If not left to default, applies hard example mining.
optional HardExampleMiner hard_example_miner = 3;
// Classification loss weight.
optional float classification_weight = 4 [default=1.0];
// Localization loss weight.
optional float localization_weight = 5 [default=1.0];
// If not left to default, applies random example sampling.
optional RandomExampleSampler random_example_sampler = 6;
SSD演演算法的loss分為目標分類損失函式(classification loss)和目標位置損失函式(localization loss),loss公式詳見SSD論文。SSD演演算法也使用了某種難樣本挖掘策略用於平衡正負樣本比例。所以這裡設定了classification_loss、localization_loss、hard_example_miner、classification_weight、localization_weight這5個引數。
下面解釋一下這5個引數的具體配置。
classification_loss:可選引數:
WeightedSigmoidClassificationLoss weighted_sigmoid = 1;
WeightedSoftmaxClassificationLoss weighted_softmax = 2;
WeightedSoftmaxClassificationAgainstLogitsLoss weighted_logits_softmax = 5;
BootstrappedSigmoidClassificationLoss bootstrapped_sigmoid = 3;
SigmoidFocalClassificationLoss weighted_sigmoid_focal = 4;
定義了分類輸出的啟用函式。具體含義請自行查閱資料。這裡的設定和前面Box predictor部分的apply_sigmoid_to_scores設定是否有衝突,暫時沒能確認。
localization_loss:可選引數:
WeightedL2LocalizationLoss weighted_l2 = 1;
WeightedSmoothL1LocalizationLoss weighted_smooth_l1 = 2;
WeightedIOULocalizationLoss weighted_iou = 3;
定義了用於localization loss的正則化方法。具體含義請自行查閱資料。這裡的設定和前面Box predictor部分的正則化設定是否有衝突,暫時沒能確認。
hard_example_miner:難樣本挖掘策略。SSD演演算法隨機抽取一定數量的負樣本(背景位置的default boxes),按一定規則進行降序排列,選擇前k個作為訓練用負樣本,以保證訓練時的正負樣本比例接近1:3。下面解釋一下它的具體子引數含義。
num_hard_examples: 3000——難樣本數目。
iou_threshold: 0.99——在NMS(非極大抑制)階段,如果一個example的IOU值比此閾值低,則丟棄。
loss_type: CLASSIFICATION——挖掘策略是否只使用classification loss,或只使用localization loss,或都使用。可選引數:
BOTH = 0; (預設選擇?)
CLASSIFICATION = 1; (預設選擇?)
LOCALIZATION = 2;
max_negatives_per_positive: 3——每1個正樣本對應的最大負樣本數。
min_negatives_per_image: 0——如何設定存疑。我目前的理解:在圖片沒有正樣本的極端情況下,如果把這個值設定為一個正數,可以避免模型在圖片上檢測出目標來,防止了誤檢出。
classification_weight:用於配置classifiation loss在總loss中的權重。
localization_weight:用於配置localization loss在總loss中的權重。
2.1.11 normalize_loss_by_num_matches
我的理解:如果選true,則根據匹配的樣本數目歸一化總loss,也就是總loss公式中,用加權的classification loss和加權的localization loss計算出總loss後,還要再除以一個正樣本總數N。如果選false,則計算出總loss後,不用再除以正樣本總數N。
2.1.12 post_processing
post_processing {
batch_non_max_suppression {
score_threshold: 1e-8
iou_threshold: 0.6
max_detections_per_class: 100
max_total_detections: 100
}
score_converter: SIGMOID
}
這部分配置了SSD演演算法的後處理階段的引數。下面逐一解釋。
batch_non_max_suppression{ }:這部分配置了批次的NMS(非極大抑制)策略的引數。先簡單解釋下NMS策略的目的。以目標檢測為例,在最後階段,一個目標上可能有很多個bounding box,但是最終目標檢測框只有一個。因此,我們可以用NMS策略,逐次過濾掉其餘的bounding box,最終只保留一個bounding box作為結果。關於NMS演演算法請自行參閱相關資料。下面簡單解釋一下具體引數含義:
score_threshold: 1e-8——分數低於此閾值的box被過濾掉(去除非極大分數的)。
iou_threshold: 0.6——和之前選擇的box的IOU值超過此閾值的box被過濾掉(去除重疊度高的)
max_detections_per_class: 100——每個類別可保留的檢測框的最大數目。
max_total_detections: 100——所有類別可保留的檢測框的最大數目。
score_converter:檢測分數的轉換器型別選擇。可選引數:
// Input scores equals output scores.
IDENTITY = 0;
// Applies a sigmoid on input scores.
SIGMOID = 1;
// Applies a softmax on input scores.
SOFTMAX = 2;
2.2train_config{ }
訓練用引數的配置。詳見protos資料夾下的train.proto。下面解釋.config例中的引數。
2.2.1 batch_size
每個批次的訓練樣本數。一般是2的冪次方。我只有CPU資源,所以batch_size設定比較小。
2.2.2 optimizer{ }
優化器的引數配置部分。
由於優化器的配置很關鍵,所以這部分想更詳細展開一些。首先介紹一下引數的含義及可選範圍,然後分別貼兩個優化器配置的例子。
目前可選的優化器引數:
RMSPropOptimizer rms_prop_optimizer
MomentumOptimizer momentum_optimizer
AdamOptimizer adam_optimizer
關於這三種優化器的特性,可自行參閱相關資料。
rms_prop_optimizer的可選引數:
LearningRate learning_rate = 1;
float momentum_optimizer_value = 2 [default = 0.9];
float decay = 3 [default = 0.9];
float epsilon = 4 [default = 1.0];
momentum_optimizer的可選引數:
LearningRate learning_rate = 1;
float momentum_optimizer_value = 2 [default = 0.9];
adam_optimizer的可選引數:
LearningRate learning_rate = 1;
學習率learning_rate的可選引數:
ConstantLearningRate constant_learning_rate = 1;
ExponentialDecayLearningRate exponential_decay_learning_rate = 2;
ManualStepLearningRate manual_step_learning_rate = 3;
CosineDecayLearningRate cosine_decay_learning_rate = 4;
解釋如下:
constant_learning_rate:恆定學習率。恆定學習率太小則收斂很慢;太大則在極值附近震盪難以收斂。故一般不會使用。
exponential_decay_learning_rate:學習率按照指數規律衰減。下面會展開並舉例(例1)。
manual_step_learning_rate:學習率按照人工設定的step逐段變小。下面會展開並舉例(例2)。
cosine_decay_learning_rate:學習率按照噪聲線性餘弦規律衰減。
exponential_decay_learning_rate可選引數:
float initial_learning_rate [default = 0.002];
uint32 decay_steps [default = 4000000];
float decay_factor [default = 0.95];
bool staircase [default = true];
float burnin_learning_rate [default = 0.0];
uint32 burnin_steps [default = 0];
float min_learning_rate [default = 0.0];
簡單解釋如下:
initial_learning_rate:初始學習率數值。
decay_steps:衰減週期。即每隔decay_steps步衰減一次學習率。下面例1中寫的是800720步,而總的訓練步數不過才200000步,顯然decay_steps的設定偏大了,導致在整個訓練過程中,學習率實際上沒有任何指數衰減。這個設定不合理。
decay_factor:每次衰減的衰減率。
staircase:是否階梯性更新學習率,也就是每次衰減結果是向下取整還是float型。
burnin_learning_rate:採用burnin策略進行調整的學習率(初始值?)。SSD演演算法中,是否有burnin策略、buinin策略又是如何調整學習率的,目前我還不太清楚。存疑。參考:在yolov3所用的darknet中,當學習率更新次數小於burnin引數時,學習率從小到大變化;當更新次數大於burnin引數後,學習率按照配置的衰減策略從大到小變化。
burnin_steps:按照字面意思,是burnin策略的調整週期。即每隔burnin_steps步調整一次burnin_learning_rate。
min_learning_rate:最小學習率。採用衰減策略變小的學習率不能小於該值。
manual_step_learning_rate可選引數:
float initial_learning_rate = 1 [default = 0.002];
message LearningRateSchedule {
optional uint32 step = 1;
optional float learning_rate = 2 [default = 0.002];
}
repeated LearningRateSchedule schedule = 2;
optional bool warmup = 3 [default = false];
簡單解釋如下:
initial_learning_rate:初始學習率數值。
schedule:人工規劃策略。包含兩個引數:
step——當前階梯從全域性的第step步開始。
learning_rate——當前階梯的學習率。
warmup:對於全域性步數區間[0, schedule.step]之間的steps,是否採用線性插值法來確定steps對應的學習率。預設是false。
優化器還有3個獨立引數:
momentum_optimizer_value: momentum超引數。通過引入這個超引數(公式中一般記為γ),可以使得優化在梯度方向不變的維度上的更新速度變快,在梯度方向有所改變的維度上的更新速度變慢,從而加快收斂並減小震盪。
decay:衰減率。含義和出處不明。
epsilon:可能是迭代終止條件。
優化器配置例1:
優化器使用rms_prop_optimizer。
採用指數衰減策略來調整學習率。
optimizer {
rms_prop_optimizer: {
learning_rate: {
exponential_decay_learning_rate {
initial_learning_rate: 0.0001
decay_steps: 800720
decay_factor: 0.95
}
}
momentum_optimizer_value: 0.9
decay: 0.9
epsilon: 1.0
}
}
優化器配置例2:
優化器使用momentum_optimizer。
採用人工設定下降階梯的策略來調整學習率。
use_moving_average:設為false表示儲存模型引數時,不使用moving average策略。moving average(移動平均)是一種儲存模型引數的策略,會對不同迭代次數的模型的引數進行平均後再儲存。
optimizer {
momentum_optimizer: {
learning_rate: {
manual_step_learning_rate {
initial_learning_rate: 0.0002
schedule {
step: 1
learning_rate: .0002
}
schedule {
step: 900000
learning_rate: .00002
}
schedule {
step: 1200000
learning_rate: .000002
}
}
}
momentum_optimizer_value: 0.9
}
use_moving_average: false
}
2.2.3 fine_tune_checkpoint
用於設定預訓練模型的引數檔案model.ckpt的路徑。該引數檔案用於精調。當訓練開始時,匯入已預訓練好的模型引數,可以縮短訓練過程。從零開始訓練時,由於沒有預訓練模型的引數檔案,故可以遮蔽這個路徑引數。
2.2.4 from_detection_checkpoint
此引數已被廢棄,使用fine_tune_checkpoint_type替代。
fine_tune_checkpoint_type:用來確定fine tune checkpoint使用的是分類模型引數還是檢測模型引數。可選引數值:“”,“classification”,“detection”。
2.2.5 load_all_detection_checkpoint_vars
用於確定是否匯入所有和模型變數名字和大小相符的detection checkpoint變數。只在使用檢測模型時有效。
2.2.6num_steps
訓練總步數。如果設定為0,則訓練步數為無窮大。
2.2.7 data_augmentation_options
資料增強引數配置。可選引數詳見protos資料夾下的preprocessor.proto。
這個例子裡資料增強使用了兩個具體引數:
random_horizontal_flip——隨機水平翻轉。
ssd_random_crop——SSD演演算法影象隨機裁剪。
2.3 train_input_reader{ }
訓練集資料的路徑配置。可選引數詳見protos資料夾下的input_reader.proto。
2.3.1 tf_record_input_reader、input_path
訓練用tf_record格式資料集的路徑配置。
2.3.2 label_map_path
labelmap.pbtxt檔案的路徑配置。labelmap.pbtxt檔案定義了待分類目標的id號和標籤名稱之間的對映關係。
2.4eval_config{ }
測試用引數的配置。可選引數詳見protos資料夾下的eval.proto。
2.4.1 metrics_set
用於配置評估模型效能的標準。
可選引數詳見框架總目錄下eval_util.py裡的EVAL_METRICS_CLASS_DICT。目前有8種。
例子中使用的是coco_detection_metrics, 是使用coco資料集進行目標檢測時評估模型效能的標準。
2.4.2 num_examples
測試樣本數目。
2.5eval_input_reader{ }
測試集資料的路徑配置。可選引數詳見protos資料夾下的input_reader.proto。
2.5.1 tf_record_input_reader、input_path
測試用tf_record格式資料集的路徑配置。
2.5.2 label_map_path
同2.3.2節。
2.5.3 shuffle
隨機排序操作配置。如果選false,則對測試樣本不進行隨機排序操作。
2.5.4 num_readers
用於配置可並行讀入的檔案分片的數目。