ProHoster > ΠΠ»ΠΎΠ³ > Kev tswj hwm > Quick Draw Doodle Recognition: yuav ua li cas phooj ywg nrog R, C ++ thiab neural networks
Quick Draw Doodle Recognition: yuav ua li cas phooj ywg nrog R, C ++ thiab neural networks
Hlo Habr!
Lub caij nplooj zeeg kawg, Kaggle tau tuav kev sib tw los faib cov duab kos duab, Quick Draw Doodle Recognition, uas, ntawm lwm tus, ib pab pawg ntawm R-scientists tau koom nrog: Artem Klevtsova, Philippa Manager ΠΈ Andrey Ogurtsov. Peb yuav tsis piav qhia txog kev sib tw hauv kev nthuav dav; uas twb tau ua tiav hauv kev tshaj tawm tsis ntev los no.
Lub sijhawm no nws tsis ua haujlwm nrog kev ua liaj ua teb medal, tab sis ntau qhov kev paub tseem ceeb tau txais, yog li kuv xav qhia rau cov zej zog txog ntau yam tseem ceeb tshaj plaws thiab muaj txiaj ntsig ntawm Kagle thiab hauv kev ua haujlwm txhua hnub. Ntawm cov ncauj lus tau tham txog: lub neej nyuaj yam tsis muaj OpenCV, JSON parsing (cov piv txwv no tshuaj xyuas kev koom ua ke ntawm C ++ code rau hauv cov ntawv sau lossis pob hauv R siv Rcpp), parameterization ntawm scripts thiab dockerization ntawm qhov kawg daws. Tag nrho cov cai los ntawm cov lus hauv ib daim ntawv tsim nyog rau kev ua tiav yog muaj nyob rau hauv chaw khaws cia.
1. Ua haujlwm zoo thauj cov ntaub ntawv los ntawm CSV rau hauv MonetDB database
Cov ntaub ntawv nyob rau hauv qhov kev sib tw no yog muab tsis yog nyob rau hauv daim ntawv ntawm cov duab npaj txhij, tab sis nyob rau hauv daim ntawv ntawm 340 CSV cov ntaub ntawv (ib cov ntaub ntawv rau txhua chav kawm) muaj JSONs nrog point coordinates. Los ntawm kev txuas cov ntsiab lus no nrog cov kab, peb tau txais cov duab kawg uas ntsuas 256x256 pixels. Tsis tas li ntawd rau txhua cov ntaub ntawv muaj ib daim ntawv lo qhia seb daim duab puas raug lees paub los ntawm tus neeg faib khoom siv thaum lub sijhawm sau cov ntaub ntawv, ob tsab ntawv code ntawm lub tebchaws nyob ntawm tus sau daim duab, tus cim tshwj xeeb, lub sijhawm sau. thiab ib lub npe chav kawm uas phim cov ntaub ntawv npe. Ib qho yooj yim version ntawm tus thawj cov ntaub ntawv hnyav 7.4 GB nyob rau hauv lub archive thiab kwv yees li 20 GB tom qab unpacking, tag nrho cov ntaub ntawv tom qab unpacking yuav siv sij hawm txog 240 GB. Cov koom haum tau xyuas kom meej tias ob qho tib si rov tsim cov duab kos tib yam, txhais tau tias tag nrho cov version yog redundant. Txawm li cas los xij, khaws 50 lab dluab hauv cov duab nraaj lossis hauv daim ntawv arrays tam sim ntawd suav tias tsis muaj txiaj ntsig, thiab peb tau txiav txim siab muab tag nrho cov ntaub ntawv CSV los ntawm cov ntaub ntawv khaws tseg. train_simplified.zip mus rau hauv cov ntaub ntawv nrog rau tiam tom ntej ntawm cov duab ntawm qhov yuav tsum tau loj "ntawm ya" rau txhua batch.
Ib qho kev pov thawj zoo tau raug xaiv los ua DBMS MonetDB, uas yog ib qho kev siv rau R raws li ib pob MonetDBLite. Cov pob muaj xws li ib qho embedded version ntawm tus neeg rau zaub mov database thiab tso cai rau koj tuaj tos tus neeg rau zaub mov ncaj qha los ntawm kev sib tham R thiab ua haujlwm nrog nws nyob ntawd. Tsim ib tug database thiab txuas mus rau nws yog ua nrog ib tug hais kom ua:
con <- DBI::dbConnect(drv = MonetDBLite::MonetDBLite(), Sys.getenv("DBDIR"))
Peb yuav tsum tsim ob lub rooj: ib qho rau tag nrho cov ntaub ntawv, lwm yam rau cov ntaub ntawv kev pab cuam txog cov ntaub ntawv downloaded (pab tau yog tias muaj ib yam dab tsi mus tsis ncaj ncees lawm thiab cov txheej txheem yuav tsum tau rov pib dua tom qab rub tawm ob peb cov ntaub ntawv):
Qhov kev siv no zoo li tsis zoo rau peb, txij li kev tsim cov khoom loj loj yuav siv sijhawm ntev, thiab peb tau txiav txim siab coj kom zoo dua ntawm peb cov npoj yaig los ntawm kev siv lub tsev qiv ntawv muaj zog. OpenCV. Thaum lub sijhawm ntawd tsis muaj pob khoom npaj rau R (tsis muaj tam sim no), yog li kev siv tsawg kawg ntawm cov haujlwm yuav tsum tau sau hauv C ++ nrog kev koom ua ke rau R code siv Rcpp.
Txhawm rau daws qhov teeb meem, cov pob khoom thiab cov tsev qiv ntawv hauv qab no tau siv:
xtensor rau kev ua hauj lwm nrog multidimensional arrays thiab tensors. Peb siv cov ntaub ntawv header suav nrog R pob ntawm tib lub npe. Lub tsev qiv ntawv tso cai rau koj los ua haujlwm nrog ntau qhov arrays, ob qho tib si hauv kab loj thiab kab loj.
ndjson rau parsing JSON. Lub tsev qiv ntawv no yog siv hauv xtensor cia li yog tias nws nyob hauv qhov project.
RcppThread rau kev teeb tsa ntau txoj xov ua haujlwm ntawm vector los ntawm JSON. Siv cov ntaub ntawv header muab los ntawm pob ntawv no. Los ntawm nrov dua RcppParallel Lub pob, nrog rau lwm yam, muaj ib lub voj voog ua haujlwm cuam tshuam.
Nws yog tsim nyog sau cia tias xtensor muab los ua ib tug godsend: ntxiv rau qhov tseeb tias nws muaj kev ua haujlwm dav thiab ua haujlwm siab, nws cov neeg tsim khoom tau ua kom teb tau zoo thiab teb cov lus nug tam sim thiab nthuav dav. Nrog lawv cov kev pab, nws muaj peev xwm los siv cov kev hloov pauv ntawm OpenCV matrices rau hauv xtensor tensors, nrog rau txoj hauv kev los ua ke 3-dimensional duab tensors rau hauv 4-dimensional tensor ntawm qhov tseeb dimension (batch nws tus kheej).
Raws li koj tuaj yeem pom, qhov nce nrawm tau dhau los ua qhov tseem ceeb, thiab nws tsis tuaj yeem ntes nrog C ++ code los ntawm kev sib piv R code.
3. Iterators rau unloading batch los ntawm lub database
R muaj lub koob npe zoo tsim nyog rau kev ua cov ntaub ntawv uas haum rau hauv RAM, thaum Python yog qhov muaj txiaj ntsig ntau dua los ntawm kev ua cov ntaub ntawv rov ua dua, tso cai rau koj kom yooj yim thiab ua raws li cov kev suav ua tawm (xws li siv lub cim xeeb sab nraud). Ib qho piv txwv classic thiab tseem ceeb rau peb hauv cov ntsiab lus ntawm qhov teeb meem tau piav qhia yog qhov sib sib zog nqus neural tes hauj lwm uas tau kawm los ntawm gradient qhovntsej thiaj tsis mob nrog kev kwv yees ntawm gradient ntawm txhua kauj ruam siv ib feem me me ntawm kev soj ntsuam, lossis mini-batch.
Cov kev kawm sib sib zog nqus sau hauv Python muaj cov chav kawm tshwj xeeb uas siv iterators raws li cov ntaub ntawv: rooj, duab hauv folders, binary formats, thiab lwm yam. Koj tuaj yeem siv cov kev xaiv npaj txhij lossis sau koj tus kheej rau cov haujlwm tshwj xeeb. Hauv R peb tuaj yeem ua kom zoo dua ntawm tag nrho cov yam ntxwv ntawm lub tsev qiv ntawv Python keras nrog nws ntau backends siv lub pob ntawm tib lub npe, uas nyob rau hauv lem ua hauj lwm nyob rau sab saum toj ntawm lub pob reticulate. Qhov kawg tsim nyog ib tsab xov xwm ntev ntev; nws tsis tsuas yog tso cai rau koj khiav Python code los ntawm R, tab sis kuj tso cai rau koj hloov khoom nruab nrab ntawm R thiab Python zaug, ua tiav txhua hom kev hloov pauv tsim nyog.
Peb tau tshem ntawm qhov yuav tsum tau khaws tag nrho cov ntaub ntawv hauv RAM los ntawm kev siv MonetDBLite, tag nrho cov haujlwm "neural network" yuav ua los ntawm cov cai qub hauv Python, peb tsuas yog yuav tsum tau sau ib qho iteration dua cov ntaub ntawv, txij li tsis muaj dab tsi npaj txhij. rau qhov xwm txheej zoo li no hauv R lossis Python. Muaj qhov tseem ceeb tsuas yog ob qhov yuav tsum tau ua rau nws: nws yuav tsum rov qab cov khoom siv hauv lub voj voog tsis kawg thiab txuag nws lub xeev ntawm kev rov ua dua (qhov tom kawg hauv R tau ua raws li qhov yooj yim tshaj plaws siv kaw). Yav dhau los, nws yuav tsum tau ua kom meej meej hloov R arrays rau hauv numpy arrays hauv iterator, tab sis tam sim no version ntawm pob keras nws nws tus kheej.
Tus iterator rau kev cob qhia thiab validation cov ntaub ntawv muab tau raws li nram no:
Tam sim no nws tsis yog qhov nyuaj los sau cov haujlwm thoob ntiaj teb kom tau txais ib qho ntawm cov khoom siv keras cov qauv nrog lossis tsis muaj qhov hnyav tau kawm ntawm imagenet:
Thaum siv cov duab ib-channel, tsis muaj qhov hnyav ua ntej siv. Qhov no tuaj yeem kho tau: siv cov haujlwm get_weights() tau cov qauv luj nyob rau hauv daim ntawv ntawm ib daim ntawv teev R arrays, hloov lub dimension ntawm thawj lub caij ntawm daim ntawv teev npe no (los ntawm kev noj ib tug xim channel los yog nruab nrab tag nrho peb), thiab ces thauj cov luj rov qab mus rau hauv tus qauv nrog lub functionality. set_weights(). Peb yeej tsis tau ntxiv qhov kev ua haujlwm no, vim tias nyob rau theem no nws twb paub meej tias nws muaj txiaj ntsig ntau dua los ua haujlwm nrog cov duab xim.
Peb tau ua tiav feem ntau ntawm cov kev sim siv mobilenet versions 1 thiab 2, nrog rau resnet34. Ntau cov qauv niaj hnub xws li SE-ResNeXt ua tau zoo hauv qhov kev sib tw no. Hmoov tsis zoo, peb tsis muaj kev npaj ua tiav ntawm peb qhov pov tseg, thiab peb tsis tau sau peb tus kheej (tab sis peb yuav twv yuav raug sau).
5. Parameterization ntawm scripts
Rau kev yooj yim, tag nrho cov cai rau kev pib kawm tau tsim los ua ib tsab ntawv, parameterized siv docopt ua raws li nram no:
doc <- '
Usage:
train_nn.R --help
train_nn.R --list-models
train_nn.R [options]
Options:
-h --help Show this message.
-l --list-models List available models.
-m --model=<model> Neural network model name [default: mobilenet_v2].
-b --batch-size=<size> Batch size [default: 32].
-s --scale-factor=<ratio> Scale factor [default: 0.5].
-c --color Use color lines [default: FALSE].
-d --db-dir=<path> Path to database directory [default: Sys.getenv("db_dir")].
-r --validate-ratio=<ratio> Validate sample ratio [default: 0.995].
-n --n-gpu=<number> Number of GPUs [default: 1].
'
args <- docopt::docopt(doc)
Pob docopt ua sawv cev rau kev siv http://docopt.org/ rau R. Nrog nws cov kev pab, cov ntawv sau tau pib nrog cov lus txib yooj yim xws li Rscript bin/train_nn.R -m resnet50 -c -d /home/andrey/doodle_db los yog ./bin/train_nn.R -m resnet50 -c -d /home/andrey/doodle_db, yog file train_nn.R yog executable (qhov lus txib no yuav pib kawm tus qauv resnet50 ntawm peb-xim dluab ntsuas 128x128 pixels, cov ntaub ntawv yuav tsum nyob hauv daim nplaub tshev /home/andrey/doodle_db). Koj tuaj yeem ntxiv kev kawm nrawm, hom optimizer, thiab lwm yam kev hloov kho tsis tau rau hauv daim ntawv. Nyob rau hauv tus txheej txheem ntawm kev npaj cov ntawv tshaj tawm, nws muab tawm hais tias lub architecture mobilenet_v2 los ntawm qhov tam sim no version keras hauv R siv tsis tau vim qhov kev hloov pauv tsis tau coj mus rau hauv tus account hauv R pob, peb tos kom lawv kho nws.
Txoj hauv kev no ua rau nws muaj peev xwm ua kom nrawm nrawm nrog cov qauv sib txawv piv rau kev tshaj tawm cov ntawv tshaj tawm hauv RStudio (peb nco ntsoov lub pob yog lwm txoj hauv kev. tfruns ua). Tab sis lub ntsiab kom zoo dua yog lub peev xwm los tswj tau yooj yim tshaj tawm cov ntawv sau hauv Docker lossis tsuas yog ntawm tus neeg rau zaub mov, tsis tas yuav txhim kho RStudio rau qhov no.
6. Dockerization ntawm cov ntawv sau
Peb siv Docker los xyuas kom meej qhov kev txav mus los ntawm ib puag ncig rau kev cob qhia cov qauv ntawm cov neeg koom tes thiab rau kev xa mus sai hauv huab. Koj tuaj yeem pib paub txog cov cuab yeej no, uas yog qhov txawv txav rau R programmer, nrog qhov no series ntawm kev tshaj tawm los yog video kawm.
Docker tso cai rau koj los tsim koj tus kheej cov duab los ntawm kos thiab siv lwm cov duab ua lub hauv paus tsim koj tus kheej. Thaum txheeb xyuas cov kev xaiv muaj, peb tuaj txog qhov xaus tias kev txhim kho NVIDIA, CUDA + cuDNN tsav tsheb thiab cov tsev qiv ntawv Python yog ib feem ntawm cov duab zoo nkauj, thiab peb txiav txim siab coj cov duab los ua lub hauv paus. tensorflow/tensorflow:1.12.0-gpu, ntxiv cov pob khoom tsim nyog R muaj.
Rau kev yooj yim, cov pob khoom siv tau muab tso rau hauv qhov sib txawv; feem ntau ntawm cov ntawv sau tau muab luam tawm hauv cov thawv ntim thaum sib dhos. Peb kuj tau hloov lub plhaub hais kom ua /bin/bash kom yooj yim ntawm kev siv cov ntsiab lus /etc/os-release. Qhov no zam qhov yuav tsum tau qhia meej OS version hauv cov cai.
Tsis tas li ntawd, ib tsab ntawv me me tau sau tseg uas tso cai rau koj tso lub thawv nrog ntau cov lus txib. Piv txwv li, cov no tuaj yeem yog cov ntawv sau rau kev cob qhia neural tes hauj lwm uas yav tas los muab tso rau hauv lub thawv, lossis lub plhaub hais kom debugging thiab saib xyuas kev ua haujlwm ntawm lub thawv:
Tsab ntawv los tso lub thawv
#!/bin/sh
DBDIR=${PWD}/db
LOGSDIR=${PWD}/logs
MODELDIR=${PWD}/models
DATADIR=${PWD}/data
ARGS="--runtime=nvidia --rm -v ${DBDIR}:/db -v ${LOGSDIR}:/app/logs -v ${MODELDIR}:/app/models -v ${DATADIR}:/app/data"
if [ -z "$1" ]; then
CMD="Rscript /app/train_nn.R"
elif [ "$1" = "bash" ]; then
ARGS="${ARGS} -ti"
else
CMD="Rscript /app/train_nn.R $@"
fi
docker run ${ARGS} doodles-tf ${CMD}
Yog tias tsab ntawv bash no khiav yam tsis muaj qhov txwv, tsab ntawv yuav raug hu rau hauv lub thawv train_nn.R nrog tus nqi pib; yog tias thawj qhov kev sib cav yog "bash", ces lub thawv yuav pib sib tham nrog lub plhaub hais kom ua. Hauv txhua qhov xwm txheej, cov txiaj ntsig ntawm qhov kev sib cav yog hloov pauv: CMD="Rscript /app/train_nn.R $@".
Nws yog ib qho tsim nyog sau cia tias cov ntawv teev npe nrog cov ntaub ntawv los ntawm cov ntaub ntawv thiab cov ntaub ntawv khaws tseg, nrog rau cov ntawv teev npe rau kev txuag cov qauv kev cob qhia, tau muab tso rau hauv lub thawv los ntawm tus tswv system, uas tso cai rau koj nkag mus rau cov txiaj ntsig ntawm cov ntawv sau yam tsis muaj kev cuam tshuam tsis tsim nyog.
7. Siv ntau GPUs ntawm Google Huab
Ib qho ntawm cov yam ntxwv ntawm kev sib tw yog cov ntaub ntawv nrov heev (saib daim duab npe, qiv los ntawm @Leigh.plt los ntawm ODS slack). Cov khoom loj pab tiv thaiv qhov no, thiab tom qab kev sim ntawm PC nrog 1 GPU, peb tau txiav txim siab los ua tus qauv kev cob qhia ntawm ntau GPUs hauv huab. Siv GoogleCloud (cov lus qhia zoo rau cov hauv paus) vim muaj kev xaiv loj ntawm kev teeb tsa, tus nqi tsim nyog thiab $ 300 ntxiv. Tawm ntawm kev ntshaw, kuv tau xaj 4xV100 piv txwv nrog SSD thiab ib tuj ntawm RAM, thiab qhov ntawd yog qhov yuam kev loj. Xws li lub tshuab noj nyiaj sai sai; koj tuaj yeem mus tsoo sim yam tsis muaj cov kav dej pov thawj. Rau kev kawm, nws yog qhov zoo dua los coj K80. Tab sis qhov loj ntawm RAM tuaj yeem ua ke - huab SSD tsis txaus siab rau nws qhov kev ua tau zoo, yog li cov ntaub ntawv tau pauv mus rau dev/shm.
Qhov kev txaus siab loj tshaj plaws yog cov lej cim lub luag haujlwm rau kev siv ntau GPUs. Ua ntej, tus qauv tsim los ntawm CPU siv tus saib xyuas cov ntsiab lus, ib yam li hauv Python:
Tom qab ntawd tus qauv uas tsis tau sau ua ke (qhov no yog qhov tseem ceeb) tau theej rau ib tus lej ntawm GPUs uas muaj, thiab tsuas yog tom qab ntawd nws tau muab tso ua ke:
Kev ua haujlwm qeeb hauv R tuaj yeem hloov nrog ceev ceev hauv C ++ siv pob Rcpp. Yog ntxiv rau siv RcppThread los yog RcppParallel, peb tau txais cross-platform multi-threaded siv, yog li tsis tas yuav tsum tau ua tib zoo sib piv cov cai ntawm qib R.
Pob Rcpp tuaj yeem siv yam tsis muaj kev paub loj ntawm C ++, qhov tsawg kawg nkaus yuav tsum tau piav qhia no. Header cov ntaub ntawv rau ib tug xov tooj ntawm txias C-libraries nyiam xtensor muaj nyob rau ntawm CRAN, uas yog, ib qho kev tsim kho vaj tse tau tsim rau kev siv cov haujlwm uas sib koom ua ke npaj ua haujlwm siab C ++ code rau hauv R. Ntxiv kev yooj yim yog syntax highlighting thiab zoo li qub C ++ code analyzer hauv RStudio.
docopt ua tso cai rau koj los khiav cov ntawv sau tus kheej nrog cov kev txwv. Qhov no yog qhov yooj yim rau kev siv ntawm cov chaw taws teeb server, incl. hauv qab docker. Hauv RStudio, nws tsis yooj yim los ua ntau teev ntawm kev sim nrog kev cob qhia neural tes hauj lwm, thiab txhim kho IDE ntawm tus neeg rau zaub mov nws tus kheej tsis yog ib txwm tsim nyog.
Docker xyuas kom meej cov code portability thiab reproducibility ntawm cov kev tshwm sim ntawm developers nrog txawv versions ntawm lub OS thiab cov tsev qiv ntawv, raws li zoo raws li yooj yim ntawm kev tua ntawm servers. Koj tuaj yeem tso tag nrho cov raj xa dej nrog ib qho lus txib xwb.
Google Cloud yog ib txoj hauv kev siv nyiaj txiag rau kev sim ntawm cov khoom kim heev, tab sis koj yuav tsum xaiv cov kev teeb tsa kom zoo.
Kev ntsuas qhov ceev ntawm tus kheej cov lej tawg yog qhov tseem ceeb, tshwj xeeb tshaj yog thaum sib txuas R thiab C ++, thiab nrog pob raug tshem tawm - kuj yooj yim heev.
Zuag qhia tag nrho qhov kev paub no tau txais txiaj ntsig zoo heev thiab peb txuas ntxiv ua haujlwm los daws qee qhov teeb meem uas tau hais tseg.