kursin e vetë-drejtimit të nanodegradit të Udacity më duhej të zgjidhja një problem vërtet emocionues: të mësoja një makinë të drejtonte vetë, duke mos përdorur asgjë tjetër përveç imazheve të kameras hyrëse (deri më tani vetëm nga një botë e simuluar). Kishte një kërkesë tjetër: mund të përdor vetëm teknika të të mësuarit të thellë, kështu që nuk mund t'i tregoj asgjë makinës sime në mënyrë eksplicite për botën. Megjithatë, këtu është rezultati - unë jam mjaft krenar për të ;)

Por megjithatë, është pak mister.. si funksionon? Ndihet vërtet joreale që duke përdorur ~ 1 GB të dhëna video dhe një model mjaft të thjeshtë të rrjetit nervor, mund ta mësoj një makinë të qëndrojë në rrugën e duhur.

Kështu që vendosa të kuptoj se si makina ime e sheh botën

Modeli im i rrjetit nervor është shumë i thjeshtë. Kjo është struktura:

  • Të dhënat hyrëse të kamerës (një imazh 320 x 160 RGB)
  • Disa transformime të imazhit (prerja, zvogëlimi i paletës dhe normalizimi)
  • 2 shtresa konvolucionale, secila e ndjekur nga shtresat e veprimit RELU
  • 2 shtresa të lidhura plotësisht
  • Një dalje 1x1, që është këndi i parashikuar i drejtimit

Rrjeti i trajnuar mund të japë një rezultat mjaft të mirë - dhe mendoj se duhet të reflektohet disi në shtresat e brendshme. Pra, le t'i hedhim një sy!

Kur e futa këtë imazh në rrjet, shtresa e parë e konvolucionit ka vlerat e mëposhtme (Unë jam duke bërë një transformim të korrjes më parë, kështu që makina duket vetëm në rrugë).

Me sa duket, rrjeti i jashtëm përpiqet të zbërthejë kanalet e ngjyrave në një mënyrë që disa shtresa të kthejnë një kontrast shumë të madh midis rrugës dhe skajeve të saj - dhe ka kuptim, pasi rrjeti ynë përpiqet të kuptojë pozicionin e kamerës në krahasim me rrugën. Megjithëse gjërat interesante po ndodhin në shtresën tjetër të aktivizimit:

Rrjeti heq qafe shumë pikselë që nuk janë të barabartë me skajin — dhe është bërë në kanale të ndryshme ngjyrash me rezultate të ndryshme. Për imazhin e dhënë do të mjaftonte të përdorni vetëm një kanal për të arritur një rezultat mjaftueshëm të mirë, por duhet të kujtojmë se ky rrjet është i trajnuar për të njohur skajet e rrugëve me ngjyra të ndryshme dhe kushte ndriçimi - kështu që ka një lloj tepricë në rrjet. .

Shtresa e dytë konvolucionale bën të njëjtën gjë se e para - zbërthen 9 shtresat hyrëse në 18 shtresa; kështu në daljen e shtresës së dytë konvolutinale çdo kanal origjinal RGB i zbërthyer në 6 kanale.

Shtresa e dytë e aktivizimit kthen në mënyrë të dukshme vlerat më intensive në skajet - megjithatë në disa kanale të dekompozuara pothuajse nuk ka rezultate. Ndoshta këto shtresa aktivizohen nga hyrje me kombinime të ndryshme ngjyrash.

Pas shtresës së dytë të aktivizimit, rrjeti "rrafshohet" vetë dhe krijon një vektor të gjatë prej 14400 elementësh (në skemë ai riformësohet në 2 dimensione). Nuk është më i lexueshëm nga njeriu, por ne mund të shohim se ka një model. Ndoshta është shumë e tepërt, gjë që ka kuptim - duhet të kthejë në nivelin tjetër të njëjtat vlera për të dhëna hyrëse shumë të ndryshme (për shembull, makina të dyja duhet të kthehen djathtas kur ka një liqen ose një pemë në të majtë).

Shtresa tjetër ka vetëm 10 qeliza. Nuk ka asgjë për të kuptuar këtu për një njeri. E vetmja gjë e rëndësishme është që ai nxjerr vetëm një vlerë përfundimtare: këndin e drejtimit në shtresën përfundimtare, dalëse.

Përmbledhje

Ka shumë gjëra magjepsëse edhe në një rrjet kaq të thjeshtë. Është ende pothuajse e pabesueshme për mua që kjo të funksionojë pas ~ 2 minutash stërvitje. (10 epoka, 10.000 mostra për epokë).

Së dyti, që ky rrjet ka 145.749 parametra të trajnueshëm - dhe për një rrjet nervor, nuk është shumë. Në fakt, është një rrjet shumë i vogël, pasi mund ta trajnoj edhe në laptop. Të bësh një gjë të tillë kaq lehtë ishte e pamundur 10 vjet më parë.

Së treti, dhe ky është fakti më befasues: duke përdorur një arkitekturë shumë të ngjashme (dhe një termocentral për ta trajnuar atë :) NVIDIA krijoi një rrjet që mund të drejtojë një makinë të vërtetë, në botën reale.