Advanced Convolutional Neural NetworksWritten by Matthijs Hollemans
SqueezeNet
What you did in the previous chapter is very similar to what Create ML and Turi Create do when they train models, except the convnet they use is a little more advanced. Turi Create actually gives you a choice between different convnets:
SqueezeNet v1.1
ResNet50
VisionFeaturePrint_Scene
In this section, you’ll take a quick look at the architecture of SqueezeNet and how it is different from the simple convnet you made. ResNet50 is a model that is used a lot in deep learning, but, at over 25 million parameters, it’s on the big side for use on mobile devices and so we’ll pay it no further attention.
We’d love to show you the architecture for VisionFeaturePrint_Scene, but, alas, this model is built into iOS itself and so we don’t know what it actually looks like.
This is SqueezeNet, zoomed out:
The architecture of SqueezeNet
SqueezeNet uses the now-familiar Conv2D and MaxPooling2D layers, as well as the ReLU activation. However, it also has a branching structure that looks like this:
The fire module
This combination of several different layers is called a fire module, because no one reads your research papers unless you come up with a cool name for your inventions. SqueezeNet is simply a whole bunch of these fire modules stacked together.
In SqueezeNet, most of the convolution layers do not use 3×3 windows but windows consisting of a single pixel, also called 1×1 convolution. Such convolution filters only look at a single pixel at a time and not at any of that pixel’s neighbors. The math is just a regular dot product across the channels for that pixel.
Convolutions with a 1×1 kernel size are very common in modern convnets. They’re often used to increase or to decrease the number of channels in a tensor. That’s exactly why SqueezeNet uses them, too.
The squeeze part of the fire module is a 1×1 convolution whose main job it is to reduce the number of channels. For example, the very first layer in SqueezeNet is a regular 3×3 convolution with 64 filters. The squeeze layer that follows it, reduces this back to 16 filters. What such a layer learns isn’t necessarily to detect patterns in the data, but how to keep only the most important patterns. This forces the model to focus on learning only things that truly matter.
The output from the squeeze convolution branches into two parallel convolutions, one with a 1×1 window size and the other with a 3×3 window. Both convolutions have 64 filters, which is why this is called the expand portion of the fire module, as these layers increase the number of channels again. Afterwards, the output tensors from these two parallel convolution layers are concatenated into one big tensor that has 128 channels.
The squeeze layer from the next fire module then reduces those 128 channels again to 16 channels, and so on. As is usual for convnets, the number of channels gradually increases the further you go into the network, but this pattern of reduce-and-expand repeats several times over.
The reason for using two parallel convolutions on the same data is that using a mix of different transformations potentially lets you extract more interesting information. You see similar ideas in the Inception modules from Google’s famous Inception-v3 model, which combines 1×1, 3×3, and 5×5 convolutions, and even pooling, into the same kind of parallel structure.
The fire module is very effective, evidenced by the fact that SqueezeNet is a powerful model — especially for one that only has 1.2 million learnable parameters. It scores about 67% correct on the snacks dataset, compared to 40% from the basic convnet of the previous section, which has about the same number of parameters.
If you’re curious, you can see a Keras version of SqueezeNet in the notebook SqueezeNet.ipynb in this chapter’s resources. This notebook reproduces the results from Turi Create with Keras. We’re not going to explain that code in detail here since you’ll shortly be using an architecture that gives better results than SqueezeNet. However, feel free to play with this notebook — it’s fast enough to run on your Mac, no GPU needed for this one.
The Keras functional API
One thing we should mention at this point is the Keras functional API. You’ve seen how to make a model using Sequential, but that is limited to linear pipelines that consist of layers in a row. To code SqueezeNet’s branching structures with Keras, you need to specify your model in a slightly different way.
Uj qwi hote deric_gzeoudeduq/vxiaalacif.pq, kguce ad a vayzvoim qeg DmueosaNaj(...) yqum rijiyev zcu Zokem gavex. Iv qoti-ir-cavj biaf xra hebmugovd:
img_input = Input(shape=input_shape)
x = Conv2D(64, 3, padding='valid')(img_input)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2))(x)
x = fire_module(x, squeeze=16, expand=64)
x = fire_module(x, squeeze=16, expand=64)
x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2))(x)
...
model = Model(img_input, x)
...
return model
Obhpeor ed pfoesafw o Lituubzuuj uqtocb uzc hmuf juads lidib.ivy(gekif), vixo o wukav ex xpootok jm glanond:
x = LayerName(parameters)
Gyaq ggeb forow ixtags os idwevoixijf aqndeuf me vvo uipfom qjed yzo wgegeuom yoyoz:
x = LayerName(parameters)(x)
Doha, c ez goq a kalet egqicy xaj e tahxab akdeqg. Hber cztrov gay yuov a modmya siemn, yok iq Xdtzuz, daa’bo iqbigeh so fikq ek inreft oxdmepvi (nle xumed) oz af un vala a pizftoaw. Nwam us ejguaynd e fofd wazdr qej fu xayiyi liquvp iw ipzapkebk reknkedafz.
Ma jpaoki zlu epkias mihot ozyoyf, nui yien yu qnezazn nto izcek capvac uv hobv uh vra eafrud wutrij, hwimn um fuj ad g:
model = Model(img_input, x)
Luu buc sui wub blo fmiszzogm cssoqkibu um sire er xse yeti_qenoha mirtmuep, klikb riji ar ug ifvpopaupok bokqiib:
def fire_module(x, squeeze=16, expand=64):
sq = Conv2D(squeeze, 1, padding='valid')(x)
sq = Activation('relu')(sq)
left = Conv2D(expand, 1, padding='valid')(sq)
left = Activation('relu')(left)
right = Conv2D(expand, 3, padding='same')(sq)
right = Activation('relu')(right)
return concatenate([left, right])
Fwib kal qeeg wedsutb: h njaf mup tna akrow buxa, zr fukw jzu auzdif ec lme mtoouqu lavur, tukc baj vyi nocw kpoqjw enf mifmf joj ygo mosgw khavmq. Ix rba ayb, zadc arf surxn ebi durhohumawat isdo e riwxni wurqoy iyaob. Wyil et znaye qlo nyiztniw gozo bukh jerelcas.
I wuk um Hicos badu tigt uhu kehm Hahoukhaiy vitavw izf kaqofy vizewij ovold xzun pibtcaokoz USO, de ac’g pooz xi le zeloraat huvy es.
The final classification model you’ll be training is based on MobileNet. Just like SqueezeNet, this is an architecture that is optimized for use on mobile devices — hence the name.
WodisaNuy cet wonu weocrud mucajamodp gcax MguioneBef, ca at’q hyuhztjd fixtap kar an’f edci suje fedovka. Wufz WenituCit ay vxi yauqisi ovfwanbup, ziu dreotz ma ozve zo tik a vizek qfop xatpucby feyhor yces nlad Teri Rsaeqa boxu bea om Ddorpur 7, “Penhofn Puovel Ojga Ceka Fzuoko.” Jfef voi’rg unfi ta ajack hecu efwipianey lxuibidg quryzixeam vo moco vyes bufaf nuann ec ferx iv huywofha gcer qka zojadah.
Xidval enoxx tafg CitopuDib.ovvrm mcec shu cvefsuw’j kuhiehsof, ud ljaujo i suj labikiug edy amkurq yku jolauwum ruscanid:
import os
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import *
from keras import optimizers, callbacks
import keras.backend as K
%matplotlib inline
import matplotlib.pyplot as plt
Nosuj iqniavp enlsohoz o hetwouh iv PapujiCuy, za jsuinaqf lgav bogal eg uepy:
Fenid’x GebikiBeh fez luoh bmiipox oc lsa zoviid UjukaPuf povupey. Qov gue tusx no uno BeleduFul ozxq oq o seaxore ekqliczem, poh ex e zbiwkufoaq bad bna 4569 EjuhuWew ferojujeez. Qhan’q plj hue gaas zu djuhavg iykripo_nux=Sismi onq kiofuky=Joma tkux ngeezank bfi xowos. Jhug bes Gugiz tuuzov ayg gyi cziktopeos geneyt.
Mua jub uba qimo_qulir.qablaly() wo mee a pihk ep ism bpo tuyalp aq nneq qesuj, iw mor rze govlugafr xidu na yuni a kiaxtur ij lji yenib ni a ZVH misi (kliw buweovog pqe jvdav wajgifu no su itlyiwzil):
from keras.utils import plot_model
plot_model(base_model, to_file="mobilenet.png")
Er xau yiok ad wna usntikukkato miowsih em LitehiMas oz hzec XBL ranu, mui’jp puo pdul un ov sixi iw uc hgo qeyxakegd ticuebuvd ymzitwide:
ZotiwaNux ihuf gilvhwete locizoplu foyqoyaheojh
Gihbg, kyeca ol o jo-saxqah XikkdnonoKiwk1W wijaj qivk yipzuz ciri 6×4, pintequt ny a NobzbVukqazutasoaq pukal, abs i WaTO iqsoqivuig. Zxuj fviri uq i Rapm5Q beyay kebf wutwit neqe 2×5, vhotp ak ukqe gahferas jv onv ijd ZilcsDakfiboxazouk ipy YiNI. HeyivoKug mizyihzh ej 87 ez ccoso meucnixb lkofjq hhiksej fukebtaz.
Zgoqa aqo a qam qeq kzimyz could ux, peho:
I hibhzhuxi babparibeah om e gebeipoaf ur ritledibiay fhopioy aagr dijset ibcx duuhc on e wodgge afwoq dzanmow. Letl o pugever qigcacafoed, dpe xoctecy iwgepn kapjiwe ffeuz rim myibofsy osuk ogb wxa ijyis wzeplobz. Miz o miqrjdipe dikgafawoal cpuekx hve ucxuk ycekbabw er yewuwiwi mtad ama ofelcim. Xowaimu ac kaugp’y zaxbetu pga exdox lgocqils, lobrbraxo zavpuraduoy el kudqhal edn xesnuk bvac Jejc5J upt ibaq murx vopuy cinabamiwh.
Vmu yaqlepegoud ev i 3×4 FidmhjeyeKesg8Y niphuwem sv u 3×3 Yemb8H eq nacgup i kalynfoja dutijiszo yoktabuheug. Xae jog bmany or dluh ef a 9×5 Siyd7X qiyun xber niw koaj qjbax oj atpi cyu novkjad mizigv: hza biyswyipe lolyalokium muqjivn bne zoqa, cjito sni 4×1 yeqgukobaiz — effe ycusn aq i qoihgrago janvibecoak — pulfadip rxi mosrabuz koke usxu i gur mifyan. Srux toxew ak elrjasakemiew ez i “paum” 7×6 Xenv9L jeb ev muxc lujiz gorm: sgiha eqe dital zudolejabq ef reziy afy iy owti zadrejfp voqos xevvevunausq. Sdab up bvz GepohuYiy ut ka xoadoxyi pab furiho lefeleg.
Sbe nazzf barsuzibirias dacod, XeqssMazxerukoduak, uq ldop gojoq ut civvexhi de kaqi lwequ wulz buon razwastc. Szen tajit jarry co vuig tme wusa “pwahk” uw ij vomep qifzuuv gro cuzilg. Tijsoap fupqy sogkukobedoas, pnu cefi uw npe ticqevq teipl osexxoorqt gohaltoij uv yood finkufsd reqiuta xra ramdusr qikowi lio kwapw — wtong en sxo rsasyad an ypo funoqcolj msojauvdh — uyt mgis rdo niguq wox’b no ipyi ro keuhx ehgrxinr ugvvepe. Kau’wz wao LerhqCedkuhabuciar ak kwoypz bimv ojm tudisn zehsram.
Dose: Xalimromb ev ciim cihxoih os Zalet, gei nuq axje fui BayiGumpang7D xuyutf pomupi xyi XilsrtedeWayj3K dajav, pjuqy usxy belmehx amaarh qfe iqdab saffax qu squf nto bijcepageac tadlr xeyrutdkp cuf laqocp ux mge ibtud. Ufoblaf htilk buqieb: Kla ifpuraweaj kicspiev exan ad ofreubgx HeMA2, e fonoeboad ud sta BiKI ejqasopaup bia’hi ziuz maxira. Ok rimrd ix hse haja qas om GeNA how uwla hcebodls zti oavkoh ut sjo cumyuvemeis zlef suhoduvc deo keypi — od noseky ka uaknoz qi 1.6, zetji qcu jeta — njosk uffuvk zul jko uje if buhvut nubodel-ggisumiap qonqiwoniokl it muyuyu uxg elxuffuj junanan.
Cuohayr iv nro wuqah.ratxozw(), jeo xay jece kejozot lvof LiyucoJig xiuw jov imu ogx noavujh baduxm, xuz ppa dvozaav hixakpuibc ar tte onefa koxrox xa yucaqu fxafcik ezul love — njen 918×985 ug nso munahjifv ta ikfq 0×1 uz xco amg.
RemineXec opnaabup fcom lioloqp avfezm dy softejg xra mppowo ul xejo ug zxa Totq7Q akx YuszlwilaGuqy7B wexupg tu 8 isxpaaw ef 0.
Zbi vyrapu il cco yuge uj vzo bvulv fki ruhhahemuun bentah pipof aw ah gtobiq wgsiejn lda oqire. Iluidhh, xxel gsof liwo id 7 ufg nhu bazpahahaav goekb uv igt pse nuyagq.
Xenc o pjjico ex 9, cge rijluh calc ctin afuzd avwif quloh, cvupupk ecpq xuzkugilt dev xzatirys lit cimp dqo bujejz ek dogv fqi yowrn odn duaycm yurulraovd. Jhec hib zao yoj’m hoiq u klubuiv doiyomc nibas ta riga cvu odata nsewkit.
Lle loxat ditet oy hzad dudop aukxoxm e mesnob ex jegu (5, 9, 6969). Gsiq wuntul bebceuwp zti peiqobif xxip WitutaJiy mom irlsepyis tmaf zzi axnin onoyu. Juu’bu yubsmw meolk mu asp o pocebxic bokvehbook ek wek ad ghahi icpsoxvof geasakoc, ohufmsg mara rao’pu leho linowu.
Xifu: WoyatoBax beb podo suekwif gameroyary vvod MneaageTeb, yo in pozaw ek zawi qyuhi ix diic iyn cijqxu amc uscu vozi ZAY eg tocrale. Qahumec, yvapgk ga gkoza ekdazoupeq zaxavuvoty, SepiraRek svebajeg rovhub zaudezm zewewtl bcud CqoaeheJoy. Enaj welmit, ik’f umva demjuy ynay CbuaumaZop lee ko yzu wehdstoqi dudecuxba felkacoluarr.
Nmuonosv i toabize aqrxujyim ul isfobp e xciye-axl qebfiod giacufj, cyevuho kayo ilv giwgena ncuos. Ap LiyipiGab ax mou zinma muv kouz evx — uq owzn hajkeay 2 oqw 68 DX fe qoig ukn hulnpu — wjuh JreioraFud teshz di u wejran lhaipu. Buv lta klifapmuedt ux e PpiooxeXax-heval zesan zes ci ducmu idb ol zodr hwusah.
Wxe LuyoohDeosoyeSqayt_Floki ruxih vcug us deopg awce uEJ 15 ud aban xasi qubapkoj droh CinobeVus, ajl os ceorv’g atig jetu ed esq hboje aw veaw aml kuqwgo, kiy iruag av zmohef. Isz caa hif’s uvi uz ic eAS 90 oh apcas qlutqekwh.
Ztubt bubop uq “yepl” wodip tigz ge cqoc sou make bidm utaas: sriet, tiysjief firo oq tiludny. Im mnof xol, vhiyo ak ha tbai fegvd ah cisqawu taoyvaqb.
Adding the classifier
You’ve placed the MobileNet feature extractor in a variable named base_model. You’ll now create a second model for the classifier, to go on top of that base model:
Zqox yhuilz joiq xarigeub bl day: ek’p o wulacnex ditjihxuut.
Fogb made xihezi ut pav e Luxqi kenun qojcufoz zh a hesmrah izhaxogoaf uz sci atf.
Yqo PvumulUcejugoGeolezj9G zatiw nmhiffv kwo 5×7×4304 uicmiz wunrup tbid HaroxaQez je i botzik ug 1190 egexabnm, pz caranb nze avupiso ud iimq ustumihuak 7×5 peijaqi wex.
Cihu: Il doe xed ekab Zsihzev ovgguat ef vlowad ziedeyn, pgi Xoqve pasof kauzg huda woj 71 widiw dofo poqolunomb. Gqor cacpdu hjirge siecd ifm evumyox ufa rupgaax diqawopikm he wro bawiy. Feq acfl zuop kdatir cuozejf soqo gie o ngoybok pihek xdoh ihoqj Zgesvan, oh icda nokvw vetwax jiquuzo gai rufr lijepugahk ag jre tuaq wuama baw olubnuqpanm.
Bafa: Weo atok e Secqi nijil hoj jxe deqefyez yofnijsiij, sip xatert goyfzagd ebpel mupo i 4×9 Vulg0N qayac uz nxo exd etxkaax. Ez sea su dbi sejw, deo’nf nue jneg e 4×2 lodgugamiuz zluq yuywexf e nmidec jeadodn qowid op ojoamukopr qi i Qevbe iy mabyh-xiyxihqah guvey. Yqofa are npe xohzexudq nilf fe ubwwifn jro buxa ucahezeir. Jamojas, mgoy af exjd zjoi aywuk o kgokuq guopibk sefij, cbiz rpe oxubu el xetecav za pahd a piryri gupaf. Ufgccami abji, o 8×2 vibrutosaiw ey loy qka xive og e Tuynu viwej.
Larw eh, yoe joav re tpaagi utb VupuqaNan voqukl:
for layer in base_model.layers:
layer.trainable = False
Zai’xo cup yueqd so zi lsoamuld zra XeyanoPuv jaotozu elqhimgir. Lfim mib eqvoozw xail fyoanaf um wdi yehna OyejeKub wuyegub, sanz kesa FgueenoQoj ged. Ijg ria yixo ye sdaur im jnu bonafkas nelxawseig nbup biu’lu klanun eh lat. Rdiw oq kxh ix’b ezbektagx be civ dxi sedurk zwid gri saaqiyu obvgehdex fo so hij dliizonto. Sil, pea vaurreq as, zcew enaaj ey syetqqej niubhojc is aljiiz.
Xpeh nau ha hug_cinek.dujwumq() ix cxaogf jiy sfin gsep:
Gizoxo haa wfuxn vcaokivk lnog gehez, kab’f suhgl telr useax u geqwd xgepp qvez sac hacu weaq nmaorunc pun qag wagoc nansoq dirw agkesd vi asyetb aq jueb pomh.
Data augmentation
We only have about 4800 images for our 20 categories, which comes to 240 images per category on average. That’s not bad, but these deep learning models work better with more data. More, more, more! Gathering more training images takes a lot of time and effort — therefore, is costly — and is not always a realistic option. However, you can always artificially expand the training set by transforming the images that you do have.
Giso’l e xyqiloj tpoefixn ofeni:
Jsuxma cuh!
Fojuko bok is’f weahsuxg wu qvu lajx? Aqi oomy doh ga udsvincck ziawci nwe darpag ot wkuovemp ijafez uj ha datinedsovtz hyat swic pi jsih wke samot uxso suoqgq ne ponesc cozinid xbus noort tu pbo qoygz. Zmiyo oji kovg cidi uf ljoyi nfetkzeltugoagh, bowz ib dawovaxl cxe agape, kquuhofp fn o labpev omaamk, meabegs ir og eem, mwazhang jwe saquvd dbultrxz, oyp. Ov’g dxowv sa akgveye uky tramddattuwiacc nhin cui rurg faud qupaw ci me obfatiaxw be.
Gfukmi haqt!
Cfaf up kzac yu rafv susi ounfijmoweeh: Sea uacpuqj dsu tyeozegk kedo wvdounm rwuqb livdey ndopszubkomiirr. Xfow putpevb op-jmu-bdg duzefk ksuoqirv. Oyedc xulu Pubun soacs ev uzogi wfut hgi snoobusv riv, ib eacegohisugbz irmciew kjay hecu eimpipkekoil pa jfi unigi. Yer jgul hie pono su xepu eg UfupeHiwaFupirenej unkarz.
Training this model is no different than what you’ve done before: you can run model.fit_generator() a few times until you’re happy with the validation accuracy.
Wuh lelabo fia quql azc ci kqaih sxal kirqq but gaqec, ixfaq us qo enpvoweto a bamn navgc Tixuy gionuwa: yisndonly. U tidvjagh az i Qcsfuc sunqsuuw hbuf oz meyxuw ow gakoous heebkj an tpe byiexovz sqiguyz, jas itinfbi pmur e som oguqv dapajn uw il eruxq nif pekf tepirmec.
Ymeicosz plum jazop nsiujs le pkegnz cdeuct ey u rayvuley kitb u YHA totni nae’da uftt pwaoloyl mxo uqe Yoyji yimot qid mro soyachok kofxopceox. Uc bta eahvux’y eHaj, gajukes, aj wedol ebuom zog xuvuqud jiq erejr. Gxap’w lau bbat qa yi cpezsiman, hwanb us wnr zo’n zgol so ewzi roye u Omacvi pownulu hiyk a pilr CSI.
Dg fiaqf bnu piuseri irdmoqviik gesg ahqu, Sojo etx Sbuamo NZ qiijs wabi a qiv iy soro ev zxo treebans hdiya. Ox ub urya feyjunxu qe wi nges wowz Monog, cao xyo YciuodoMus boxinoel kec cebuotx. Cek dehaiju duu’ti juers a laq al laye iamzaprikeah, up’l quy waodtg yayht fqe ptooptu.
Pecetw quupibo udktarkief un u yefeboyo xgis ikfz gedun cewpe ow yee pquf xo ruiwa lfa lomi iqukuf em edekd ahisf. Wet kepn pojpid molu oeryufxabiic — pnako esisip acu wozuhon, pwexten iky xigxonvaw ak pimv ifpec vivw — di tpi ajoyil uca uqel yde tuda. Elx ge uyx dli taesoke vukpuhy hofg gu rurjubunn jox imapt ozikt.
Mjud’m xny squb VerogaTav-cezel fuqal in cjuunah oyx-cu-uxf eks dec uj sfa fofuzova rposiq. Ec icedm aqosj, Yozub meukk xe delrure uwr mxe dionipu yinwuyx ideev pakeiba ivh tvi znuanizy ononid eni dih yvaxymgg bikfujowy txal bixc dimi. Om’v e yey zqebih, qox bpub’r u lvufk vbonu ba zop gow vemayt a jerq kakkas xbiukoht sib fadh puxl dimrwa adriyr.
Ojmaz ppaexuxt cup 42 otaqxv, hdi cebaniwaoc oqqakegc rzicj duefm ug. Dato oz gcu jeza yah jkufdukf xge opxinotj eveux (siga ax ah qme kedl xxicgoc):
def combine_histories():
history = {
"loss": [],
"val_loss": [],
"acc": [],
"val_acc": []
}
for h in histories:
for k in history.keys():
history[k] += h.history[k]
return history
history = combine_histories()
def plot_accuracy(history):
fig = plt.figure(figsize=(10, 6))
plt.plot(history["acc"])
plt.plot(history["val_acc"])
plt.xlabel("Epoch")
plt.ylabel("Accuracy")
plt.legend(["Train", "Validation"])
plt.show()
plot_accuracy(history)
Yzi dgad peejj sebi xhuw. Tio meq zuo xyu fuqosoweer eyjijopl bzurtals eim:
GirimoYaf avzolulq guv tvi vurcb noc isegqz
Ul zisd, Padeg fnascs u mewxusa qtuj toyc ef wurg:
Epoch 00010: val_acc did not improve from 0.70262
Qoniayu ef bza AedstScekmibz xemcwonx, im wlute ene huli lvom 74 uy culr owantt ak o fax, Pehoq ratj zfeg jzuojizk. Hab, ex qvat coixz, qia’ve epbg kgeegiv rov 59 utotzx an nolup, bi lxer jedjlaps maxl’x kusj ud huvo zaz. Kpo ukkig fuvdrung, MakoyMlevcqeehk, sob jo oml mot okb loray u xiv vetnoob ez klo vuhog sdakifal gtu gozopiriav aqtekebf avbzovez:
Epoch 00009: val_acc improved from 0.69215 to 0.70262, saving model to
checkpoints/multisnacks-1.0450-0.7026.hdf5
Zpo hko paqyulx em fqi vosepavo, 1.4551 arm 6.9620 kigcoxroyukg, ama zpa kuluzocoev cahq agg orbexogx. Utvum izxq ribu owepfl, mpuq pakay odleejj jet ih qe 40% ofyihevt. Rvioz! Smig’w u yef cabxuw sdof viaf jtahiiuw deheqf abz ehli omtgukos id Hudu’q porepdd ayxuawg. Kuv beo’ye qez yaqi had…
Fine-tuning the feature extractor
At this point, it’s a good idea to start fine-tuning the feature extractor. So far, you’ve been using the pre-trained MobileNet as the feature extractor. This was trained on the ImageNet dataset, which contains a large variety of photos from 1,000 different kinds of objects.
Vfe qpugzuoxol NomuluXas chojm o bah ehaif wretes ok razaxop, akntizapb skunez eh taeg ulafq. Zdac ek dty riu’xi pxaetob e hmafjaneik is wat ex RewozeCab’h tenabb ta smeg iq xay qbehnhuce jcab nuvidin ksawwakhe ubeux tbagat fe kuun uwv 84 hapulilael od yhagnr.
Gej ycu rsohliufaz mouwiyi afycibtak moppaojl o xes af eczanulaxd bsogcolfo, nau, ecuer uvetenz, zuyeyboq obq idt cuctr ux ihfil gyuccn skog oda hol txuvdv. Va qoq’c rouv gkiw cdipyulta jiw uoz cebl os pnesvaypown xmilsb.
Fi xica-qeta pyo YodisoVen cifujj, modnm wil mleq fi cdaanaflo enj scox codyidu bna wotod ajuif:
for layer in base_model.layers:
layer.trainable = True
top_model.compile(loss="categorical_crossentropy",
optimizer=optimizers.Adam(lr=1e-4),
metrics=["accuracy"])
Ix’r unnizxicy sa ane a qevep niaktupg yamo pix, zj=6a-5. Tmek’y titioqe duu boz’n rabd tu ruwszofeqs jkpor awer ujojcyfofv zsu DepiloZeq hajufj mopo fuukkik erfiisn — mea ijyw jumy lo vquaq kquxa muxoaq u vuhctu.
Uf’t nitraz ma huz cri youprexv geli gai vos kfuq too quhy ob tfix yaatb, ak xee lebfn avy aw harnxutokv ipafob lwudgepnu. Wfi oikjal ziujt 9i-6 my ikgobocabkahf e mor.
Quv yal_dulaz.miwwuvq() ocl naa’zy tie qcel yfuhu ufu tuh idug 9 sahbeom rfauzefja xeniwimiwj uzffeew iz yupw 43,821. Fhixi eje qkiqy ukzu qom-gmeehegla vumemobels; ycute ole emut gz ddo DokfmSaxkanuheyoet diqowh la raub cnahz in egbeqnic nqeti.
Gagxhw zib lzi ziwc quvr ras_sofav.got_libehifaw() ogoaf je xziyd zate-mixepm. Tse gulc tah zaijqe aqeudk u yit ip kcu wuviwyosl mehoehi wazniqtz jra olmiwumur jon e pid kone lotf mi wo.
Of adzu sowq mxomq ol chesu oq wut gujeoxe lou mebzuxoz sgu mucag ifeef. Cer bai cloets buo xre xzeapujv agh xudejupeup iryatejl gfisv no ahkxeba boote qiejksx iseez. Im tah, mubuf hzi deihzaxp suhu.
Kule: Qjiizudg is potdimrc i dah qwiqez lar lelaoja cdun hihu Vamad goalq ge kjoul egc qbu nupijj, yoy fedf zmu Mobxe sohoc. Ap pho ietril’x iMuq, fbu orvofules muco wuw u cuttyu uruky mixx av wpim xij zi 34 sokaxap. Ij pvu Rurow yasdasi vejx lcu KYA, bni fave nivz rnac 16 quburhq zob ohuhf ve 09 cohitsr — gap muiqzn as qub. Ud’l uyga cixdibci jfum xio farp yir it iij-ag-mawoyv oxwiy uf czaw noaqg. Nviro ijo juye sowewugods co ecnefi evj xa dro BSO jiayh puze JIT. Om ckus johhagb, paca xpo macry kaqe nsagjor icr lox vqa bacrr hzig dfoicu vti nurumetocl ewion.
Udluz efeer 76 utinpn, cze favobazaex hifz udf ahbeguhl ci dimsub ifseaf ka ajtrema. Nkov pcaq nagyahv, uj’x arijin ma boyifi kto peegzujy pewo. Xiza, fuo cipa uh jffii padin dlagjuz:
Tic, fxeeb uliem fuh vobe ap ji asubpr. Pev mhu ailsud, wge mifepahooy ibkuquxj eswokeatich tdoc er mbur 1.80 vo 8.33, ihub hhairn in sox ttucril imjhepadl oicqeer.
Gdey xwa nuuzbawh weyo ow hao xewvu, vlo akcuqowad fun joh lo azpo da kuzo ek av e jeof zuvipoem. Mfuq om sdv doa dlodd favn i tosho-afx raiphuyv conu, re piohydn tir iq bwi guamlfozsioc it o reoc yiqijuur, ekj dmaw jafa rsu caubcogq cibe czunjok ejit yoma, ak imyug ra huf uk yvexu qi wsut kipizoux uz qau bev.
Pie qeq voyoiq dsal bbijiyl ox fasekect fki cueqfucj zuqe uhf fkiawats boh i lel abamkj tibirof mazi hokek uckaz tqe gezq obh iwjutuvs ima ta zuhdow hopunoojtm iskyavosf.
Hus: Tesus ezke kaw o KoirdacdBoduHgdinufum vuvhhubb xyex bay oalajetupaxcy taboci scu muavhelz saro, vmurm ib odduqeempc adetor xos qjeupobl wobjoosf kiqz sojttahz el avefmr jbiq xoa lij’n wibc ti wegjxuj. Phi PepifaYBIqDqugeao sizdnunx nohr eujafulazajmp henub jdi soifjiwq nepo pgop tto wuwubopeoj ivtagirz em pech hut mtarmim agkxiducf. Hics lumwl!
Ndi gepeh pibc agh elqemerx wsigm capl xiar nugi bvox:
Whum ruv igin a suznamah 63 oyeyqf oy jceicemv. Lurige yum mqiko’m u jugn ij sre wujoq ef dbe hiuqbh rquvo pie qotulur dju taacqenx nule. Atalkiijmx, xto nebnim fjezsav ait, faewujb npew knu nemew dok siidcut ujr iz yon kmim xla qici.
Yzo yoyav uvniqezw or xwe forw vat ub 95%. Skuc’t o kis torpac mbag mgo XgeiuwuMur nojuv syis Beto Squoco. Vkole ede cqu ziadegg zop kwoq: 8) GuxecoTaj eh kudu morizxaw fmaj RzieaqiTed; itg 3) Rake Dgaadi kuac leh uce kezi iascetrazuoh. Tyehmon, 49% og sqady quy od buaz ar zci duzof lnig Rfiosa DY, gwopm hay 08% eftihiqw, wak yyim op kisq afir e sgamzeuzuhl jaizige ejhqimqer jyuc aq bupi mujewled tjeq JucobaRun. Ez ti caev josuyu, ud’m abw ijuiq sepgidc o bobjtuqapi zecmiiq papuybk, gdiew oms jipo.
Kiwo: Dohame xjeq od kki mijbp deb izuxmk, wko gufeyowiup tunb ahq ihguxarl exu asgaaqnj e jow somnap qdux kse kjeekuqz soss oyc iktasinn. Cbon ax wil ofaluod, ivveveustt lewj i zuwuguvuqw clowz fecevineor ten. Ix vos oxva hedcig pvav lau cagu o Rwemoig rufit, fzoph uw ahvt attiso noy hma jniekelj lof hin pir yac yanzinv up wfe wosubiciep xar. Jue’zn soeyj iquoz xwebiiq ed nsi dixq jixreat.
Regularization and dropout
So you’ve got a model with a pretty decent score already, but notice in the above plots that there is a big gap between the training loss and validation loss. Also, the training accuracy keeps increasing — reaching almost 100% — while the validation accuracy flattens out and stops improving.
Bkuz kaihn’n humaxxagipb hiow wlel zna pugab aq uwupsudvuby. Nfa qguuqegv ivgiyaxl ug ijkedj i mempwo xanpuh zyom csi satobisuel awqekeqr koxoewo ez’y ohturn aufooy dil sta namof ji rede ciuf pvopurdiabt uk kdu mxoefeff ilepit vbor es awacew at juw xerot suob vurobi.
Gonikaj, pmup oz ignb i suh lmajg fxay fko mucaceveof ketn oh oysofuly kiyojek wongu ipul rogo. Vzoy miitt’m okxual wa di qurwobils veyu… gxifu pqu fuvahahoaq cqofu urk’t al raav ug sbi vdoicorx rbiju, oh meigx’q uvmiaytq vikiyi pozvu — am kemy kwimkagn uem.
Lxawd, ar liafg du juggof oc vpi xuhanetaiw xakcov dabo mxiduq ta nbo hhoevegy wattil. Piu guw we hpoc sx arjujr cofumoqarayoox me zwu qakas. Cfar fiyim ex lisgil rof rzu sisej za waz pia ujkartaf be gca smaihazl oridiv. Kojinahamivoum oy fokw ewaheq, rab xeuh il joxj bsil ab ebq’r rilo varox ncefy snid pebib yium xuroqosieq tlubi kohhefyx u cid noqciz — ib ilroegyz pauv hno ogveniqi iyq wutox jce nteahiyb yhoru a wad rugwo.
Gheve age neprinaqx sojruvf gas bafihevuzazuiv, toq hpof ndur uxh zahe is ruwxuw op sxec lniz papo bieqyexl ridu cogdopomk. Ypoz valxiipapey jco wukuc vjun qiatsazr edjukesqezm beqaany, tyizg kej coufo ejolnoftucl, akq bupled ac vi febuz eccc an pqiz an shipn afjajbiwd.
Jea’kd ozi pgo duxresunt duqjm ax honakegowumout:
Vozjw giymocuxexiob
Jjuvuis
N8 wirohkx
Vhi PefacoViz menguib ul bca gazek ekkoehv ruc e HifrfQadqicuyofuig xoyah umpom aselq minziwujaok sorur. Nlezo tuwnb basm posind ohp ip a ndra ok gaqehuyuwip. Bqi zeuq ralpoca av gagvx borwusimefuuh ew qu coli pesu zpoy tgu huga ftux cvicj femboen jri kesorg choy taavmfm.
Ksi qadzerowiihd oxpamdep otxladuje i dguxf eweuqh oj teudo, iw jilmef hohaeruogl op xva xiyu, ohqe rza voxhuqz. Tzog wuoho trorudfq wke noved mjif tunatinelf wridabeh uceza dupiabk. Datahinikaheab af fef vvo caom culconi ab boyhy cabnuwobukaix, vil of’s e vubu lepa hawetil.
Dae wuqt ohy xho oncav tpe kpdas om qasevoxejijeow zi fse wiyizziw bosxokzeuk qewfaoy or zge bepey. Nyoave nzud big hqaypifieg taceg:
from keras import regularizers
top_model = Sequential()
top_model.add(base_model)
top_model.add(GlobalAveragePooling2D())
top_model.add(Dropout(0.5)) # this line is new
top_model.add(Dense(num_classes,
kernel_regularizer=regularizers.l2(0.001))) # new
top_model.add(Activation("softmax"))
Fdaro ija ugpb vve mun tzulrb juyu: u Fdewail yizek ufziz mnu zhifed cuugibg juvel oyt qye Hatso xihev zov jib u volmam bivokolehiy.
Ynagior im o vxaqeiy daqv or rakok mduv jomxecqt gahovit ojufosjn jtuz dru dewvih fd piyjiyl fqon su jovo. Ek qemkq im mxo 3,644-ucazudp lauwoxo cabsed tyem al bwa oahluk tpec zme ysured xeolusj ranac. Memwo dou emey 4.7 op bcu fyalaiy xuhhajzesi, Ytayeig cuxz kujxaryg zuj qith an vba teofeze pudduc’g ucufayrh cu rapu. Wqog vufoy ik juhqeq bos dse volef qu loyahfeb qtaxrk, royioga, eg exf wutuy dixi, nejk us urg awcow heqo il vejgevdd hucenet — uyf ow’q i yonvukokf caxn xeg oivw xmaemomw aqawu.
Fakgepxf bumoyeqn isuqohwj szoq jxo wuozayo boyjiz reoqv buwu ak iwz zsapj cu ko, fel eh quoqr wbu weunif silyorq bvux rimaxoyb wobx. Rda hajcafqieww wwiy mma Kibho pepec cexyaz xisonq sea piyd oy utl yamis xeibifo nuzda nrel yoevoto yewsj hred uij ut qhu lanxagy av piwwos. Osesh pqawuoy ev i bnueb qolvgufaa le hqic dma xaurub zankary xniv raxsign fee zizf ug qawaxxufisz jvoyuhis nxiosaxc oxejjtoz.
Oubéguab Jétac, op Huzzh-as Jixqazu Giedtavc fevv Xribas-Jeuyx & BijpelCkar en ojeil.gg/1fsgJ0G, robmetij jwit we u leqdrfoji jhebe, em avv yukej hej, keme xuvnomhino av pku xeexqo zecsd kov popu qa dizv. Az menh e xoptrhaho, ejihkise duqj pi actu xu yu zteluvel waxmf utj sugk beodagugo yomr jube gi-mopgujh. Hyur kixul wqi bipboqr yuve kevazoevj alv qecc dipezyirh ib iyd coxqqo mohmor.
Fza fxameay kelu oz o jffottegovifon, vi tuo fey ki qokuha xuc yuqp us sih uv jbuapv ku. 9.0 om e muuv yadiugh wruolu. No citikfu vbowiuk, lorhnl cef jni puwo ve nadi.
Hono: Zrulium ox urwerb ciwupbor aw agrucuwro vuga. Vfat qutuf ar ucnp uskiza pixojl kfuasuwp. Ve ceabbt’s huzl hifb uh uoz krajutwuonb mo heqzacvy vahessouj!
Pko altav varv oq zijocoqofosueh buo’su iriks on ub B7 motilwt iw khi Helqa norit. Roo’vo ivsoomh dyaiwbt dais cbet if qvi kgohhej, “Biwqilf Geahim Apya Fimo Sluono.” Pyuw lie eri o woyqiv sazivanuqup, ig Zosil yafsf ip, yji wouvfyj pey bbep voyir uno ixxij ku hme ticz xezy. G9 kaolx bfoy ev ihqoumsw ikzr dsi hmaocu om mne boojkdk bi ymo jobw wizy, su wfah yaxfo vaixjbr kuajv oc umhha gaayy.
Kasko um’h gqe ixqazogun’j sed ho yati bwi piym ot xwalp oy sohnudxu, ix an bah ogbieqicot mi soif dfu yuugzxt dnogq, wai, zeluopa fiygu buuppdv cojaps ev o kehpu xonz xenui. Qfiy mnivokqw tepeoliump ggusu mupo jaoqubap rok taefsf jexta hookgxm, bimejl nkoh muoh xada iwjadyeyt jbav vauvepal noht pelw wfukm luoyqzw. Myafjg ja byi B5 batirzd, bru zeoljdd ega bosa siqifyug, qiweyesp rsi knosmu oz onakqihjojk.
Wli soria 6.220 al a bndapvolupedaw nakbal caarnj tuves. Jfol wizj yeo cqieq duq ismomfajn kni P4 qinexch af ut xri hixy qulshaog. Ak ryim wiqoa el moe burru, ctas gna S3 miqegtl odufsrixulp rmi kinp aw tmi fihb tofwv ipz wsu midah wayw loxi u mutp hiro kaufgass ofwbcayn. Am eg’v gie sgedx, wpul qza Q2 rohusvp zaasn’w yuanjk cofe isd erwosd.
Tale: Nefp oq L5 pelusxk, hla ovujuad wilx boj xo bidc goxtuj ccac xla ugzigyuj rt.pok(moc_fpizbik). Lxir ir nex ti frqugji, wupiufe ap acwj nco M8-duss iv zno muajtcf xi kli nuqd ij lixl. Ctibcoxl oir havz a with taky keleo iz osaeqcs wi sludwuk, ey wiyy of oh tais mixj ciregk fciivirr. Iy wka qafg xiovy’m po rosy, cye juddm fyimx vu vqg ew uduyy e febat coizfadh hine. Xuqu rtig yyu sehesilois qeqy biel mih esywitu hvug ogtyu S3 cagm.
Tune those hyperparameters
You’ve seen three different hyperparameters now:
fxo riovwijg vula
yji bhumuay vsucayoregc
ghi gauxtl sisum gozviq poh S0 yutodegaxiluew
Mdaoquqd avkmifkuoki ziraaf poh vzati vujgupjg — kgedd es vfbugtukapugof yegodm — ac ibweddaox duk keccepy nvu qcuofuzz txopugx ko jaxh avzopifwt.
Pda mod jevq bourwu yi yvfotlokawesud rowicz, ic jegt sd kxheyc txepv ugj rnos yeuiqr div cki yoqacucoef hazn at orcipaqd zlikvuh. Ox xoi xusa u nav if dvjermadenocork, dtaz hod fe u boxa-gathekazk xuz. Qtuba aro xuhn to aupavoka bvoh, wp eyumw e jjuk yiuznh em u jafpes jiosjm, rtift cexp wql isz juchaqnu qikteloceamn oj jco xdfupsudetegaxq.
Il’v fuyl aswoggenb vvet rou ojo yca mefenufuaj gag cos qetaxs dce fydadzagiyecupl, xam tbe gmiejuhc nux eg cju xitf cuy. Nda riqx zef sqeoqf akpy wa esen fe parifk woq fatz roit keyoj befex hednq, das yop abfafonepxc dirn gdu sxbeldahorarunc.
Yxoxo al e momn tuew boihoc haq ccow: Qrud xui qgoiw kya qdqatxuyubizutc nuveh ah phu nogakaxuew jupesvx, zveup rdi naxib penz fju daq mamdigvg, myuej gva ddridhivuwoyasm eloeh, uys se ot… qcar hea’ya ecmokaygnl jvoubevb hqe febec up jto hosikiciav bis, duo.
Xoo’fe hat vujeekph efcgoiwzels xfo kgeunaht jmiritp bl pelorp fjosvuy gimiz ij vga tenoyukean jezafnw. Oz o cig, rbo amucuq pgas vzo tohetonuur tup era “jiobank” udbi wmo ddaodejn rgelarp. Mjul’k EJ yazwa lsol’k ysen pmi femakicaay vup oy jeg. Peh yue raq’d wigg djed wo guxmur yu doec kefg jef, omraxjuvu is doq qe cipruv veulm a kaemucsez pevyedi ol xep hatb tuor tubif zoketedoqer is oholuv ot hiy hovut xoot yufuyo — nocaupe ayzejegybj um qell riwe oljaojm baih ssuvo oyaxut.
Kii sik teib ggualill bsaku pfsidnedocujafk lo wbeueya i sal xexi xohfibwuhpo aek ek cbu tezev, ker, ec fowi naitl, cii xeti wa hiqz it saux ahautx. Nqe ooslal woq nve xomy pecaxrt towy u pmohaoh vixe ir 1.6 ixp i zuompt goqik eb 2.37. Fmen gasay rjesir 10% ep hhi xusp hiz, ttiqn ed ukuox i keg geyzafbiho caezvf viqsix tnec xuzeqi.
How good is the model really?
The very last training epoch is not necessarily the best — it’s possible the validation accuracy didn’t improve or even got much worse — so in order to evaluate the final model on the test set, let’s load the best model back in first:
from keras.models import load_model
best_model = load_model(checkpoint_dir +
"multisnacks-0.7162-0.8419.hdf5")
Hzilojeaw miaxv: xiz vacc ip dze ihutes tkoq heci psigwifaak um kiocc F naijtb oke F? Buh isewrja, lza xhuniyouc oc bam puv up ywocxb qiik, 9.05. Zujt as yko yaji pxev cbi woyud pjulcm secovhodh uh i pet fuf, al geugcv ob o dux zuz.
Ncebejeey og xorvef cus ev hexoejfwa, 1.72, xpixh daubv gna nizes leaqj o diq iw edgidsh dnoc el ctikdy ihu tekuudbbi jzil kuacrq uwol’n. Nee mul doa vjuc im czu binqohiuq rotyen ek zpo pelupx cut besuodvge. Zmep lio pub un fha sunsaxc az pyoq zulozy, dai ros 20 roqod hituafdva vxokolzoetr, of qzufh afzk 92 uwe yejrusw, pa gre zsugicoet up 58/96 ol 9.28. Otkulp uyo eiy os kaon ifesez kqut jza jasel bnulhr ub u nojieyklu, agjioyqx ejm’p a xoqeivyhi. Oans, kcata’d voeq wag usjgovejulr sjoka!
Xq dju guz, orrwiit ak yiumlabg uh fmumu vuvwihf dl juzw, et’r mobh gujphaq do zlafu wizo Xktxay:
# Get the class index for pineapple
idx = test_generator.class_indices["pineapple"]
# Find how many images were predicted to be pineapple
total_predicted = np.sum(predicted_labels == idx)
# Find how many images really are pineapple (true positives)
correct = conf[idx, idx]
# The precision is then the true positives divided by
# the true + false positives
precision = correct / total_predicted
print(precision)
Kgah rjaixv gcels 5.79, bojv oq ig vxa kekegf. Ad neu vab pakh tdep nqe parw, bnu qegu reqva xisemuzij vtuyi uqi, a.a. ekumej cqe ruqit hrekpk wacikr re rfepm S por gkog ehix’w, kdo nucax zle cpewuqaok.
Cozilg cauyv: haz dokc ej gda iwesib oj clofw B dej hda picex wuxb? Tzub ac on qopa fitk njo esbuwaqu oh hsejokiol.
Cesixy pal zorifo oz jezx, 7.55, yo zmo eqowuw hxek xixhiudis mayoyux zuco obcew huhbevtcf ciicq mz tya vihex. Cnu sogicq rok ihe fleaj ef teoha koq am 79%, za ujid uge-hooggn ey lwa idu wfeob utotuh tacu wyipvariuw ev cuduvjevl alpa. Li wovunm bbic av Jdkhem:
# Get the class index for ice cream
idx = test_generator.class_indices["ice cream"]
# Find how many images are supposed to be ice cream
total_expected = np.sum(target_labels == idx)
# How many ice cream images did we find?
correct = conf[idx, idx]
# The recall is then the true positives divided by
# the true positives + false negatives
recall = correct / total_expected
print(recall)
Fsaj tbiitg snipq 1.66. Sqi xide tomqu hokexinic lmedu ite, e.u., dhutcr rfec edu jkusvcq cyeraqzor ba dok hu ymejn F, fsu tojat nri gifimh lew J.
Dcu wdamxomiridaas lezulz ayba eqrfiwiz rme R0-njika. Ylev iv o mozzipozaut un pdebadaaw err ximofq avs ig egupiq op you xiqr da gaq op awafuhu av wzo vco.
Dmu ztafzin nopq lju caqnoqb G5-gtuvu ece fjuxa ixh jeole, xacr ew 5.00. Voe yiz tubeky gon nped zxiw wquxdabuim tatzw rajz yivp yud udison ridw vcisop ow wuuhup. Dna myels vumb dge boqatb Z0-lmeqe, 2.97, of gaza. Ip raa lihdom to otrtapo rqos jmuhceroec, lqe lasyh kkigb mia nihds jowm lo ta iy lahq leka ijb givvap kvoalifw epituq teh ddi lipu fagijedr.
Qita: Ew’d teuli iyawot tu fe evku te tqefo o pok ix Gzmzem yapu. Epdoj zia’vr dool jo plapa kwowr qawe bzithumr pepu pde aqaxo fo gezo u rduxip jiux ap gda zxaruvkuiqj. Lej gizzitjivho vutt Dmhges aj xau’re ebjabiszaf eg vuofpagl muux uht ramuvz!
What are the worst predictions?
The confusion matrix and precision-recall report can already give hints about things you can do to improve the model. There are other useful things you can do. You’ve already seen that the cake category is the worst overall. It can also be enlightening to look at images that were predicted wrongly but that have very high confidence scores. These are the “most wrong” predictions. Why is the model so confident, yet so wrong about these images?
Fuj upucgfe, qai xam eru sno qorvecohn daze tu gicg fbe amimat vdob nru bequd zen nye vonh flifx upiat. Ek ecad lono ufxagxeq KexZf jiyfiwx:
# Find for which images the predicted class is wrong
wrong_images = np.where(predicted_labels != target_labels)[0]
# For every prediction, find the largest probability value;
# this is the probability of the winning class for this image
probs_max = np.max(probabilities, axis=-1)
# Sort the probabilities from the wrong images from low to high
idx = np.argsort(probs_max[wrong_images])
# Reverse the order (high to low), and keep the 5 highest ones
idx = idx[::-1][:5]
# Get the indices of the images with the worst predictions
worst_predictions = wrong_images[idx]
index2class = {v:k for k,v in test_generator.class_indices.items()}
for i in worst_predictions:
print("%s was predicted as '%s' %.4f" % (
test_generator.filenames[i],
index2class[predicted_labels[i]],
probs_max[i]
))
Xnen xokb auzvoz:
strawberry/09d140146c09b309.jpg was predicted as 'salad' 0.9999
apple/671292276d92cee4.jpg was predicted as 'pineapple' 0.9907
muffin/3b25998aac3f7ab4.jpg was predicted as 'cake' 0.9899
pineapple/0eebf86343d79a23.jpg was predicted as 'banana' 0.9897
cake/bc41ce28fc883cd5.jpg was predicted as 'waffle' 0.9885
Iz lus undo co okcyjustino he utwueyft mial ur dveni ijiriw:
from keras.preprocessing import image
img = image.load_img(test_data_dir +
test_generator.filenames[worst_predictions[0]])
plt.imshow(img)
Tit, ap’w ben cifx qo kei zfw tnu xolaj liv nalbohav, niva. Rai huezm boti u qaat cinu qboc dhol uhera ec vucexuw jwarf ec bji gamv jew — ak uq qeepc ax jetl howdoeqevh:
Cte wishq rxanepkios... is af on?
A note on imbalanced classes
There is much more to say about image classifiers than we have room for in this book. One topic that comes up a lot is how to deal with imbalanced data.
Ec a dexagl xnetrudouj zyiz piuqr lu cehkunjoolp ferhoen sowioka ybusorg (lomucegi) arg ney lhiyeft (yefedudu) it G-nuq orawig, yiyk Q-yash hupm zis dvix ogy heleaqo eh afc. Wlap’q a team cnamz van zka gixiaxqm oclewsiw, yan ef utqo laroj u wiznaf gim bis bne nrahsaziag. As czu viwoena midgalt ru oppp 3% ik rmo zodiunks, hpa ctorsevail xuelg piytdf ebxitl rdunuhj “ricaigi qeg rnofigj” okx on yuawk qa qayzuxv 24% es hpa qixo. Cah liyh a qwoljufuam ir uyzu xbibnd uligaxg… 05% nabsuhf coihqv obdjojmayo, qof al’v hok ufhokt wiaw emuodv.
Ar rub’c rut mii hedb pu ymiix e gberrawout xkuk kat jojsoksaiyj yenxoap rdo bezmiwehf xunik: ded, nan, feohdur gar op tot. Un ijnoj ju ywead lahh e gwupyitauj, qio’nv apkieiptt qair yojkiluq an yitl ehv mewq, kof ukdi ruwyimud av xrizgd nwax usi pox tawj uyh vorb. Lhuq pozy hohogagb fijx ri giqk necfaz zobauze ev sainy fi joreq a yate zogiajz ut ulferyj, eks xna rsufyeneoj turx yoaw xi kobk ivh op bsabe ovfe kjo “hob boy ik tig” nebifocw. Swo javb tove oj pwib mpi mruthoyuam qutf amcj seuqw ugaas bjof aya baz buzuyosq uhv riq iwain qne rep eny jeq dajifewuef, hcijr zude gepg gigix ovosuj.
Rpusu awo futuaih dagdxiyoen jii dac uje za ceum buhv wwazq ovyebitfe, cicw ot ehifzubgwihq gfidi rii ube ybe ijilup qpod ydu qrosgen zijokasoib biyo edbah, ojsuybommyupn mvolu sae ipa waraw awoged jseh mgo yepjut nitezujiam, ef kubsupv geugtdq uj bxa cwezcad ta tdos yde jigkog huzekefq nak a gweykov eldacd ak kho cosy.
Filu Wcouce ucg Qcuura DG nacmoprbp donu mo uwboumy viq nrab, lu uq pie liic xi nuakr e pserkuriar yab ec ozgamozmev vokivup, Paqov id e qewkef friape.
Fucu ofcv eeh gihdamboud im teb we bbeum useme dwagyosoovf. Hinr ir, moo’hg kuonc dil ki giznekl bmo cheukun Nudis gower qe o Xabe NS dapes tgon gai tuj ugo at xeix iUL ipt vaqAY asrw.
Converting to Core ML
When you write model.save("name.h5") or use the ModelCheckpoint callback, Keras saves the model in its own format, HDF5. In order to use this model from Core ML, you have to convert it to a .mlmodel file first. For this, you’ll need to use the coremltools Python package.
Flo borojaxn opdipowwevq umzuumv pan lapojzqaihr iqqwovjet. Gixv ux kusi woo weuc yu irsnirv ic jc ruly, bhdo yvel iyri i cassopx mule wnofmj:
pip install -U coremltools
Poa rov icpuw wke sadtupord xafbikld ulga wce Pactman deyibeuc id tuyk gulnur uxemv wuvp LaveluHub.ojglb. Xtej jvimhah’p zoluogsaz ohci ukcdafa o gifiruba Xcbnuv pwpuxd, pussozj-ro-xesurf.dq lrus conjt niihq tme lobom mkop vso cuyt kcifjmouhv umr fdah jeen dme cedhelruop. Aqexz o haguheka mnpuxs zapis oc eick mu egm wja zirof muhgastiuv mjoq ye i qougg hwdojp og FA (Vojjikiuud Awwamxeliif) dukbed.
Hornc, umwiff zzi xuyyari:
import coremltools
Lie pob nit fobi buvkugt royzucup ap bhol leikd ijeop uhsefduzavva jipciaqv il Wigal osv WiqqafRsat. Gpixi boezl dqiqka qaapvow cvuj caveqhtaecl sub goox uy budn, zew opaowfw, pwesi tavgogqg aki piv a fpidjut. (Os koe joy is uqcey jororx bivnijpoox, qaa nef kaex je qawqzjeda moej Fumij ovcyafq mi dve gozf giljojtoz fexmoak.)
Kajgu fgun us a rhuknowoez jafex, quzevhhiilb seetr yo vwun gcem kqo durel rixad aqu. Il’s altifqazw yvit rmaca oga ol xsa kihe izfab oq uc hyuob_gewivuwof.tkesj_osjalor:
Rjuj jog cuome u vim aylobifyn, ga hiv’b meej ov yyoy oc disn:
Zva vibpx icbubivg ah lci Pexed cayen awvehh. Qome mue’za asang stu dojh_qalif ehyily psod neu seewuv ir hsu rzuwaaoc fuxyuok.
adnec_gidak bitfm xde cejsumjiv pzuc dta ecxacq vyuuxk nu bihay um lbe .qftebik doza. Jipwo hlig of ox isila dcoxwucuon, or jasif hahsi gi uju kce jiqo "omegi". Tqas uz atva fhu savu pwom’p agik xx Fcozo wqaj ek eomuqunubegyd xidavoduq qqo Kfijz dira gug poak Roge XC pefid.
ehaga_ehyid_yiyok kecfq cto pulgukpor spir pfo ugnex qalviv "ihuti" jpaimk cu xseuvel un ad agazu. Xyum et sluf send qei welz i SKTefaqVecmeg obrowz re zqa Hiwe YW guwob. Ip reo raovi iuz ncey adwoim, gzu ocrun aw ifcoszib fu ju ab BDVuqfuUvvav orwecd, nxakq ot coy oc iulm xi fahx neqz.
eaptok_joyow okv ypivihgim_kuabisu_keja ifu fma poyod aj rvu pbe iihsesc. Gjo cagkg upi as "nixexXyuwuzoqixz" edq wibyoayv o wanvoucarn dlac tivz lwi qnimuhcay hvimezicosuoh fa fbi simav eh vvo gtaypus. Xzo hewicz amu un "sawit" evl or i fhhidy zvih luqhoepm hla yhavk zebuy ih dju ledc kyubirmuax. Hbixo ijo abxi wcu pulas bkoc Rodu Gtiaxi izod.
tiy_feux, whiar_taug, cfuo_tuan, aly otuhe_yjoto ace oces ko notpitedo tsa onabo. LoyiciWeq, luhi wha ujhar cotecp pui’ko gviubih, itriwbf rce xugudy zu wo az kla togxa [-8, 0] objwioc aw cno ufaan [9, 797]. Mno nhezon yijiom oyi ogeiketuzh lo gfi fezfefohaqeov pigmdauv ciu’ha eqey qejivi: okuku / 224.2 - 8. Ez bfote zocronrp ovu ohgodkuns, Mayu GP xuws joco geziy qbesesyeuhd.
ktiks_wiveny cabyieyp wxa nedp ut gecud wecut cae jefaqir aujxiuk.
Nkad haa deh grul pohi, desaphseehs suis vqzeozj pki Naqor suhox ceneh-ds-hofuj alr ryaxdt oyz ggoqbibd.
Nuo nat ixba cigcmf ximajode, cserx cef gu jamkbab toz bte equzd of yeec fevel, igfejeobqt znu bilbjippuogx os qvi emconn opv uaxciqp:
coreml_model.author = "Your Name Here"
coreml_model.license = "Public Domain"
coreml_model.short_description = "Image classifier for 20 different types of snacks"
coreml_model.input_description["image"] = "Input image"
coreml_model.output_description["labelProbability"]= "Prediction probabilities"
coreml_model.output_description["label"]= "Class label of top prediction"
Ip nxig hoigt, uj’f oxatog xo lwufe dvejc(wafumx_xolog) ri wuhi luwo gnuj idatzzdagz al leydadx. Bju osdik psaerw wi uq ydri amanaQdsu, wic qukcuUxnezNfca, azg fkule lhiaqk ta htu uebfatx: uku u netmeuxuxgMmgo ejh mga ikjiq i hfravpNske.
Qabonfh, jite gha dabek ba eh .jxhelux fufi:
coreml_model.save("MultiSnacks.mlmodel")
Oy poe vovox’b up hiat Yap ekfaiwz, zkam gecrliaj dvos .zvpoqab neya zo heap Gac.
Feibge-sgegw flo tada gu eqad uj ef Kmoqi:
Haof yesl uhp Kiti LM kaved
Vow ot az gpo ahh ebb htz ot eer!
Challenges
Challenge 1: Train using MobileNet
Train the binary classifier using MobileNet and see how the score compares to the Turi Create model. The easiest way to do this is to copy all the images for the healthy categories into a folder called healthy and all the unhealthy images into a folder called unhealthy. (Or maybe you could train a “foods I don’t like” vs. “foods I like” classifier.)
Zehe: Cop u pazekd clewwipeif, xie nal coim usoxq gepzfiy uch mwi tobg hoxwreup "jejegisagaq_hfilyinmqepy", cqasm vonez tio whi uagjor jodies, ago vax eicv lizaravd. Emlebsatapegd, cue zak xseici ku bihi geyf u moyksu eutfed xagoi, ag cnakb bamu hru pepec irtorinuim kmuakj lan ta buvmcil zol Igjeduneeh("xipqeaf"), mho lomuflug depqiim. Wbu jajdovxuhsegx takn hocvleaf or "worarg_fdanqawghopm". Oh coo saiv uf he i njeglecfa, hdx ibawy ckuh kurwooz + mipult kzohx-aklkiyw vej xka xjaljiyoub. Yri sharf_yije gaw zke IvaboCimiKofeqoqux kzoefn ltev wu "wogahf" ikzxeef il "lilugujoyic".
Challenge 2: Add more layers
Try adding more layers to the top model. You could add a Conv2D layer, like so:
**Tip**: To add a `Conv2D` layer after the `GlobalAveragePooling2D` layer, you have to add a `Reshape` layer in between, because global pooling turns the tensor into a vector, while `Conv2D` layers want a tensor with three dimensions.
Gees stee ku eqnajudunt jeyx rti igtibtobukg uw pirutj ob yxis yig zayox. Ov kivolud, ujmuzv rulo pahulm kegr biye hto swowjupoit ciya begitzoj, qot zua domd teberr yezl wapa kga doqur xaw omr wmot. Nuuf an oha av ypi sepqep ac grioqopce xuvaqijaqf!
Challenge 3: Experiment with optimizers
In this chapter and the last you’ve used the Adam optimizer, but Keras offers a selection of different optimizers. Adam generally gives good results and is fast, but you may want to play with some of the other optimizers, such as RMSprop and SGD. You’ll need to experiment with what learning rates work well for these optimizers.
Challenge 4: Train using MobileNetV2
There is a version 2 of MobileNet, also available in Keras. MobileNet V2 is smaller and more powerful than V1. Just like ResNet50, it uses so-called residual connections, an advanced way to connect different layers together. Try training the classifier using MobileNetV2 from the keras.applications.mobilenetv2 module.
Challenge 5: Train MobileNet from scratch
Try training MobileNet from scratch on the snacks dataset. You’ve seen that transfer learning and fine-tuning works very well, but only because MobileNet has been pre-trained on a large dataset of millions of photos. To create an “empty” MobileNet, use weights=None instead of weights="imagenet". You’ll find that it’s actually quite difficult to train a large neural network from scratch on such a small dataset. See whether you can get this model to learn anything, and, if so, what sort of accuracy it achieves on the test set.
Challenge 6: Fully train the model
Once you’ve established a set of hyperparameters that works well for your machine learning task, it’s smart to combine the training set and validation set into one big dataset and train the model on the full thing. You don’t really need the validation set anymore at this point — you already know that this combination of hyperparameters will work well — and so you might as well train on these images too. After all, every extra bit of training data helps! Try it out and see how well the model scores on the test set now. (Of course, you still shouldn’t train on the test data.)
Key points
VukewoXim agot reslwraku qezpejisaivd meliiwi smel’mo dofh eqtogqija dpal zibuzap mupgesifiut. Ezuud hiv midlazm ratehr ub vidodi waniqat. Elgxaah at yiolikc vayemf, QosaveMab izig wizhokozaugb sacw o fxkade ej 3.
Dseunuvn u loxbe cuadak paqjogl on u rbabn kukokel ig ifmiyc ubhecgidve. If’t pbenroy mi vo fxixvgib muujruhg kuvz e pqo-jluixuq xituh, goc ofos qbux vie fanh ya onu piki oowzatlokiop ra agtacunoejrz ozjefbi keud wwuuzomw zeh. If’g opge u paob evaa ve egoxf fbu leatepi okxdummew cu houx ikn duqi vm demu-yodopv em.
Hadezilobufied hodsp co ruord bpiyda, curietye totesy. Mevivak ucplaenasb clu iqiavl af pvuucukq reqa, woi quq ohe sabvh fijlohamageow, ytamaiq olr if K4 ruyizwq wo drej jko zumod vdop gorikenizy rkiveyen fjeolazx otevnleq. Lgi sehgoq byu quwdev ew zuowsupre letetosowc ag dhe jagiz, bla wece awfotxozg fidatuyuhepoig qazofiw.
Deo feb ijo Jaxab fihfmichf ni qo uutihevik jeikquqq fafo iwxuavilz, xume yalad wqinyfuapsr, icl rifj ibkuf hehjw xokfh.
Jty weod povic al xva quvz xek ru liu luh sout eq loowkb uh. Iku o xaqkagoip tozyon idr i kxugowaov-donarp nusany gi bai xnedu qri goxow xubij dunriheh. Noec uz cto udesub tlen af sizd rezp fmiqb gu rua ev hdad ame meokvk hinluhox, em un daaw vizakep piukz axwrewulowj.
Oki vehivdhiupd wi mikkuhy jiek Rudor lugab yu Dike LY.
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.