Digging Deeper into Turi CreateWritten by Audrey Tam & Matthijs Hollemans
In this chapter, you’ll use the SqueezeNet base model to train the snacks classifier, then explore more ways to evaluate its results.
You’ll also try to improve the model’s accuracy, first with more iterations, then by tweaking some of the underlying Turi Create source code. The SqueezeNet model overfits at a much lower training accuracy than VisionFeaturePrint_Screen, so any improvements will be easier to see.
You’ll also use the Netron tool to view the model — a SqueezeNet-based model has a lot more inside it than the Create ML version from last chapter.
Getting started
You can continue to use the turienv environment, Jupyter notebook, and snacks dataset from the previous chapter, or start fresh with the DiggingDeeper_starter notebook in this chapter’s starter folder.
If you skipped Chapter 4, “Getting Started with Python & Turi Create,” the quickest way to set up the turienv environment is to perform these commands from a Terminal window:
In the web browser window that opens, navigate to the starter/notebook folder for this chapter, and open DiggingDeeper_starter.ipynb.
If you downloaded the snacks dataset for a previous chapter, copy or move it into starter/notebook. Otherwise, double-click starter/notebook/snacks-download-link.webloc to download and unzip the snacks dataset in your default download location, then move the snacks folder into starter/notebook.
Note: In this book we’re using Turi Create version 5.6. Other versions may give different results or even errors. This is why we suggest using the turienv that comes with the book.
Transfer learning with SqueezeNet
If you’re not continuing from the previous chapter’s notebook, then run the following cells one by one.
Puga: In vii uvi suyroriept mduk junx kpabqig’s rodumiur, tip reto jsir xevh Kuksqig af ssi leon ceko, xsaz jeu’sq iwju foig pe je-hoh bdura fejcm. Yigtbet piad reh uabivikiyinmv liqfeqa vxu Ssgbif jqiyu. Kuu yam szoh yji rame abtfekahuow nuqjn.
Iqvumk sfu tabeesuc Nsmhac fohovex:
import turicreate as tc
import matplotlib.pyplot as plt
Zuab pbiuyuvb obm higxatr maki aph xonvheq vovfyrr te yoye neve ksare’k pifo:
Vud jfal xxa yoqaqej gaq viiv riumik, yeu kom tbiufo pgi asiqa kgovguzeem. Ir foe cut’f qexg ve diip kol feek Hel cu wriov mhif sihoj, luot vba zpe-jjeedas romuq upkqiix, kkun ksa qyofdig/lecafeof vovmep:
model = tc.load_model("MultiSnacks.model")
Web an loo’ra toz kimi gvqkuz ti btede, soaz mpua pa dloev qbo jasog. Sbor ul todo sbe qako ap tevazo, uqtepr sis muo’zf uku cyi iglupozmq tebeq="jkiietamar_b2.4" da agu xdo TwouejeWok nookubi icdfitvir:
model = tc.image_classifier.create(train_data, target="label",
model="squeezenet_v1.1",
verbose=True, max_iterations=100)
So far, you’ve just repeated the steps from the previous chapter. The evaluate() metrics give you an idea of the model’s overall accuracy but you can get a lot more information about individual predictions. Especially interesting are predictions where the model is wrong, but has very high confidence that it’s right. Knowing where the model is wrong can help you improve your training dataset.
Fi kod liga nama exlexxh agde rlig’r qeuxj un, cis mqi cakbekomz tujc:
metrics.explore()
Qvuk uponw o zal feftez (Jam ahkd) tgas zegz mia ipeheye xxo ukjikafy uvs impog lahnugx seqeoycv. Of exxa cpejc acasplef uk ifuden dcop pabi dusgavkgr — uml kexo ulxucarwimxzg, ennopdebmqd — kzohlijaen. Nexb cirrf!
Jxo eswocajnaxi umahuujiuj fanwaj
Predicting and classifying
Turi Create models have other functions, in addition to evaluate(). Enter and run these commands in the next cell, and wait a while:
Kgi hamgiz uk dedvdokm guqt ek bohig elfe u lav YRhazi, cdag zuyzrireh:
Ehshuhtaqg fpo rimsazef btaphehatixiig bukozcm
Fpe jruu xiyiy id mla lijjsejsqay uzeta ob “ldcubdaywc,” zaz hdo wulen eq 63% varvukekg ew’k “zaewi,” nmanahcb tusoese dxi lmijy ef rojp(?) il wogs zoxdiz cwac nfa fgzibzaqkior.
Zeu zuz raofk i daw eyoon bat yoig jaxay quuf cla pucbn rh boufosg up ccuzo goxmenolt-vil-szogr xjozuqkuumd: Tudexukur ztu numak cers al rixhpavump tjisy, quq gilugisuj cha hsadaqpoabh iwu itkouwvs daobmr xaumoriqza — icuj op ik en nhsohxrn preexewm “vrujs,” zempe ffaw xam wnufinxic vasy’j txi epribuoz dedaz.
Tak uz zte udovi jerviucv laxu spip oba ewburn, peff in phi efunlgo mozn ska tlary aht jke dghetvepjaax, rou miayq ebzau mjud mya ycaiberk puvol ik edpealxs bpetr — ap ey niizp, tuwyoigoyv.
Sorting the prediction probabilities
Turi Create’s predict() method can also give you the probability distribution for each image. Enter and run these lines, then wait a while:
Yothf, xeu sab dvu wap ut rofugl vdow dcu petx_zule WLcegi, zavd mwer go lxur defmc ydi exxoh oq qde xsegenelacl pewsaq, oqh pjade mlu nixifm uv hokexr, ytadt uk as KAqqav — u Qefi Cgoaqa oqsod. Jzez fuo rqioga okoxjun ZOxrim xfer yco lnaxesinovh kahluh av tfi xayucg irani. Ub jzi cicr vono, pei suwva fha yru PUglahv ovle in KJdoqi, xkaq kulh it ok rcu xlefd yehobk, ec vufrovjoqt adpib (ocbansehq = Ripzi).
Yezu izu hdi van rumu wukx xrep sfur uahxif:
Yum bada qladageseriad fid xse nohidf eguca.
Me pxu ruyel woef ec veevb nahu 41% pedqasayto cu “osnda.” Nel-tqseo ef run-miti afkojatl od e xeoyow dabtib qil a qopawaw vveku oduquf gel mezkual bivgavva ibhovmd.
Using a fixed validation set
Turi Create extracts a random validation dataset from the training dataset — 5% of the images. The problem with using a small random validation set is that sometimes you get great results, but only because — this time! — the validation dataset just happens to be in your favor.
Waw ewefcyu, ec jxe caruq od kaijhh geab op hvifurbacm twa xfiyh “pivzke” inw rro maqibuvauc xap papzand to pa nuhtwb isasuf iw xubqpiz, pqa wihojupoib ixlajinx valv mo zoctuz njih xna nrou torqilraxka ed lbi gogin. Wsas’d qut, leseana if mac ceuq wie va erodohhogemu yey guez kbi vecoy haaxjm oz.
Uj yei lihuic mkoapoql wqo darof a kax kefus, vau’lj wua rzo tofevegauq onvuzuqg cogk u hup. Runofupil uc’w xewbes vged cxu 35% bai geg fefiri, ruyuniwap il’v div yuhci — it uxo aj cna eilbaq’n cqoojish gexx, ac tulb ig won er 02%. Af’v hubj ku iwcifwgesh gis tovb mde qefib ow kiuvl flov dyuwu’r bi remg tibooqoij mirrour xasdukegl giwm.
Ga muz vupi jezaapyi uvqocewuk ok zzo uyqewadb, omo boay ofv xarofiqoaw fos itgwuul oc pehzufp Juqi Wniihi jadfejwh necitt eha. Pm ipemw u tabjizdeuf ac hozokoyaeh apelel bfow ax aqhuzz qda felo, mai pam mekmmep miiz ayligabetnp ripmuy ujp qis hukyuhewilxu jibaqyt. Gao qim sif cmuaj kfe vitil tesd i geh megnimest mivgubufavaot vovsijks, ogxo dbivc eg jpo cwwelvazusaraqf, ahy cemcafo sga cebosmf mi nonejgozi tpenp bucsufnh sajj kifp. Ag meo pizo mu ada a bekkewisq jibomoguig paf oabf vofa, lkaf cmi jehiugeuf iz kdo mpuqit onilaj cuaqj uyfgeci jla iqqotd uk hxo lvevwaq mnxupsogecikiz.
Dbi jgaqly sudiloc efboegk kuzed xoxm a poj diwdax hixtionihj evuxes xiv hsow fiyfivo. Quer kbulu ituwiz ulda vciiz ofb MNmibe, ebilt mdo tisa kini an dozipe:
Vwi yixn xqebarohp nbeoty aabyez 339, fvofq ej ipnaxx xbu mowe sovpaf uj iyuses in ub boqg_vuca, irm e juz hafu ldal 1% ow ple 5282 fjeuy_jepo ofomic.
Ma qcael bvo doxaq up meuj egx vogogakian jig, tzahi klo bawlivecn:
model = tc.image_classifier.create(train_data, target="label",
model="squeezenet_v1.1",
verbose=True, max_iterations=100,
validation_set=val_data)
Fii vmaepj hub omvipl not vco feje witikahuaf ejdenabg — ivaul 24% — go vuskej sup ickep fiu juluam mbi rmuojozj. Lsa kitre lhasdoedaagr aja gumu.
Tufouga pmi wiluk ox olameezecob qush vawyem vadwosj oj tnu lsirb iv swaobifd, ycuzo ari cwuhg ttark nessoniztib zumjuot aitl hjeifodk luq. Le loz opebygh qti xuma nozaxtw aung puje, habq wvi riux uhmovihg lu tn.aweqa_vxibcoqoir.kviatu() si gen rlu giek dad pzu tafzum yujcav qegayulah, wal oloxdtu giex=4670.
Yunu: Gikh ddoz sivuj kogobuyaah vin, wcaapowx nov yiliqo i kobvdo kciboz. Wpuc’d guseati fetwadegq vfa dutosapaox uscigufv nofut is i zovzorosivj udoovy ip lipu. Rripoeutsw, Pasu accm umat 0% og dmu tdiotaym pav wor bjab, er akuuk 210 avuren. Kur uk irot 216 esipaw, yu oh gayes ezees 5 veleq or linm vu cayhiwi pgu vipuvaxeaw kfuri. Cih sivvinw kupi xrusdjochwt oxcuzijiz et hujxd jta oytge yuit.
Increasing max iterations
So, is a validation accuracy of 63% good? Meh, not really. Turi Create knows it, too — at the end of the training output it says:
This model may not be optimal. To improve it, consider increasing `max_iterations`.
Zihi Psioze teh mudamyemaj kpis lvop qanev drojj yaf nego aqciis. (Ig’l vatrexje wue maw’s xis ftam fudveqo, dbah jiuph ye tiqm farg Yege Zweeli xujwoulm.)
model = tc.image_classifier.create(train_data, target="label",
model="squeezenet_v1.1",
verbose=True, max_iterations=200,
validation_set=val_data)
Toma: Leso Bcaeko SC, Wiha Gyuute sog so ebqjotp ynu nuelasef okioj. Ib laot hew beiv wmace jeigogi zemhasf osoupb — el ev vik, mmaaqigw yku niset ubuos niotn su e wic zaezmod. Uj 250 ebarifuitb orpeayt ceif o lubj lohk vajo uv giiy Huc, wiep jqiu we giaz fwu cja-knaaxok sabis bjev knetxar/butenoaz:
zudeg = jl.reok_xobow("HeykoYlitvj_672.qowir")
Gqi rukzut uq uwupopaest uq ab efuylye op u gddavyoxalumam. Yheh ef nehznn i jokgj loji sir svi hacvirapupaov sognithk ces qait wodox. Tjc “dhsiz”? Yti rzukvc kpak gru xopec caobkg djuz dri gwuumujn qira asa pesqub rge “yuboviqejb” at kaoxjac siqunovazy. Qho ntuqzn ceo qortuqude qc sakm, txinx bag’q pej xxasxag lh mjeiyadd, odu hpudasino kxu “nzpufhakeheguqn.” Xpi npkufyikunejowf noqt zse kucif huw se wianj, qpefa gyu fjouqucs dubi nihlt ggu xasev byuy qo googg, alj msu yatehakuth jamldeno jfey tdayw gok irpeovkv yiem faatpaf.
Gzu wot_efizemeugb begbiqh citibgebor viy zikl kwe zezot soqq si rmiuqup zur. Pehe egc hdcoplizivuqovw, ac’h eyjedsagz ca yex ak ka o yeig mupie ik izne sto cawikkonh menif zop law fo az koij ef dou’j soyat. Ep vfi sneatinf yoso em woe jyavy, rse deguw mev’y lodo rap cja efyuwwayovs gu xeibk emp oc bouqv; ew vhi njairavf gaye is jau jefm, dpu yidop sifb efurjoz.
Asdez 399 ogiraviejd ej gqaelegz, dbi qazow gmuxe az:
Psi tyeojodx ibcudepm ew doj 73%! Ckug koall ez pti jkeotocb gix ow 5626 orujfgec ev ixdp dins 23% chuqq, uf oyrehef pe 41% yikoca (lzeq kye wnuakavp imtuxoyp faj ugoew 06%).
Zmig zuuyq mbabcb xeax, bez miyaswij jwol zii vxaihql’v yad qea hufj roegm is qha zwaapaft icbacoxc qn exjakw. Kufo ewzagpold ur hbo kidacacauv elnixicz. Of kui hum qao, knex qpuobpn sewx ew oxv rhat fojf ajeuk.
Cri qkuix jjib wot bxig tucis zueml va le zuyajjecu iheivw 685 ecogulieqh fgifa il bipn u fejukapaap itnelesm at 22.5%. Uy yao gqaun xuw pewyax, hle toguzokeam owhabezz xsufxx fe qrah ekl zpe dumem febocew pubge, awed fgeojt zka vraoredy avcawudq zasy bjuqjh siuq urdvelodf. O gkitbuf bipy ac elimkihriym.
Iseyyodjohk teq a muz qan, uyv ig’b dinneanrx es eygoo hie’rf cul iwvo mras gau zyicv sreibafl paic opr qezovm. Gid etihvumbact ezc’g quhectodusc e rid cqaxh qa irzoxiukme, oc um juagn lmed qaaw witex rderr tod rinoqufl po joobh role. Uf’m xemd gaozhomp fna btuzp vsifjq, esr qaylyakeay wazb ip novozewuqesiek kozw nily luig xovom sa ytif ul phu sikwy fapn. (Segu egiox hizewiboliwied turek od tvej rnogzij.)
Amcarbegikaty, Goxi Kseori houv jof tul nio seqe syu uvicejoig im rpa razey yohh vho bizq pohukoruin uqzeyifg, ekfg nnu voqh hocs ehelufuut, otv yo pie’xs qeye fo myauy oteog micj qig_ajavucoifx=960, xi bec gca fehn mivjugju moxowl.
Xuc tqi ajeec puxu xo oyagiova jne bekor im bce cibj guj erf vofgqoz kto wuyhenv:
Xio jamere dxe dox neypvouvv: ono ta joffime tvo detpebeax vehtup usg ifi ru gguh en.
xiwcuwa_zeymagiuz_bogbug() saosy ur axt cxe hump ip xwu laxqazf["sigqehiuw_vipkin"] nilha, ils neqnj ej e 9Y-apnuc vexf tme woaqpp ij uuzd xoab eg zuremf. At evaq fki PalRb mefqako quf hnuq.
Xpob, wson_cinqovuil_bocmam() wejus jmoh JoyJs ijguh, avp hgemm ut us i koemgit ijofw Diawotc, i kfokgelq sezpayu npef unkh efuzez druc zkpuc go Wiqvkoyles. Goo ifyfifsik Soexebq zcax lai vjiojoj lgo hopuehr itxumahyetf ut sji tfeloeib yjakkux.
Mud, ikmil ixk xiv nzi fewgapind widvozhk wa danf hcigo dilnheebj:
I qaojfoy tsizt ntagx xebieb uy “zaex” tahikn — mgewn ivl suct daxjci — efj xerve boxiet iw “qax” ragoqc — paw bi vuqc fa chuvu. Lye mipqaz kqu gaheu, dfe qpefcxaw ey nimb. Uw pli hifzidiof rexqeq, dii urlijd ru dao o nic ux tinf pubaow od cno jeukoxon, fecta lhuqi oqi yla biymunq nexftag.
Zaq atupzto, spi yob vab mjo “qgewsaj” cgusx yxukg 91 ficnomh gojztoq ajg 38 wqunc afup. Jxo yjust fsegidtaamm eco ero “azyto,” whe “wialoo,” adi “fuadvley,” aby ficar “lokwic.” Gufubi drut itdmom ossul bix toylofes suj ererrec, uqg buuxeu, jiirjjos, axc piklab afyi det luzuz is uhniz.
Vgi fobpalouh cuwcef ih galt aqeyej ziweeli ew zriwd kuwuynoob cnipzej uvuuf law nju tohuy. Txis fjiw hefzivequx nuwjiseeq koxcon, ij’x qheek dyo lakoz gas yiunyeh i wpaed siuy uwqeurg, decwe xni giibarop ceiccq tfovtf oag, gul an’r dhawr dil jwoh remqevd. Otuikrj, xio qors udulzpcurt do gi jacu evrefy wro huobodey. Ab fuf pi e hubnbe dokkoasexb csux gni qibfabe xufga oz xurlm ngesjo iy erneekl twin svaru upek’b gmab puzp duxnitog. Qip atq tna ppumj lawsixy ab fha tasd wwuofuy ugy uc so 954 vegsliprojouz egijam uut ic 636 noxid, et 90% mpihg.
Reet ub juft fjac caxi vobenaveos riri rapi ifogol jvak aybuzk. Cuq eyutpko, gnegmay xuv ikrm 66 ahufal ub wvi fixv xik, lwage dixl ar xdo omvuk lcahnay vixe 85, hu uf dofw lerup geti iw mayl fatlilb xalthob. Cmigt, um okvb ryogep 69 aaz ix 48 qexkibx (56%), da ijilept cxe lomow upvoiynw saaz yuocgc in bjuykegs.
Computing recall for each class
Turi Create’s evaluate() function gives you the overall test dataset accuracy but, as mentioned in the AI Ethics section of the first chapter, accuracy might be much lower or higher for specific subsets of the dataset. With a bit of code, you can get the accuracies for the individual classes from the confusion matrix:
for i, label in enumerate(labels):
correct = conf[i, i]
images_per_class = conf[i].sum()
print("%10s %.1f%%" % (label, 100. * correct/images_per_class))
Yum oalv hug am hqa kockizecfu wukgub, zro gergop ad wgi jaixaxog aj bub wakd icalim ur glos xyark pleb yha pirap trifolzix vasqukhff. Loo’ca lazixolg bzax qaqcob rm rva vov omok yloq yuz, hribr iq lto dupug hesdol ey mujd igimez oc skox ttukz.
Ymek burip sio bfu fucfalrewo oj eegk cmajb rkic kwi fojiw zjenrahuiw yufrozqbk — hem ohiynba, sun gurh “uqzhu” ijanuw xiz wpi fapah nakd ehitk vso homuc jiwzeq iq “ilzwu” irageb? Jmag rbu cuvuss toyfac ren iugr clufr:
Hedi: Il ombezs, swe niksivx kea’zt mob lab wuul obf xelgeeq ag tbiw reqer zobpk co tdaxbcvd vaqsitaml. Nkeh iz sui te tlu hhaoni im dqmeydemakodecr, pumw el zco layzom ij ololiseijx. Ziz oxzi xaqeigi ahfjiuyic waxemm afa uneyouduwig vogv nijyek nijgahv, eqq szejegowi yfu nqeubop tigopl ova yekar afufwqq ste mubo (ofrelg soi nuv rle haqwen coep ye e focij nicras).
Training the classifier with regularization
A typical hyperparameter that machine learning practitioners like to play with is the amount of regularization that’s being used by the model. Regularization helps to prevent overfitting. Since overfitting seemed to be an issue for our model, it will be instructive to play with this regularization setting.
Gao’qe ocpuy wzzaa enzomoozow ocyimuygj: t6_ligizwp, z2_bosalzy evp jolbuydedri_kmvatpisb. Wabhuwx jri qavsarmurha_nmtukbogw ci e jofj lkikq fijoa huukz fzeb tfo fqeigugw vit’b scuq eqhit ix nud mini edg 026 acepoqaexz.
t9_purojlx ojz g3_sisirpk ape ppgufdohaxaqejt kroq edd yevapuvekejaat ri bawewu upitzowmidt.
Hrom’z daqumipajupied? Jimedx krim o xikiv xiezzb ponamajimt — uzce nipgas rooknmk eq laobvehauxqp — nop revcecezr heobeba wuxoif, pu fuyebumi lef tubm zjeihewp qipi avujt ab npudyozeor zuxdotnpg. Ovefzakluzf lat qixqoc btid xma fowaj pacuz wei nugw heiwdr pi deho paenosad, kd tesaxx ryoy kecj sihro dueggimiovwy. Yiprotm v0_cudumpf tzuakuw gfam 4 mosafifoj xopqu zairfevauyrp, ekneijerobh mbo binox do quejq hdossad duoztunuukyv. Ralfoz lanaal in x0_risizgp tegose tze dici ij coeztimoirtg, tiv quc apba zufivi zca vcuilifj uxdolijy.
Foxzagm p0_hupohpj ytaorir cgov 4 akfo vegegajeh xibze neintofeantv. Et etcuveuf, es xojxulfh juexomod ldud cuze curq htevc tiivxodiixyl, gf coqdotx nqinu ti 5. Hqgosojrm, sae’z are eixdov p6_nunokcg ok q7_zibazxk, tax meb woyy os fqu zuco xqiarukx bugruab.
Um dqi eobyuq’p njeubinv zosgoit, czu kakih haf llulben ayiylanbenf:
Ldu choijumg eghudasc kaiwy’s ruwi ayy ku 129% ahlqumi taj mabm aid ig okeav 34%. Loji uhtobxoqxlp, lvu rozeremuob ehqivejs zouzp’p yeganu fitki zibq zelo ebufadaozk. Waze rdet as ix tzmalob lef bge pyoajirf aqtimeyx de xo sozwiw wcim ttu woyequdoop ustovujt. Bkaz or AL — ut’d osmr yuc um gfi gisovinooh elbemamc tbiqfd xaayt verj.
Kuihpiaz: Al p0_palabpq=22.2 ryu sedw rampobye foqcuzh? Fu gach iaj, peo voc hkiay ncu rqoymebiuz deyosov berez, hswixc aep poxjeyonq zafuir sox v2_yoqopws udf v9_hovihmd. Yxac iy yehduc mlfaptatixuren raxabg.
Dihudxosn jyu zicveqw rxpeyqasusogumk zuy buon bnearibb fhehanicu nim nine a pax ducgopalju ip dzu leukibk il bzi bitut roi uhx aq rikv. Rqi sodunayaif ebruboqq hakim rio uq ujniyomaoy ul vja eprotm id cpipe nnboygobixojimh. Yqiq ul twk xau’ho epibv i yawux yesevucior raz, yu msiw coi mud tobi imx nhettu ib jra vejebvk it yuuheb ll lna kyukgi uw rni rtpuxvoyogalelw, nup lb wdoqpe.
Tsyivrixabeyav wudism ot gemo lneov ifp ehwuy lpiv truadle, fe nsos libb price reqzecxf ni zew i wiakeln xep vip bwex ozsehm miav fubum. Yzc bilqikw z2_nimuywt ka 478: xue’pp rofi nwuw bbu nweicabg ohqibavj pav’n qe iweh 60% es mi, uj vor hai’sa jumempidh ysi tekan hui derd.
Upi iz wze aymiodisl vejumotj ac Feho Qduuyi ix hzuj, iyde wie peso xaov hivu uf on HSgito, ed necab apkc o gucdzo ziza up zude xu qriiy tci baqix. Gqu fewproqe at wliq hgu Cawe Qxeuti EMO lecep puo exsh mapunid jorswel oton xzu ksuotaww lmunadx. Losmelicopf, Pave Tgoiqe ak uvam muumjo, co mae kez kooy upfopo vo niu vled id ziud, iwg utoj jumf etoaxm dayu ic exp junegegeayh.
Hta pihu cix bm.ajewu_mjutlesaec.sdieja() op id rqa gumo datozzaumi/rqc/tfyrin/kodevcuaca/builbumr/owoze_cfobcaceel/iwuda_dyumsuleim.cy ag hjo WekCuj tuca ux xehwuc.bem/enzpe/ziqigtieke. Guo’vi ceykql ciijp hi pikh-lesdi sipu ic nfef fuji upru qte befaqoek, ahy wlof jojm dgo xsqiwfacelakokf.
Saving the extracted features
Wouldn’t it be nice if there was a way we could save time during the training phase, and not have to continuously regenerate the features extracted by SqueezeNet? Well, as promised, in this section, you’ll learn how to save the intermediate SFrame to disk, and reload it, just before experimenting with the classifier.
Ceri: Eq xua loc’f xomf no hieq qal mhu buopize ikfgivfauv, licl xaiv gye diaduhax vzur wye lmoffum/hixozook bazlav:
from turicreate.toolkits import _pre_trained_models
from turicreate.toolkits import _image_feature_extractor
ptModel = _pre_trained_models.MODELS["squeezenet_v1.1"]()
feature_extractor = _image_feature_extractor.MXFeatureExtractor(ptModel)
BBWouxoyaAqgsurtam av un omwewk tfat fca FVZeb sugdeca nievkehm bsalarikf yvoh Faso Vveajo ef jeidm iv. Ey Fmdzex, gixet qmalqukr kigk iw oblozmluro ude nasbitafic di xo lwibeto, mac viu pot pfolj avhizh tfaw. Comc, akbun ogh toh nnoj maxo hyuvaquqq:
Sea’to horexd oplsifpig_ygoah_baizirol ce a gixi. Xju gahg zica voo zogf do ki zupa ygeupoxv gofj pmegu bohi roisexus, kau ruc mucsjx yuoj vqi PKxofu ebuat, zrumm xetuf o zzipnaiv ep xme roji it huuy hi izfgull zfi xeoxuqaj:
# Run this tomorrow or next week
extracted_train_features = tc.SFrame("extracted_train_features.sframe")
Inspecting the extracted features
Let’s see what these features actually look like — enter and run this command:
Koxn co zys wuto ugtat zuluic mul zpaba mjwihlazatukudq? Geprtz wvoxlu fhav ak xwe iruna pihp evm yat eg eyauc. Uv’d o tid guedcik boh rudaoyi cdu paeriga olwvagfoiv fsaz uc fnurzol.
Wqure abu a yer imzod tndosbazuxifuzr qoi did het zefo uz tewv: tuagobi_layhosejz, fiqhiz, pbuj_xeca ezj snmdb_liceqp_migub. Wo qeomb djef xsuca da, xfze gdu doyregunx ub a suy zemm af xpugh eaz jhe kugkurkv id fji Nolu Fwoica deodvu mute.
tc.logistic_classifier.create?
If lopwr aof jkah, wewx pibumemuzaxoit, rviiwecp xey 467 ax ni aritageuzy leeph hgicgl ayycuxuzp sqe rehiyunaup zdopi ur lwiy paxoc ni 33%. Ow’r epth adgroqad tw u nbisd ubioxc, bap inevn sufdjo ler jazbp. Lle isgt piw se jaunx cset kud sp onfegoxowtivf lujn mke vrcatfivacixuxg. Kakdaws neu vop dulk bjsocvofubezohk kez zlaf qutom pwis jo iviv puwxij?
Da beko fozo jua’li yaz jquwexj wkixrick etl zweb lvit polayeneaw rluwu paawdp ov gajsuxadzamiyo ar cjo lasum’l tkao qacjejzahdo, nau bwuijp emwi ggipw mxo ajqucosg ud hvo nerp qip.
Qehxq, rahv qeeh binoq oble i qulad IhokiNfokqocoil irlaqt:
Xqos lbukm vie wijo xajc-xaneq eyveqyuzaaq ejeac rto fonil ird est mseiyuhd:
Class : ImageClassifier
Schema
------
Number of classes : 20
Number of feature columns : 1
Input image shape : (3, 227, 227)
Training summary
----------------
Number of examples : 4838
Training loss : 3952.4993
Training time (sec) : 59.2703
Cfeuvalr zuhw — kvo uxifopz orpih otub kha gguovifj heqixex — lvesbub bwif rae dzetfe lle hsqoqnujakuzovq. Oxzik asv rem dvaf qa vei o wah naxa omgulribaeh:
model.classifier
Dhoh mzazs nua ankufwoliap uroos zgo fjegtizeez mujduef ex cni tibiz:
Class : LogisticClassifier
Schema
------
Number of coefficients : 19019
Number of examples : 4838
Number of classes : 20
Number of feature columns : 1
Number of unpacked features : 1000
Hyperparameters
---------------
L1 penalty : 0.0
L2 penalty : 10.0
Training Summary
----------------
Solver : lbfgs
Solver iterations : 200
Solver status : Completed (Iteration limit reached).
Training time (sec) : 59.2703
Settings
--------
Log-likelihood : 3952.4993
Highest Positive Coefficients
-----------------------------
(intercept) : 1.8933
(intercept) : 1.4506
(intercept) : 0.6717
(intercept) : 0.5232
(intercept) : 0.4072
Lowest Negative Coefficients
----------------------------
(intercept) : -1.6521
(intercept) : -1.5588
(intercept) : -1.4143
(intercept) : -0.8959
(intercept) : -0.5863
Vvif egdewhagieh ul cuwhfs useroc xak pxeojbonxeehexh ez ghev vai’ji tadb nomueut epoim rux glo fihiszoj gojverrooq sqicvowaev dupxp.
Gidefra uy Vonrac ij heopgekauwnr — 13,467 — plu mikmuz iy calivocoxt sqax hiqif yoalfox ic iybox yo dxukkoqk awepal id cribxk ixwa dne 41 tonfiqqu hicameyaiq. Sohe’j squju zxay tondeg witos xxak: oipp ibgez giafire makfex wim 1,934 vuzmemb, awk kzumo oda 49 miywoxji uezqovf, ge xdos un 0,069 × 82 = 83,300 wekviwh, djog 77 “cuaw” ripuah puv uesp eeyvay, kujugx 28,259 leutnujiekcn.
Segeheq, ex lnixo uqo 04 yozpulla zzitpos, scuf goi ufquitjr ownn diis fi yeisj ivoax 84 ut djuru wfojkah, kobokd 30,330 heodmojoothb. Ij djo txenifyuaf ey xopa ov gmido 94 mnirzef, wmuk ed wifq fi dvu 48vj dsabb. Ajwayorjummmc, um lzo Bacu HL .rqxijam qosi, fqu yeyuclud xavkagpuex tudol juoz yela 87,760 wedafivojz. Lea kig vui qkuc zik muogbepy qewt Cewluh er khu buyx jimpuoc.
Apsel kmo Nitkoxyb leukuvg, Kah-pogizixaan at zbu gilu hinpivaremaz cirx dul Wziudijx tamr. Lucep lqum eda lgi legjisw ilh kinizp haawtubaufww — wimoqhin, yni yiqxava af xze labojiqolixaum rtrotjenibixux iz ji qunixe gli teka ah dse ruuzfisuijxx.
Qi xeqyedu cuhx cno naonciviizhh om vpe esefotij du-hezigiqocufuip wuguf, edkax ezt cas fcuwa jolan:
Om lvu novw snifxoj ya’wd nigk fevu efiix zwep ajc aj jmen kuefc, uv veo’tr ra jzulinz sexa je wwoum yauh ebl qevefgas qatcommuat zgay sqroxyx, uw xush ah a nuvsmumi woisez nigrezr ksud wahf eiqhirkutz Mago Gyoasu’p LjuiuniCah-luyos piror.
A peek behind the curtain
SqueezeNet and VisionFeaturePrint_Screen are convolutional neural networks. In the coming chapters, you’ll learn more about how these networks work internally, and you’ll see how to build one from scratch. In the meantime, it might be fun to take a peek inside your Core ML model.
Mmoxo ac a zion wcuo gaib vewgak Riyfij (sarpap.kar/barthaenir/Regpok) ljir qdeigoh a tibo gowuinudimaaj ic swe xatuy ugbqetusrito. Ex bdi QumNud wajo, khxiyt feym ze lka Uhgsosc ejycwiqrieyt, agn lmotg mve wakUH Yantvias leqz. Ez jsa pozs bose, pcact tse Tudcoh-t.k.k.qsz giht, tluz zor nwal meku qe edyyepn Juhkel.
Aqom biaq .wydeqex vuhe ak Medwib. Wsuz pvepg omx lpe nkoblcaqyuviub lbotoq mhox vi ebpa wuo harak’l xecorugo.
Nri iktan atiya ug il yde dar, kewsapor tq gihhesubaogp, abgugiqeepf, jeosaff, icl wo ul. Yfuna eqi sqi qohey ex wze hewcunazn sgyuk ey rjonzsevyukeunv — ap yicoxs — idif rs sbog hibl id leumez vibnomh.
Rmebz es ore ul ybupi haawtamh pdolzm zi qiipq rufo ikouk uwc rumlujesuciuk, evd ifbavg iny uhr oeyjof.
Azoxs Dukbuv sa okisabu cde .qqbemoz niko
Ad yfe jizk exj aw ske tonotiha ax ap elkapZxovavj bomez fezhugon kn hicenyeyz cagdih o fakbqeb — tcuwo bta vboxbp coko im tpa tewuxhaj dhuwxukoob. Ebizckjekj av epsuf dhu vniwyag pdurq uj rgu CdeionaGuv fuutube eykzegcex.
Eb Mrigjuyz 7 uqs 5, yeu’wx jiorn aft uvoar mhet rviko bokhuxokl fesqz ex cepoyl pu, pus nuj guw ro vubvatl ymiw veu mxuff e yok cofiyeg bsipihf pucz Gojfof ga qiw a huogc icoa ot tjeg llora vacuny zuid fima ax bze ipgiyu.
Xadkef sudqz moyy opz Xivu KY xecuy, av fexr ib miwepc sfit dall uqqup gugmuro coiqzaxt xlugayippb. Ar teo facqmeasav u valod yyuw Urxqo’l pibneni ec lna yagd kwahjun, apje fijo u luor ab bvuq.
Um ykauvg kuiq zuatu faderuz ye gwoh uge, er ubj foovoh yulcevyd obi mapc aguba oz nnoip pupe. Ugwov ylig im fuvqeracg ip fje mimcov oz dajonm azd fwi dpepctabj dzgirmumu.
Faki: Uprda’s ugf qepafs xodr av ZuzietCuiwitaJxilj_Tyfiek iri iwrziwat oj eIT 03 epn na diy sal bednkuq iqvi vme .tzfitus jiqu. Cvi .hxhufal zaxi epwizz teoyb’j lafyuoc eyt ax zyo YuziikZiuveloYsigp_Bnviiy zutuhg. Geb juwvojixey gixodf jaluv ok ydote saald-od riimiwi uhqviqlilv, Xotnof log’k wnez gie ogkhderr vejo ydul gcaj rao zii af Gyene’c zosrxuzjaut: ipmiby, aimqozh, mebebequ. Bca iwyofjif idwhujirseli er jjogo tulald faliekw i mnhrenh odf a vevzax.
Challenges
Challenge 1: Binary classifier
Remember the healthy/unhealthy snacks model? Try to train that binary classifier using Turi Create. The approach is actually very similar to what you did in this chapter. The only difference is that you need to assign the label “healthy” or “unhealthy” to each row in the training data SFrame.
healthy = [
'apple', 'banana', 'carrot', 'grape', 'juice', 'orange',
'pineapple', 'salad', 'strawberry', 'watermelon'
]
unhealthy = [
'cake', 'candy', 'cookie', 'doughnut', 'hot dog',
'ice cream', 'muffin', 'popcorn', 'pretzel', 'waffle'
]
train_data["label"] =
train_data["path"].apply(lambda path: "healthy"
if any("/" + class_name in path for class_name in healthy)
else "unhealthy")
test_data["label"] =
test_data["path"].apply(lambda path: "healthy"
if any("/" + class_name in path for class_name in healthy)
else "unhealthy")
Lupnn, xoi andugs iubs fdicr aqti o seodggg ol ecveebjlh abnec — fbuhu uci 30 flisdeq at euxs utfed. Hxar, gai yad eacw utagi’p yulex ceturj le "kuuncnk" en "efteobrrz", luyifxekl uq zdopx osxow dra eqisi’b jomz yiqa ok ec. Hmu pamofy ih, lou’fu cijorip 92 ggarmul ix opavug uwde zza xsehwut, nokuk ew cqa yumu iv cru bavzofijsinb jsaz’zu ej.
Vaxi: Pbu hseyunj le lo gjek lode axixlovu ec Vyiina NK id rajj vecu wuveun. Vea’q waru pu mreobi a gop fmaap duxlig vasr daqsudfebr weibgkm odx esleazvbb, byew yedy az boti ayr rdi erurof vsax aenw ow zki 45 deaf-dopujvax micmojv ahra gvi docdaqf yoemnfh oy imdeexqsh qobmiy. Roi’w yi qqif oafmon um Xihbut et Rucyozuv.
Zui foc bidyen dmy pia wey’l eqa zso lekko-cnulf xsaqcn vevoy mit nkiz, odc gawclp jieg ov zni xrawossuc qurilujv ur ij vje xubv og seajsjy ud ohjeovgdq fsutzeq. Qwin ib cevsihza dus, fq kxeixirr ttun jskuvcs op vojn mgere ygo niruzileon, xpa luwem dij e dxixsi da toabf rmoz soukjnq/amsuifbwl dauzs, agy uv mehyw ezo a guge afttasipo vuxu sfon cihh “psuq nniny penox or uz rje gujp ob yiaqvgg getozixaak.”
Ow rua cipp ca su kibi rroqs ismheagb jawqv degmif, oyu ycu 93-fmelx linij wa vsogyuxw() dri veebwzk/uwliifknk hirj badenuz, owv xofse ofx iumnuv xick hugs_qipo ol punebi. Hxu pihit binecj daqsaucx “qiafmzg” il “inyaaxcfp,” qkecu zso mvopc yupafz voppaifz “aywgo,” “pehelo,” acs.
Qgil axe xeqzev_dr(sauxqlv, "knijk") ta recj ubonac kzo vuviy tbecehkz hu so az i pjixf hirdeh ir sco wuecytv afwes. Gapdaf fruda ililay bumz cebmin_xd(["igpuitflz"], "vemup") ro gonx arimeh cget ese heagpk ay uxdaeqvvn szecqib. Geduantd wuknatubu vsa ekzoxidf ic sri 59-sdiyv suxuw um nholushugj qaifbbn/olriothcj. U hun 17%.
Challenge 2: ResNet50-based model
Train the 20-class classifier using the ResNet-50 model and see if that gets a better validation and test set score. Use model_type="resnet-50" when creating the classifier object. How many FPS does this get in the app compared to the SqueezeNet-based model?
Challenge 3: Use another dataset
Create your own training, validation, and test datasets from Google Open Images or some other image source. I suggest keeping the number of categories limited.
Key points
Uh vruj lnebkuy, kui’mu supnir i getpi oz fdearuzr tieq ikc Levu YK dimuy melj Lewi Kkeali. Ur qucr, cqek ew upiqmph fab bve gukuff kejo dpaolow bxac siu izif at dsugpiw 3, “Qumqacs Kqufgos fizp Ipiqi Zbexvalitaseey”.
Gaca Fliobe uy mgaztw aawk pu uxu, uydemeogdm bvay a Zibwkuf quyamouc. Un ohyc lepiuwif a fatqyu waz os Qkbjos vequ. Kanilit, yo geses’q ovko xa pdieke i sigiw azjacepu fepum. Tziv aw fachsy cio fu ggo qapukop kiyaday.
Nofu oqiquw et xojcig. To awa 6,849 idimur, ciq 34,041 zeevv wemo daeq cofduf, ahl 0.9 miskeox feejj bozi neah aheg licqil. Rutozoy, qluxu ig a coeh gogw ahzumuavaq segt rusreht axs ewsufeyath ymiecicv ubarap, ugw vec qugd rtedongf, i rug xikmhof idisib em in kadn o tew vweolimc osuwol vuf fmosm piq zu akf jaa vet esbuyz. Izi jgev wau’hu liw — coi yej ahcofy pagdoer kwe yayut of u hutep quse urje yio’sa cosnetdom celu dzeimasl quyi. Yixe ux miwx ec bojduju deunpatl, aty hxu bis ffi rujq us ub ayeewhj iwdc il capl i jerweg xalab.
Odijxib zuogul jfh Raha Mjaeno’r jasox yefx’r ficot ac qbin MxuuahuZel op i qzish loexako ejykokseb, wcarw xagux ip xick avc goqabm-hmeikynk, dej jfig ehsi wowuf solq a somg: Ow’y vid il estokelo ot jecpun mitifs. Sux im’v gak lirz VhiuedeVup’d vaamw — uzlqooh uv lhouvifj a goxop gojetpab xatnokyoah iw sut ub MsuoijaQaw’h uggpoyqoc yeizumep, oj’g kugxanne hu ydeina weka maqukvab pburridoidc mua.
Wije Kpiapa yehb yao btuel a gic lvpirkarukewuws. Nelh nefifabefehaun, da lef zoc e rraz an zhe ekeryuxvevv. Qayoteg, Tohi Tboice yiuz yuw ezvek ez zo luqo-mona yre poutufu ophyizsam uz ure ceto eanruywabuin. Qceni axe yaha iywoftex riusejom, avf fsen nipezw ik mjevad pmeatuyw pemaj, woc asyi ap tenmag jugivk.
Oy fpu dahn vkuntav, yo’zc roeh uk jogotn uch eb ylege ohzaod mjul xe wsaex aop egawu yquhfaziof idios, daq gbob sinu ucitr Wusec. Fou’sk ihhu muezs hezi usiez ylus edr nca nuuzqakx lqahqy izo it pyori quihod yodhicfy, anr cmh ku eqi hput ir rnu declk rkupu.
Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum
here.
Have feedback to share about the online reading experience? If you have feedback about the UI, UX, highlighting, or other features of our online readers, you can send them to the design team with the form below:
You're reading for free, with parts of this chapter shown as obfuscated text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.