競賽比完,代碼、模型怎麼處理?Kaggle大神:別刪,這都是寶藏

2020-12-25 澎湃新聞

選自medium

作者:Vladimir Iglovikov

機器之心編譯

機器之心編輯部

那些被遺忘的競賽項目代碼、權重可能也是一筆寶藏。

很多人可能參加過許多比賽,做過許多項目,但比賽或項目結束之後,曾經寫過的代碼、用過的模型就被丟到了一邊,甚至不久就被刪掉。

這種情況並不只存在於比賽中,在學術領域同樣存在。當學生訓練完模型、寫完論文並被學術會議接收後,該模型的 pipeline 就會被拋棄,訓練數據也隨之被刪除。這是不是有點太可惜了?

長期參加 Kaggle 比賽的 Vladimir Iglovikov 在自己的博客中指出了這個問題,並提出了一些重新利用這些資源的建議。

Vladimir Iglovikov 是一位 Kaggle Grandmaster,曾在 Kaggle 全球榜單中排名第 19,拿到過 Carvana 圖像遮蔽挑戰的冠軍(他的個人經歷參見:)。

在他看來,競賽中曾經用到的代碼、權重等資源是一筆寶貴的財富,可以幫助你鞏固技術知識、樹立個人品牌、提高就業機會。

為了解釋這些資源資源的價值,他還專門創建了一個 GitHub 項目(retinaface)來講述文本的建議。

項目連結:https://github.com/ternaus/retinaface

以下是博客的具體內容。

花 5 分鐘將代碼發布到公開的 GitHub 存儲庫

很多時候,你的代碼可能已經存到 GitHub 上了,但是是存在私人庫裡。那公開又有什麼損失呢?

某些情況下,有些代碼確實不宜公開,但你在 Kaggle 裡做的那些練手項目、解決方案和論文或許沒這個必要。

為什麼有些人不願公開呢?因為很多人認為,「所有公開發布的代碼都應該是完美的,否則就會遭到批判。」

但實際情況是,其他人根本不 care,你只管發布就行。

公開代碼是心理防線的一次重大突破,公開不完美的代碼更是一個自信、大膽的舉動。所有後續步驟也都在這一步的基礎上展開。

花 20 分鐘提升代碼可讀性

你可以通過添加語法格式化工具和檢查工具來提升 python 代碼的可讀性。

這並不困難,也並不費時。檢查工具和格式化程序不會將爛代碼變成好代碼,但其可讀性會有所提升。以下是具體步驟:

步驟 1:文件配置

將這些文件添加到存儲庫的根目錄。

setup.cfg — flake8 和 mypy 的配置。

pyproject.toml — black 的配置。

步驟 2:requirements

用以下命令安裝所需的庫:

pip install black flake8 mypy

步驟 3:black

格式化代碼的方法有 100500 多種。諸如 black 或 yapf 之類的格式化工具會按照一組預定義的規則來修改代碼。

閱讀具有一定標準的代碼庫會更加容易。當你花費幾個小時編寫代碼並需要在不同的編碼風格之間切換語境時,你的意志力會被消耗殆盡。因此,沒有充分的理由就不要這麼做。

運行以下命令將重新格式化所有的 python 文件以遵循 black 的規則。

black .

步驟 4:flake8

運行以下命令不會修改代碼,但會檢查代碼中的語法問題並將其輸出到屏幕上。然後修改這些問題。

flake8

步驟 5:mypy

Python 沒有強制性的靜態類型化,但還是建議將類型添加至函數參數並返回類型。例如:

class MyModel(nn.Module):

....

def forward(x: torch.Tensor) -> torch.Tensor:

....

return self.final(x)

你應該在代碼中添加鍵入內容。這會讓代碼讀起來更容易。你可以使用 mypy 包檢查參數和函數類型的一致性。更新代碼後,在整個存儲庫上運行 mypy:

mypy .

如果 mypy 出現問題,修復它們。

步驟 6:預提交鉤子(hook)

一直手動運行 flake8、black 和 mypy 會覺得厭倦。一個名為 pre-commit 的鉤子能夠解決這個問題。要啟用它,可以將以下文件複製到你的存儲庫中:https://github.com/ternaus/retinaface/blob/master/.pre-commit-config.yaml

