yolov5 訓練完模型以後發現 對測試的識別效果不好. 那麼這個時候該怎麼辦呢?
是過擬合還是欠擬合了呢? 怎麼判斷呢?
欠擬合
機器學習中乙個重要的話題便是模型的泛化能力,泛化能力強的模型才是好模型,對於訓練好的模型,若在訓練集表現差,在測試集表現同樣會很差,這可能是欠擬合導致, 這是泛化能力太強,訓練集上和測試集上誤識別比較高.
欠擬合解決方法
最簡單的是增加資料集的正樣本數, 增加主要特徵的樣本數量
增加訓練次數. 有可能是你還沒有訓練到合適的次數, 網路還沒有學習到特徵就被你停止掉了
新增其他特徵項,有時候我們模型出現欠擬合的時候是因為特徵項不夠導致的,可以新增其他特徵項來很好地解決。例如,「組合」、「泛化」、「相關性」三類特徵是特徵新增的重要手段,無論在什麼場景,都可以照葫蘆畫瓢,總會得到意想不到的效果。除上面的特徵之外,「上下文特徵」、「平台特徵」等等,都可以作為特徵新增的首選項。
新增多項式特徵,這個在機器學習演算法裡面用的很普遍,例如將線性模型通過新增二次項或者三次項使模型泛化能力更強。例如上面的的例子。
減少正則化引數,正則化的目的是用來防止過擬合的,但是現在模型出現了欠擬合,則需要減少正則化引數。
過擬合
若在訓練集表現非常好,在測試集表現很差,這可能是過擬合導致
例如易拉罐在訓練集上的能識別, 但是在測試集上就不能識別. 此為過擬合的表現.
過擬合解決方法
最簡單的是增加其他的特徵的樣本數, 重新訓練網路.
重新清洗資料,導致過擬合的乙個原因也有可能是資料不純導致的,如果出現了過擬合就需要我們重新清洗資料。
增大資料的訓練量,還有乙個原因就是我們用於訓練的資料量太小導致的,訓練資料佔總資料的比例過小。
採用正則化方法。正則化方法包括l0正則、l1正則和l2正則,而正則一般是在目標函式之後加上對於的範數。但是在機器學習中一般使用l2正則,下面看具體的原因。
l0範數是指向量中非0的元素的個數。l1範數是指向量中各個元素絕對值之和,也叫「稀疏規則運算元」(lasso regularization)。兩者都可以實現稀疏性,既然l0可以實現稀疏,為什麼不用l0,而要用l1呢?個人理解一是因為l0範數很難優化求解(np難問題),二是l1範數是l0範數的最優凸近似,而且它比l0範數要容易優化求解。所以大家才把目光和萬千寵愛轉於l1範數。
l2範數是指向量各元素的平方和然後求平方根。可以使得w的每個元素都很小,都接近於0,但與l1範數不同,它不會讓它等於0,而是接近於0。l2正則項起到使得引數w變小加劇的效果,但是為什麼可以防止過擬合呢?乙個通俗的理解便是:更小的引數值w意味著模型的複雜度更低,對訓練資料的擬合剛剛好(奧卡姆剃刀),不會過分擬合訓練資料,從而使得不會過擬合,以提高模型的泛化能力。還有就是看到有人說l2範數有助於處理 condition number不好的情況下矩陣求逆很困難的問題(具體這兒我也不是太理解)。
採用dropout方法。這個方法在神經網路裡面很常用。dropout方法是imagenet中提出的一種方法,通俗一點講就是dropout方法在訓練的時候讓神經元以一定的概率不工作。具體看下圖:
如上圖所示,左邊a圖是沒用用dropout方法的標準神經網路,右邊b圖是在訓練過程中使用了dropout方法的神經網路,即在訓練時候以一定的概率p來跳過一定的神經元。
經過長期的摸索和實驗. 總結出來了下面的幾個點.
目前來看, 我感覺視覺類神經網路要想能達到實用的階段, 首先要重視訓練用資料集的管理.
在討論之前我們應該要明白,目前的神經網路是怎麼工作的. 咱們不講太細如何實現的.咱講的粗一點.
目前的視覺類神經網路最主要的功能, 就是在資料集和人工給的標準答案之間建立起乙個對映模型.
這個模型是如何生成的呢? 視覺神經網路分三個階段完成此功能,
第乙個階段是提取特徵, 把拆分成不同的乙個個的小特徵.例如角點,輪廓,顏色,形狀,明亮度
第二個階段是用提取的特徵,和標準答案通過多項式公式建立起關聯關係, 不斷的調整多項式的引數最終達到**結果和識別結果一致.
而且這個模型有一定的泛化能力, 通俗的講就是可以舉一反三… 這確實是可以的, 因為它的原理是計算每個特徵的權重佔比來歸類的. 是個概率性答案. 而不是1+1=2的確定性問題… 但是能不能做到舉一反四, 舉一反五, 呢.這個目前還做不到.
既然是概率性答案 那麼就一定存在著答案不正確的可能性…也就是說識別不正確.
簡單概括一下, 資料集中一定要有知識 也就是特徵, 主要特徵的資料不能少, 也不能只有一兩個主特徵.
第乙個是 資料集中必須包含能夠體現要識別的物品的一些主要特徵. 例如,瓶子和罐子, 說到瓶子一般都是上面口小下面身子大的形狀, 你把瓶子和罐子混合著標註,
罐子 一般是上面開口大,下面身體差不多一樣大的形狀. 這兩種物品的訓練資料集就不能隨便混淆, 雖然有的時候人類也會把直通的罐子叫瓶子, 例如營養快線的瓶子開口就很大. 還有水蜜桃的罐子也有的時候叫瓶子, 但是這對於電腦來說等於增加了不確定性, 導致無法擬合. 也就是說資料集的正樣本要能突出物品的主要特徵.
第二個是資料集中表現主要特徵的不能太少,越多越容易提取到主要特徵. 盡量的各種角度都有.現在的神經網路還沒有立體三維的關聯性推導能力還只是平面性的求共同特徵,找規律.還沒有聯想,立體翻滾的能力. 特徵多才可以保證在各種情況下都能識別物品. 舉個例子, 現在神經網路識別人的效果很好, 由於資料集非常非常多的樣本都是正面或側面拍的. 即便是訓練的再怎麼好. 你讓它識別從裙底下面**的哪些. 它照樣不認識… 除非你把大量的這種加進去. 它也照樣能學會. 這叫資料集內蘊含知識.找規律.找特徵.僅此而已.
第三個是 資料集中體現乙個物品的一定不能只有乙個特徵, 應該盡可能的包含所有的特徵. 乙個物品最起碼應該有很5個以上的特徵, 才容易有很好的泛化效果, 舉個例子, 毛茸茸這個特徵,可以是什麼物品的主要特徵? 這就太多了. 可以是玩具, 貓,狗,頭髮, 羽絨服.
總結
通過冷靜的分析和思考. 可以發現, 要想學習到知識, 效果要想達到最好, 首先需要有大量的資料集而且要是比較好的資料集. 標註正確合理不要指鹿為馬. 選圖集中突出幾個主要特徵(注意是幾個). 外加幾個邊緣樣本…
上面關於資料集的的要求是純粹的靠推理就可以想明白的事情. 我想應該不用證明大家也能明白.
太少了容易欠擬合, 導致它很難識別不同的物品, 例如 王老吉飲料瓶, 把紅色也當做王老吉的重要特徵… 資料集也不能訓練的太多, 訓練的次數太多也容易過擬合.
訓練的過程就是乙個不斷試錯擬合的過程. 不斷的調整模型引數 適應結果. 它也不知道這個引數是什麼意義. 所以會得到各種亂七八糟的結果.
要想解決資料集缺少的問題, 我感覺, 弄個物品360度拍照, 作為基礎的物品**. 然後跟背景混合形成各種**, 基本上能達到很好的識別效果. 然後在加上後期我們一些真實資料的**, 基本上是可以做到效果實用的.
這裡面算力就變的很重要了… 目前來看, 每次訓練的結果是可以提高後續的訓練速度的. 後期的訓練應該會比剛開始要快, 因為引數已經都調整到位了.
後續增加物品品類也是可以的, 必須保證資料集和模型一致,每次新增的品類必須在已有品類的後面增加. 要不然會導致前面的網路重新訓練.
YOLOV5模型架構
模型架構是按照配置檔案yaml進行搭建的。不同的版本的yaml在model資料夾中,每一版本的模型分為兩個部分backbone和head。每一行代表了乙個運算單元,這裡按照yolov5結構圖可以方便理解。每一行有四個引數,引數1 代表輸入從運算單元獲得,1代表從上乙個單元獲得。引數2 代表該運算單元...
yolov3 yolov4與yolov5效能對比
yolov5s網路最小,速度最少,ap精度也最低。但如果檢測的以大目標為主,追求速度,倒也是個不錯的選擇。其他的三種網路,在此基礎上,不斷加深加寬網路,ap精度也不斷提公升,但速度的消耗也在不斷增加。目前使用下來,yolov5s的模型十幾m大小,速度很快,線上生產效果可觀,嵌入式裝置可以使用。在相同...
目標檢測 YOLOv5(八)
簡介 yolov5權重檔案 密碼 00mp 作者給的演算法效能如下圖 改編自知乎大佬的一張圖 yolov5s網路是yolov5系列中深度最小,特徵圖的寬度最小的網路。後面的3種 yolov5m yolov5l yolov5x 都是在此基礎上不斷加深,不斷加寬。1 mosaic資料增強 同yolov4...