你需要使用以下命令安裝 pre-commit 包。

pip install pre-commit

使用以下命令進行初始化:

pre-commit install

安裝完成後,每次提交都會經歷一組檢查。當提交中有錯誤時,檢查不會允許提交通過。這和手動運行 black、flake8 以及 mypy 的不同之處在於,它不會乞求你修復問題,而是強制要求你做這件事。因此,這種方法不會浪費你的意志力、

步驟 7:Github 操作

你已經向 pre-commit 鉤子中添加了檢查步驟,並在本地運行了這些步驟。但是你還需要第二道防線——讓 GitHub 在每個拉取請求上運行這些檢查步驟。

你要做的就是將以下文件添加到存儲庫中:https://github.com/ternaus/retinaface/blob/master/.github/workflows/ci.yml

執行以下代碼來告訴 GitHub 要檢查什麼:

- name: Install dependencies

run: |

python -m pip install --upgrade pip

pip install -r requirements.txt

pip install black flake8 mypy

- name: Run black

run:

black --check .

- name: Run flake8

run: flake8

- name: Run Mypy

run: mypy retinaface

我還建議放棄將代碼直接推送到 master 分支的做法。你可以創建一個新的分支、修改代碼、提交、放到 Github 上、創建 PR 請求,然後合併到 master。這是一項行業標準,但是在學術研究和 Kaggle 參賽者中卻不常見。如果你對這些工具不熟悉,可能需要花 20 分鐘添加它們並修復錯誤和警告。

記住這次的操作。在下個項目中,你可以在沒寫代碼之前就在第一次提交中添加這些檢查。從這個時候開始,每次小的提交都會被檢查,你每次最多只需要修復幾行代碼。這麼做開銷很小,也是一個良好的習慣。

花 20 分鐘寫一個優秀的 readme

好的 readme 有兩個作用:

對你自己而言:可能你認為你永遠都不會再用到這些代碼了,但實際上並不一定。下次用的時候你可能也記不得它的具體內容了,但 readme 可以幫到你。

對其他人而言:readme 是一個賣點。如果人們看不出該存儲庫的用途以及它所解決的問題,大家就不會使用它,你所做的所有工作都不會對他人產生積極影響。

一個機器學習庫的最低要求是說明以下問題:

用一張圖來說明任務是什麼以及如何解決,而不需要任何文字。在花了幾周解決問題之後,你可能有 100500 張圖,但你不能把他們放在 readme 裡;

數據放在哪裡;

怎樣開始訓練;

如何進行推理。

如果你需要寫 100500 個詞來描述怎樣運行訓練或者推理,那就說明你的項目存在問題了。你需要重構代碼,使它對用戶更加友好。

人們經常會問:如何提高寫代碼的能力?這便是一個鍛鍊你的機會。你可能需要重寫代碼,嘗試站在別人的角度看待你的 Readme。

這是一個很好的鍛鍊機會,它能夠讓你學會從用戶的角度看待問題。

花 20 分鐘提高模型易用性

我猜你會編寫如下代碼來加載預訓練模型權重。

model = MyFancyModel()

state_dict = torch.load(

)

model.load_state_dict(state_dict)

這樣的方法雖然有用且步驟清晰,但是它需要磁碟上的權重,並且要知道它們的位置。一個更好的解決方案是在 TensorFlow 或 Keras 上使用 torchvision 中的 torch.utils.model_zoo.load_url 函數:

from retinaface.pre_trained_models import get_model

model = get_model("resnet50_2020-07-20", max_size=2048)

用上面的代碼從 retinaface.pre_trained_models 中引入 get_modelmodel = get_model("resnet50_2020-07-20", max_size=2048)。

如果權重不在磁碟上,那就會從網絡上先下載下來再緩存到磁碟上。初始化模型,並加載權重,這對用戶來說是很友好的,也是你在 torchvision 和 timm 庫中所看到的。

步驟 1:託管預訓練模型的權重

這對我來說是最大的障礙。如果不想使用 AWS、GCP,我要把模型的權重放在哪裡?GitHub 上的 releases 是一個不錯的選擇。

每個文件的大小限制是 2Gb,對大多數深度學習模型來說夠用了。

步驟 2:編寫一個初始化模型和加載權重的函數。

我給出的示例代碼如下:

# https://github.com/ternaus/retinaface/blob/master/retinaface/pre_trained_models.py

from collections import namedtuple

from torch.utils import model_zoo

from retinaface.predict_single import Model

model = namedtuple("model", ["url", "model"])

models = {

"resnet50_2020-07-20": model(

url="https://github.com/ternaus/retinaface/releases/download/0.01/retinaface_resnet50_2020-07-20-f168fae3c.zip", # noqa: E501

model=Model,

)

}

def get_model(model_name: str, max_size: int, device: str = "cpu") -> Model:

model = models[model_name].model(max_size=max_size, device=device)

state_dict = model_zoo.load_url(models[model_name].url, progress=True, map_location="cpu")

model.load_state_dict(state_dict)

return model

在構建 Colab Notebook 和 WebApp 時會用到這個函數。

花 20 分鐘創建一個庫

這一步是為了降低你模型的入口點。

步驟 1:向 requirements.txt 中添加必要的依賴,你可以手動更新或使用如下代碼:

pip freeze > requiements.txt

步驟 2:改變存儲庫的文件結構

創建一個「主文件夾」,在我給出的示例中,這個文件夾叫「retinaface」。

將所有重要代碼都放進這個文件夾,但不要把 helper 圖像、Readme、notebook 或 test 放進去。手動操作這一步驟並更新所有的 import 會很累。PyCharm 或者類似的 IDE 會為你執行這一步驟。

這是存儲庫中構建代碼結構的常用方法。如果你想讓其更加結構化,請查看 Cookie Cutter 包。

步驟 3:添加配置文件

向根目錄中添加 setup.py,內容類似於示例文件「setup.py」中的內容。添加包的版本,在我的示例中,我將它添加到了主文件夾的 init 文件中。

步驟 4:在 PyPI 上創建一個帳戶。

步驟 5:搭建一個庫並上傳到 PyPI 上。

python setup.py sdist

python setup.py sdist upload

你的存儲庫是一個庫,每個人都可以使用如下命令安裝它:

pip install

如果你在 PyPI 上查看包的頁面,你就會看到它使用你存儲庫中的 Readme 文件來陳述項目。我們將會在 Google Colab 和 Web App 上使用這一步的功能。

花 20 分鐘創建 Google Colab notebook

將 Jupiter notebook 添加到存儲庫是一個好習慣,以展示如何初始化模型和執行推理功能。

在前兩個步驟中,我們使用了模型初始化和 pip install。接下來創建 Google Golab notebook。

現在,只需要一個瀏覽器,就會有更多的人嘗試你的模型了。別忘了在 readme 中添加 notebook 的連結,並在 PyPi 上更新版本。

花 20 分鐘創建 WebApp

許多數據科學家認為構建 web 應用程式是一個複雜的過程,需要專業知識。這種想法是正確的。一個複雜項目的 web 應用程式確實需要很多數據科學家並不具備的專業知識,但構建一個簡單的 web 應用程式來展示模型還是很容易的。

我為一個 web 應用程式創建了一個單獨的 GitHub 存儲庫。不過,你仍然可以在你的存儲庫中用你的模型來操作。這裡有一篇描述具體細節的技術博客:https://towardsdatascience.com/deploy-streamlit-on-heroku-9c87798d2088。

步驟 1:為應用程式添加代碼:

"""Streamlit web app"""

import numpy as np

import streamlit as st

from PIL import Image

from retinaface.pre_trained_models import get_model

from retinaface.utils import vis_annotations

import torch

st.set_option("deprecation.showfileUploaderEncoding", False)

@st.cache

def cached_model():

m = get_model("resnet50_2020-07-20", max_size=1048, device="cpu")

m.eval()

return m

model = cached_model()

st.title("Detect faces and key points")

uploaded_file = st.file_uploader("Choose an image...", type="jpg")

if uploaded_file is not None:

image = np.array(Image.open(uploaded_file))

st.image(image, caption="Before", use_column_width=True)

st.write("")

st.write("Detecting faces...")

with torch.no_grad():

annotations = model.predict_jsons(image)

if not annotations[0]["bbox"]:

st.write("No faces detected")

else:

visualized_image = vis_annotations(image, annotations)

st.image(visualized_image, caption="After", use_column_width=True)

步驟 2:添加配置文件

你需要添加以下文件:

setup.sh — 該文件可以直接使用,不需要更改。

Procfile — 你需要使用應用程式修改文件的路徑。

步驟 3:添加 requirements.txt 文件

步驟 4:在 herokuapp 上註冊

步驟 5:執行以下代碼:

heroku login

heroku create

git push heroku master

花 4 小時寫一篇技術博客

很多人低估了他們研究的價值。實際上你的文章很可能能夠幫助別人,並且能夠為自己的職業生涯提供更多的機會。

如果要寫機器學習方面的文章,我建議你包含以下內容:

研究問題是什麼?

你是如何解決這個問題的?

示例如下:

項目:https://www.kaggle.com/c/sp-society-camera-model-identification

博客:http://ternaus.blog/machine_learning/2018/12/05/Forensic-Deep-Learning-Kaggle-Camera-Model-Identification-Challenge.html

花時間寫篇論文,描述你在這場機器學習競賽中的解決方案

即使你的論文中沒有重大突破,它也會被發表並幫到別人。撰寫學術論文也是一項技能。你現在可能還不具備這種技能,但你可以與擅長學術寫作的人合作。

下面是我的 Google Scholar 引用情況,這幾年引用量的猛增都得益於我寫的那些總結機器學習競賽的論文。

當然,你的論文也包含在一個大包裡,這個包裡還有:

GitHub 存儲庫,裡面有整潔的代碼和良好的 readme 文件。

非機器學習人員能夠使用的庫。

允許在瀏覽器中用你的模型進行快速實驗的 Colab notebook。

吸引非技術受眾的 WebApp。

用人類語言講故事的博客文章。

有了這些之後,它就不再只是一篇論文,而是一種綜合性的策略,可以顯示你對該項目的所有權,還能幫助你與他人進行溝通。這兩者對於你的職業生涯都是至關重要的。

原文連結:https://medium.com/kaggle-blog/i-trained-a-model-what-is-next-d1ba1c560e26

如何根據任務需求搭配恰當類型的資料庫?

在AWS推出的白皮書《進入專用資料庫時代》中,介紹了8種資料庫類型:關係、鍵值、文檔、內存中、關係圖、時間序列、分類帳、領域寬列,並逐一分析了每種類型的優勢、挑戰與主要使用案例。

原標題:《競賽比完,代碼、模型怎麼處理?Kaggle大神:別刪,這都是寶藏》

閱讀原文

相關焦點

  • Kaggle創始人Goldbloom:我們是這樣做數據科學競賽的
    各路英豪在這個平臺上實戰練習、膜拜大神、打怪升級,用某個媒體人的一句話,「簡而言之,Kaggle 是玩數據、機器學習的開發者們展示功力、揚名立萬的江湖。」為什麼有這麼多的數據科學家會在Kaggle花這麼多的時間?kaggle最著名的就是競賽了,那麼具體的競賽怎麼做呢?
  • Kaggle知識點:偽標籤Pseudo Label
    在現實,標註數據少,未標註數據多;在競賽,訓練集有標註,測試集未標註;在半監督學習中偽標籤是其中的方法,具體思路如下:首先利用現有的標註數據,訓練得到一個模型;利用訓練得到的模型對無標註數據進行預測;然後將無標註數據的預測標籤和數據加入訓練集一起訓練;
  • Kaggle平臺入門(二)Titanic初試身手
    Kaggle競賽項目的全過程:了解問題背景:對競賽的背景進行了解下載數據分析數據:Explore Data Analysis數據處理和特徵工程:Data Process and FeatureEngineering模型選擇:Model Select提交結果:Submission
  • 競賽//Kaggle大數據競賽平臺
    有限參與競賽的一個例子是大師競賽,這是私人競賽,其參與人員僅限於受邀用戶,通常是大師級選手。1.Simple簡單或者說經典競賽是遵循標準Kaggle格式的競賽。在經典比賽中,用戶在接受比賽的規則後即可在比賽開始時訪問完整的數據集。
  • 獨家 | kaggle季軍新手筆記:利用fast.ai對油棕人工林圖像進行快速分類(附代碼)
    一支深度學習的新手隊如何在kaggle競賽中獲得第三名?數據集是稱為「行星」的人造衛星新近拍攝的經加注後的衛星圖像數據集,該圖像數據集具有3米的空間解析度,每幅圖像都是基於圖像中是否存在油棕種植園進行標記的(0表示沒有油棕種植園,1表示有油棕種植園)。任務是需要訓練一個模型,該模型以衛星圖像為輸入,並輸出對油棕種植園的圖像預測的概率。競賽創建者為模型開發提供了經過標記後的訓練和測試數據集。
  • 梳理十年Kaggle競賽,看自然語言處理的變遷史
    各種類型的挑戰賽(計算機視覺、語音、表格處理等等)都會在這個在線平臺發布,而自然語言處理(NLP)問題最近亦備受關注。誠然,過去幾個月裡,我們已經見證這一領域有好幾項振奮人心的創新,而目前流行的的則是transformers和預訓練語言模型。
  • 半年5戰5金:Kaggle史上最快GrandMaster是如何煉成的
    以下是本期活動的問答集錦:Q1:如何搭建 kaggle data pipeline?A1:我目前的比賽還是集中在 cv,也做過語音,還有前段時候的 PMP,都是 DL 相關的競賽。數據的 pipeline 其實是可以積累並且優化的。
  • 從零開始,教你徵戰Kaggle競賽
    不過,其中需要的知識大部分是通用的,所以你完全可以看完本文,然後嘗試其他 Kaggle 競賽或者數據科學問題,所以選擇挑戰其他競賽也沒有問題!在每個競賽的「Overview」(概覽)選項卡上,你可以看到關於比賽及其數據集的一些信息、提交有效結果的評估標準(每個競賽都略有不同),以及該競賽的 FAQ。在「Data」(數據)選項卡上,你可以看到數據的簡要說明。
  • 參賽3年,斬獲6金3銀2銅:Kaggle Grandmaster親授實戰經驗
    學新東西還得靠外部驅動,像在 kaggle 打 image,nlp,或是 moculer 這種圖形結構數據比賽的時候,不管是 github 還是 kaggle 論壇,能學習參考的代碼主要都是 pytorch,這就逼自己去學習了,但首先是得自己渴望拿個好名次。也可以用工作或者發表的動力,比如做一個 pytorch 的項目展示給同事或者學習夥伴們,反正感覺都得狠狠逼自己一回。
  • Kaggle- 一個神奇的網站
    所以一定要安利,安利,安利(重要的事情說三遍)Kaggle是一個數據建模和數據分析競賽平臺。企業和研究者可在其上發布數據,統計學者和數據挖掘專家可在其上進行競賽以產生最好的模型。這一眾包模式依賴於這一事實,即有眾多策略可以用於解決幾乎所有預測建模的問題,而研究者不可能在一開始就了解什麼方法對於特定問題是最為有效的。
  • 從零開始,教初學者如何徵戰Kaggle競賽
    不過,其中需要的知識大部分是通用的,所以你完全可以看完本文,然後嘗試其他 Kaggle 競賽或者數據科學問題,所以選擇挑戰其他競賽也沒有問題!在每個競賽的「Overview」(概覽)選項卡上,你可以看到關於比賽及其數據集的一些信息、提交有效結果的評估標準(每個競賽都略有不同),以及該競賽的 FAQ。在「Data」(數據)選項卡上,你可以看到數據的簡要說明。
  • 機器學習Kaggle入門,房價預測比賽
    兩個案例主要是展示了特徵工程的魅力,如何利用第三方庫快速的實現模型搭建。現在這篇文章,會側重介紹kaggle的實際操作」現場「,方便大家去跟著思路學習進入到kaggle的真實世界,不僅知道怎麼做模型預測,還知道數據在哪下載,在哪提交。其次,這個房價預測的比賽相比之前的兩個案例是特徵多了很多,面對特徵突然」爆炸「,本文提供簡單的處理思路。
  • Kaggle|處理大規模數據集的Tips & Tricks
    1.推薦閱讀:kaggle的riiid比賽裡關於數據處理時間空間優化的筆記 - 砍手豪的文章 - 知乎https://zhuanlan.zhihu.com
  • 教程 | Kaggle CTO Ben Hamner :機器學習的八個步驟
    現在學習機器學習和人工智慧比以往任何時候都更好。近年來,這一領域飛速發展並碩果纍纍。專家們開源了各種高質量的軟體工具和庫,新的線上資源和博文也層出不窮。機器學習帶動了產業內數十億美元的收入,催生出了空前的資源和海量的就業機會。但這也意味著如何入門機器學習讓人有點無所適從。下面是我的入門方法。
  • Kaggle 數據挖掘比賽經驗分享
    這個過程可以概括如下圖3所示,其目的是避免模型過擬合,以得到泛化能力好的模型。如果不設置 Private LB(即所有的測試數據都用於計算 Public LB),選手不斷地從 Public LB(即測試集)中獲得反饋,進而調整或篩選模型。這種情況下,測試集實際上是作為驗證集參與到模型的構建和調優中來。
  • 競賽實戰|kaggle圖像分類Doodle Recognition Challenge總結
    ,原始simplified數據集中340個共20G+的csv文件被處理成100個csv共7G+,而且每個文件裡的樣本不是屬於同一類而是隨機的,這就方便後續的數據讀取了。本節的完整代碼見我的倉庫中的sketch_entropy notebook。2.2 模型2.2.1 模型結構本次比賽我最後採用的結構是xception(完整代碼見此處),用的是pretrainedmodels庫,這個庫有主流模型的pytorch的實現,直接用就是,特別方便。
  • 幫你從頭到尾 帶打kaggle比賽,100%實戰
    最近很多學員問我,怎麼快速提高項目實戰能力?毫無疑問,打kaggle比賽做實際項目!眾所周知, Kaggle是全球頂級的比賽賽事,通過參加Kaggle比賽,可以收穫工業界數據比賽經驗。kaggle比賽不僅可以提升你的代碼能力,還能為你的簡歷賦能!也許並不是你簡歷沒有寫好,而是你的簡歷真的毫無亮點,吸引不了HR的注意!如果你有一段優秀的比賽或項目經驗放在簡歷裡,還怕收不到面試邀請嗎?
  • 含金量被質疑後,我們找Kaggle合規會聊了...
    每一年,國內外各種競賽雲集,參與者也涵蓋了高校學霸、行業大佬等各路精英,競賽平臺已然成為了數據高手雲集的「戰場」。這全球眾多比賽中,Kaggle可以說是全球認可度最高的數據科學競賽平臺了。目前Kaggle已經舉辦了356場比賽,有些競賽的獎金甚至高達百萬美元。
  • 除Kaggle外,還有哪些頂級數據科學競賽平臺
    DrivenData主要舉辦的是數據科學類競賽,通過前沿的預測模型,解決世界上最棘手問題,建立一個更美好的世界。通過舉辦數據科學競賽來發揮數據在國際發展,健康,教育,醫療等社會問題中的作用。該平臺主要專注於處理生命科學的問題,但研究領域也包括數學、物理、化學、工程、計算機科學等。參與者需要具有批判性的思維、研究力、創造力、和多學科知識的交叉來解決平臺上的實際問題。提出解決方案不僅是一次非常好的能力鍛鍊,同時也可以獲得相應的報酬。
  • Kaggle Grandmaster 的 NLP 方法
    目前,他擔任挪威 Boost.a i 的首席數據科學家,這是一家「專門研究會話人工智慧(ai)的軟體公司」,但我對 Abhishek 印象最深的地方在於他的 Kaggle 影響力。我想看看 Abhishek 的經驗,了解任何關於 kaggle 的 NLP 問題。我選擇了 Abhishek 的 kernel。