Povećanje podataka | Kako koristiti dubinsko učenje kada imate ograničene podatke - 2. dio

Ovaj je članak opširan pregled tehnika proširivanja podataka za dubinsko učenje, specifično za slike. Ovo je 2. dio Kako koristiti Duboko učenje kada imate ograničene podatke. Ovdje pogledajte dio 1.

Svi smo bili tamo. Imate zvjezdani koncept koji se može implementirati korištenjem modela strojnog učenja. Osjećajući se bujno, otvarate web-preglednik i tražite relevantne podatke. Vjerovatno je da ćete naći skup podataka koji ima oko nekoliko stotina slika.

Sjećate se da većina popularnih skupova podataka ima slike u redovima od nekoliko desetaka tisuća (ili više). Također se sjećate da je netko spomenuo veliki skup podataka ključan za dobre performanse. Osjećate se razočarano, pitate se; može li moja "vrhunska" neuronska mreža dobro funkcionirati s malom količinom podataka koje posjedujem?

Odgovor je, da! Ali prije nego što uđemo u magiju ostvarenja toga, moramo se osvrnuti na neka osnovna pitanja.

Zašto je potrebna velika količina podataka?

Broj parametara (u milijunima) za popularne neuronske mreže.

Kada trenirate model strojnog učenja, ono što stvarno radite je podešavanje njegovih parametara tako da može preslikati određeni ulaz (recimo, sliku) na neki izlaz (oznaku). Naš cilj optimizacije je proganjati ono slatko mjesto gdje je gubitak našeg modela mali, što se događa kada su vaši parametri podešeni na pravilan način.

Najmodernije neuronske mreže obično imaju parametre u milijunima!

Naravno, ako imate puno parametara, morat ćete pokazati svoj model strojnog učenja proporcionalnu količinu primjera, kako biste postigli dobre performanse. Također, broj potrebnih parametara proporcionalan je složenosti zadatka koji vaš model mora obaviti.

Kako mogu dobiti više podataka ako nemam "više podataka"?

Ne morate loviti nove slike koje se mogu dodati vašem skupu podataka. Zašto? Jer, neuronske mreže nisu pametne za početak. Na primjer, slabo uvježbana neuronska mreža pomislila je da su ove tri teniske lopte prikazane u nastavku različite, jedinstvene slike.

Ista teniska lopta, ali prevedeno.

Dakle, da bismo dobili više podataka, trebamo napraviti manje promjene na našem postojećem skupu podataka. Male promjene poput preokreta ili prijevoda ili rotacija. Naša neuronska mreža pomislila bi da su ionako to različite slike.

Povećavanje podataka u igri

Konvolucionarna neuronska mreža koja robusno može klasificirati objekte, čak i ako se kaže da je smješten u različitim orijentacijama svojstvo naziva invariance. Konkretnije, CNN može biti invariran za prijevod, točku gledanja, veličinu ili osvjetljenje (Ili kombinaciju gore navedenog).

To je u osnovi premisa povećanja podataka. U stvarnom scenariju možemo imati skup slika snimljenih u ograničenom skupu uvjeta. Ali naša ciljna aplikacija može postojati u različitim uvjetima, kao što su različita orijentacija, mjesto, mjerilo, svjetlina itd. Ove situacije objašnjavamo obučavanjem naše neuronske mreže s dodatnim sintetički modificiranim podacima.

Može li povećavanje pomoći čak i ako imam puno podataka?

Da. To vam može pomoći povećati količinu relevantnih podataka u vašem skupu podataka. Ovo je povezano s načinom učenja neuronskih mreža. Dopustite mi da to ilustriram primjerom.

Dvije klase u našem hipotetičkom skupu podataka. Onaj s lijeve strane predstavlja Marku A (Ford), a onaj s desne strane predstavlja Marku B (Chevrolet).

Zamislite da imate skup podataka koji se sastoji od dvije marke automobila, kao što je prikazano gore. Pretpostavimo da su svi automobili marke A poredani točno kao na slici lijevo (tj. Da su svi automobili okrenuti lijevo). Isto tako, svi automobili marke B poredani su točno kao na slici desno (tj. Okrenut udesno). Sada ovaj podatak hranite svojom "najmodernijom" neuronskom mrežom i nadamo se da ćete dobiti impresivne rezultate nakon što je osposobi.

Automobil Ford (marka A), ali okrenut udesno.

Recimo da je odradio trening, a vi hranite sliku gore, a to je automobil marke A. Ali vaša neuronska mreža otkriva da je to automobil marke B! Zbunjeni ste. Zar niste upravo dobili 95% točnost na vašem skupu podataka pomoću "najmodernije" neuronske mreže? Ne pretjerujem, u prošlosti su se dogodili slični incidenti i popravke.

Zašto se to događa? To se događa jer na taj način rade većina algoritama strojnog učenja. Pronalazi najočitije značajke koje razlikuju jednu klasu od druge. Ovdje je karakteristika bila da su svi automobili marke A okrenuti lijevo, a svi automobili marke B okrenuti desno.

Vaša je neuronska mreža dobra samo kao i podaci kojima je hranite.

Kako spriječiti da se to dogodi? Moramo smanjiti količinu nebitnih značajki u skupu podataka. U našem gornjem klasifikatoru automobila, jednostavno rješenje bilo bi dodati slike automobila obje klase, okrenutih u drugom smjeru našem izvornom skupu podataka. Što je još bolje, slike u postojećem skupu podataka možete samo okrenuti vodoravno tako da se nalaze s drugom stranom! Sada, na treningu neuronske mreže na ovom novom skupu podataka, postižete učinak koji ste namjeravali postići.

Izvođenjem proširenja može spriječiti vašu neuronsku mrežu da uči irelevantne uzorke, bitno povećavajući ukupnu učinkovitost.

Početak rada

Prije nego što uđemo u različite tehnike povećavanja, postoji jedan problem koji moramo unaprijed razmotriti.

Gdje uvećavamo podatke u našem cjevovodu za ML?

Odgovor se može činiti prilično očitim; radimo uvećanje prije nego što podatke unesemo u model, zar ne? Da, ali ovdje imate dvije mogućnosti. Jedna je mogućnost da prethodno izvršite sve potrebne transformacije, značajno povećavajući veličinu svog skupa podataka. Druga je mogućnost izvršiti ove transformacije na mini-seriji, neposredno prije nego što ih dodate svom modelu strojnog učenja.

Prva je opcija poznata kao vanjsko uvećanje. Ova se metoda preferira za relativno manje skupove podataka jer biste povećali veličinu skupa podataka faktorom jednakim broju transformacija koje izvodite (Na primjer, prelistavanjem svih mojih slika povećao bih veličinu svog skupa podataka za faktor 2).

Druga je opcija poznata kao internetska povećava ili uvećavanje putem interneta. Ova metoda je poželjnija za veće skupove podataka jer si ne možete priuštiti eksplozivno povećanje veličine. Umjesto toga, izvršili biste transformacije na mini skupinama koje biste hranili svojim modelom. Neki okviri strojnog učenja imaju podršku za mrežno proširenje koje se može ubrzati na GPU-u.

Popularne tehnike povećavanja

U ovom smo dijelu prikazali neke osnovne, ali snažne tehnike povećavanja koje se popularno koriste. Prije nego što istražimo ove tehnike, radi jednostavnosti, napravimo jednu pretpostavku. Pretpostavka je da ne trebamo razmatrati ono što stoji izvan granice slike. Koristit ćemo sljedeće tehnike kako bi naša pretpostavka bila valjana.

Što bi se dogodilo ako upotrijebimo tehniku ​​koja nas prisiljava da pogađamo što leži izvan granice slike? U ovom slučaju moramo interpolirati neke podatke. O tome ćemo detaljno razgovarati nakon što razmotrimo vrste povećanja.

Za svaku od ovih tehnika određujemo i faktor kojim će se povećati veličina vašeg skupa podataka (aka. Faktor povećavanja podataka).

1. Okreni

Slike možete okretati vodoravno i okomito. Neki okviri ne daju funkciju za okomite pokrete. Ali vertikalni okret jednak je rotaciji slike za 180 stupnjeva i zatim izvođenju horizontalnog okretanja. Ispod su primjeri slika koje su okrenute.

S lijeve strane imamo originalnu sliku, zatim sliku okrenutu vodoravno, a zatim sliku okrenutu okomito.

Okretanje možete izvoditi pomoću bilo koje od sljedećih naredbi iz svojih omiljenih paketa. Faktor povećavanja podataka = 2 do 4x

# NumPy.'img '= Jedna slika.
flip_1 = np.fliplr (img)
# TensorFlow. 'x' = Držač mjesta za sliku.
oblik = [visina, širina, kanali]
x = tf.placeholder (dtype = tf.float32, oblik = oblik)
flip_2 = tf.image.flip_up_down (x)
flip_3 = tf.image.flip_left_right (x)
flip_4 = tf.image.random_flip_up_down (x)
flip_5 = tf.image.random_flip_left_right (x)

2. Zakretanje

Jedna ključna stvar koja se mora napomenuti kod ove operacije je da se dimenzije slike možda neće sačuvati nakon rotacije. Ako je slika kvadratna, rotiranjem pod pravim kutom sačuvat ćete veličinu slike. Ako se radi o pravokutniku, zakretanje za 180 stupnjeva zadržalo bi veličinu. Zakretanje slike kroz finiji kut promijenit će i konačnu veličinu slike. Vidjet ćemo kako se možemo nositi s tim problemom u sljedećem odjeljku. Ispod su primjeri kvadratnih slika rotiranih pod pravim kutom.

Slike se zakreću za 90 stupnjeva u smjeru kazaljke na satu u odnosu na prethodne dok se krećemo s lijeva na desno.

Rotacije možete izvoditi koristeći bilo koju od sljedećih naredbi iz svojih omiljenih paketa. Faktor povećavanja podataka = 2 do 4x

# Držači rezervi: 'x' = Jedna slika, 'y' = Skup slika
# 'k' označava broj okretaja od 90 stupnjeva u smjeru suprotnom od kazaljke na satu
oblik = [visina, širina, kanali]
x = tf.placeholder (dtype = tf.float32, oblik = oblik)
rot_90 = tf.image.rot90 (img, k = 1)
rot_180 = tf.image.rot90 (img, k = 2)
# Zakretanje u bilo kojem kutu. U primjeru u nastavku, 'kutovi' su u radijanima
oblik = [serija, visina, širina, 3]
y = tf.placeholder (dtype = tf.float32, oblik = oblik)
rot_tf_180 = tf.contrib.image.rotate (y, kutovi = 3.1415)
# Scikit-slika. 'kut' = stupnjevi. 'img' = ulazna slika
# Za detalje o načinu rada pogledajte odjeljak o interpolaciji u nastavku.
rot = skimage.transform.rotate (img, kut = 45, način = 'odraz')

3. Ljestvica

Slika se može mijenjati prema van ili prema unutra. Dok se skalira prema van, konačna veličina slike bit će veća od izvorne veličine. Većina okvira okvira iz nove slike izrezuje presjek, s veličinom jednakom izvornoj slici. U sljedećem ćemo dijelu pozabaviti se skaliranjem prema unutra, jer smanjuje veličinu slike, prisiljavajući nas da pretpostavljamo o onome što se nalazi izvan granice. Ispod su primjeri ili slike koje se skaliraju.

S lijeve strane imamo originalnu sliku, sliku pomaknutu za 10%, a pomaknutu za 20%.

Skaliranje možete izvesti pomoću sljedećih naredbi pomoću scikit-slike. Faktor povećanja podataka = proizvoljno.

# Scikit slika. 'img' = ulazna slika, 'skala' = faktor skaliranja
# Za detalje o načinu rada pogledajte odjeljak o interpolaciji u nastavku.
scale_out = skimage.transform.rescale (img, mjerilo = 2,0, način = 'konstanta')
scale_in = skimage.transform.rescale (img, mjerilo = 0,5, način = 'konstanta')
# Ne zaboravite da obrežete slike do originalne veličine (za
# scale_out)

4. usjeva

Za razliku od skaliranja, mi samo nasumično uzorkujemo odjeljak s izvorne slike. Zatim mijenjamo veličinu ovog odjeljka do originalne veličine slike. Ova metoda popularno je poznata kao slučajno obrezivanje. Ispod su primjeri nasumičnog obrezivanja. Ako pažljivo pogledate, možete uočiti razliku između ove metode i skaliranja.

S lijeve strane imamo originalnu sliku, kvadratni presjek obrezan s gornje lijeve strane, a zatim četvrtasti presjek obrezan s donje desne strane. Izrezani dijelovi promijenjeni su u originalnu veličinu slike.

Možete izvoditi nasumične usjeve pomoću sljedeće naredbe za TensorFlow. Faktor povećanja podataka = proizvoljno.

# TensorFlow. 'x' = Držač mjesta za sliku.
original_size = [visina, širina, kanali]
x = tf.placeholder (dtype = tf.float32, oblik = izvorna_ veličina)
# Za obavljanje nasumičnih usjeva koristite sljedeće naredbe
crop_size = [nova_ visina, nova_ širina, kanali]
sjeme = np.random.randint (1234)
x = tf.random_crop (x, veličina = obrezivanje_ veličina, sjeme = sjeme)
output = tf.images.resize_images (x, veličina = izvorna_ veličina)

5. Prijevod

Prijevod uključuje samo pomicanje slike duž X ili Y smjera (ili oba). U sljedećem primjeru pretpostavljamo da slika ima crnu pozadinu izvan svoje granice, te su prevedeni na odgovarajući način. Ova metoda povećavanja vrlo je korisna jer se većina predmeta može nalaziti na gotovo bilo kojem mjestu na slici. To prisiljava vašu konvolucijsku neuronsku mrežu da traži svuda.

S lijeve strane imamo originalnu sliku, sliku prevedenu s desne strane, a sliku prevedenu prema gore.

Možete izvesti prijevode u TensorFlowu koristeći sljedeće naredbe. Faktor povećanja podataka = proizvoljno.

# pad_left, pad_right, pad_top, pad_bottom označavaju piksel
# pomicanje. Jedan od njih postavite na željenu vrijednost i odmorite na 0
oblik = [serija, visina, širina, kanali]
x = tf.placeholder (dtype = tf.float32, oblik = oblik)
# Koristimo dvije funkcije za postizanje željenog povećanja
x = tf.image.pad_to_bounding_box (x, pad_top, pad_left, visina + pad_bottom + pad_top, širina + pad_right + pad_left)
izlaz = tf.image.crop_to_bounding_box (x, pad_bottom, pad_right, visina, širina)

6. Gaussov buka

Prekomjerno uklapanje obično se događa kada vaša neuronska mreža pokušava naučiti značajke visokih frekvencija (obrasci koji se često pojavljuju) koji možda nisu korisni. Gausov šum, koji ima nultu sredinu, u osnovi ima podatkovne točke u svim frekvencijama, učinkovito iskrivljavajući značajke visokih frekvencija. To također znači da su i komponente niže frekvencije (obično, planirani podaci) također iskrivljene, ali vaša neuronska mreža može naučiti gledati pored toga. Dodavanje prave količine buke može poboljšati sposobnost učenja.

Smanjena inačica ovog zvuka je sol i papar, koji se predstavlja kao slučajni crni i bijeli pikseli koji se šire po slici. To je slično učinku dobivenom dodavanjem Gaussove buke slici, ali može imati nižu razinu izobličenja informacija.

S lijeve strane imamo originalnu sliku, sliku s dodatnim gausovim šumom, sliku s dodatkom soli i papra

Možete dodati Gaussovu buku svojoj slici pomoću sljedeće naredbe na TensorFlow. Faktor povećavanja podataka = 2x.

#TensorFlow. 'x' = Držač mjesta za sliku.
oblik = [visina, širina, kanali]
x = tf.placeholder (dtype = tf.float32, oblik = oblik)
# Dodavanje gaussove buke
šum = tf.random_normal (oblik = tf.shape (x), srednja = 0,0, stddev = 1,0,
dtype = tf.float32)
izlaz = tf.add (x, šum)

Napredne tehnike povećavanja

Prirodni podaci u stvarnom svijetu i dalje mogu postojati u različitim uvjetima koji se ne mogu objasniti gore navedenim jednostavnim metodama. Na primjer, uzmimo za zadatak prepoznavanje krajolika na fotografiji. Pejzaž može biti bilo što: smrzavanje tundri, travnjaci, šume i tako dalje. Zvuči kao prilično jasan naprijed klasifikacijski zadatak, zar ne? U pravu ste, osim jedne stvari. Na fotografijama presudimo ključnu osobinu koja bi utjecala na performanse - sezonu u kojoj je fotografija snimljena.

Ako naša neuronska mreža ne razumije činjenicu da određeni pejzaži mogu postojati u različitim uvjetima (snijeg, vlaga, sjaj itd.), Ona može lažno označiti zaleđene jezere kao glečeri ili mokra polja kao močvare.

Jedan od načina za ublažavanje ove situacije je dodavanje još slika koje bi uzele u obzir sve sezonske promjene. Ali to je težak zadatak. Proširivši naš koncept proširenja podataka, zamislite kako bi bilo cool umjetno generirati efekte poput različitih godišnjih doba?

Uvjetni GAN-ovi na spas!

Ne ulazeći u gorljive detalje, uvjetni GAN-ovi mogu transformirati sliku iz jedne domene u sliku u drugu. Ako mislite da vam zvuči previše nejasno, nije; to je bukvalno koliko je moćna ova neuronska mreža! Ispod je primjer uvjetnih GAN-ova koji se koriste za transformiranje fotografija ljetnih pejzaža u zimske krajolike.

Promjena sezone pomoću CycleGAN (Izvor: https://junyanz.github.io/CycleGAN/)

Gornja metoda je robusna, ali računski intenzivna. Jeftinija alternativa bi bila nešto što se naziva prijenos neuronskog stila. Zgrabi teksturu / ambijent / izgled jedne slike (aka, „stil“) i miješa je sa sadržajem druge. Koristeći ovu moćnu tehniku, proizvodimo učinak sličan učinku našeg uvjetnog GAN-a (u stvari, ova metoda je uvedena prije izuma cGAN-ova!).

Jedina mana ove metode je da ishod izgleda više umjetnički nego realističan. Međutim, postoje napredni rezultati poput Deep Photo Style Style, prikazani dolje koji imaju impresivne rezultate.

Prijenos dubokog foto stila. Primijetite kako bismo mogli generirati željeni učinak na naš skup podataka. (Izvor: https://arxiv.org/abs/1703.07511)

Nismo istraživali ove tehnike u velikoj dubini, jer se ne bavimo njihovim unutarnjim radom. Možemo koristiti postojeće trenirane modele, zajedno s magijom transfernog učenja, kako bismo ga koristili za povećanje.

Kratka napomena o interpolaciji

Što ako želite prevesti sliku koja nema crnu pozadinu? Što ako želite povećati razinu prema unutra? Ili rotirati u finijim kutovima? Nakon što izvršimo ove transformacije, moramo sačuvati izvornu veličinu slike. Budući da naša slika nema nikakve podatke o stvarima izvan njezine granice, moramo napraviti neke pretpostavke. Pretpostavlja se da je prostor izvan granice slike u svakoj točki konstantan 0. Stoga, kad napravite ove transformacije, dobivate crnu regiju u kojoj slika nije definirana.

S lijeve strane se slika rotirala za 45 stupnjeva u smjeru suprotnom od kazaljke na satu, slika prevedena s desne strane, a slika se pomiče prema unutra.

Ali je li to ispravna pretpostavka? U stvarnom scenariju uglavnom je to ne. Obrada slike i ML okviri imaju neke standardne načine pomoću kojih možete odlučiti kako ispuniti nepoznati prostor. Oni su definirani na sljedeći način.

S lijeve strane imamo konstantan, rubni, refleksni, simetrični i način omotavanja.

1. Konstantno

Najjednostavnija metoda interpolacije je ispuniti nepoznatu regiju nekom konstantnom vrijednošću. Ovo možda neće raditi za prirodne slike, ali može raditi za slike snimljene u jednobojnoj pozadini

2. ivica

Vrijednosti ruba slike se proširuju nakon granice. Ova metoda može djelovati za blage prijevode.

3. Reflektirati

Vrijednosti piksela slike odražavaju se duž granice slike. Ova metoda je korisna za kontinuiranu ili prirodnu pozadinu koja sadrži drveće, planine itd.

4. simetrična

Ova metoda je slična odražavanju, osim što se na granici refleksije izrađuje kopija rubnih piksela. Obično se odraz i simetrično mogu koristiti naizmjenično, ali razlike će biti vidljive pri radu s vrlo malim slikama ili obrascima.

5. Zamotajte

Slika se samo ponavlja izvan njene granice, kao da je popločana. Ova metoda se ne koristi tako popularno kao ostali kao što nema smisla za puno scenarija.

Pored ovih, možete dizajnirati vlastite metode za bavljenje nedefiniranim prostorom, ali obično bi te metode bile u redu za većinu problema s klasifikacijom.

Dakle, ako koristim SVE ove tehnike, moj algoritam za ML će biti čvrst?

Ako ga koristite na pravilan način, onda da! Koji je pravi način pitanja? Pa, ponekad ne moraju sve tehnike povećavanja imati smisla za skup podataka. Ponovno razmotrite naš primjer automobila. U nastavku su neki od načina na koje možete izmijeniti sliku.

Prva slika (s lijeve strane) je originalna, druga se okreće vodoravno, treća se zakreće za 180 stupnjeva, a posljednja se okreće za 90 stupnjeva (u smjeru kazaljke na satu).

Svakako, slike su istog automobila, ali vaša ciljna aplikacija možda nikad neće vidjeti automobile predstavljene u tim orijentacijama.

Na primjer, ako samo klasificirate slučajne automobile na cesti, samo bi druga slika imala smisla biti na skupu podataka. Ali ako imate osiguravajuće društvo koje se bavi prometnim nesrećama, a želite identificirati i modele okrenutih automobila, napučenih automobila, treća slika ima smisla. Posljednja slika možda nema smisla za oba gornja scenarija.

Poanta je u tome što, koristeći metode povećanja, moramo paziti da ne povećavamo nevažne podatke.

Je li to zaista vrijedno truda?

Vjerojatno očekujete da će vas neki rezultati motivirati da prijeđete daljnju kilometražu. Pošteno; I ja imam to pokriveno. Dopustite mi da dokažem da povećanje zaista djeluje na primjeru igračaka. Možete potvrditi ovaj eksperiment da biste ga potvrdili.

Stvorimo dvije neuronske mreže kako bismo podatke svrstali u jednu među četiri klase: mačka, lav, tigar ili leopard. Ulov je, jedan neće koristiti uvećavanje podataka, dok drugi neće. Skup podataka možete preuzeti s ove poveznice.

Ako ste provjerili skup podataka, primijetit ćete da postoji samo 50 slika po razredu i za trening i za testiranje. Jasno je da ne možemo koristiti proširenje za jedan od klasifikatora. Da bi izgledi bili pošteniji, koristimo Transfer Learning kako bismo modelima pružili bolju priliku s oskudnom količinom podataka.

Četiri klase u našem skupu podataka.

Za onaj bez povećanja, neka koristi VGG19 mrežu. Ovdje sam napisao implementaciju TensorFlow koja se temelji na ovoj implementaciji. Nakon što klonirate moj repo, možete dobiti skup podataka odavde, a vgg19.npy (koristi se za učenje putem prijenosa) odavde. Sada možete pokrenuti model da biste provjerili performanse.

Slažem se, međutim, pisanje dodatnog koda za povećanje podataka zaista je malo napora. Dakle, za izgradnju našeg drugog modela okrenuo sam se Nanonetu. Interno koriste učenje prijenosa i povećanje podataka za postizanje najboljih rezultata koristeći minimalne podatke. Sve što trebate učiniti je prenijeti podatke na njihovu web stranicu i pričekati da se obuče na njihovim poslužiteljima (obično oko 30 minuta). Što znate, to je savršeno za naš usporedni eksperiment.

Nakon završetka treninga možete zatražiti pozive na njihov API kako bi izračunali točnost testa. Pogledajte moj repo za primjerak isječka koda (ne zaboravite umetnuti ID svog modela u isječak koda).

Rezultati
VGG19 (bez povećanja) - 76% Ispitna točnost (najviša)
Nanonet (s povećanjem) - 94,5% točnosti ispitivanja

Zar to nije impresivno? Činjenica je da većina modela radi s više podataka. Kako bih pružio konkretan dokaz, spomenuo sam tablicu u nastavku. Prikazuje stopu pogreške popularnih neuronskih mreža na skupovima podataka Cifar 10 (C10) i Cifar 100 (C100). Stupci C10 + i C100 + stope pogreške s povećanjem podataka.

Stope pogrešaka popularnih neuronskih mreža na skupovima podataka Cifar 10 i Cifar 100. (Izvor: DenseNet)

Hvala što ste pročitali ovaj članak! Pritisnite tipku za pljeskanje ako jeste! Nadam se da će baciti malo svjetla na povećanje podataka. Ako imate bilo kakvih pitanja, možete me kontaktirati na društvenim mrežama ili mi poslati e-mail (bharathrajn98@gmail.com).

O Nanonetsima: Nanonets gradi API-je kako bi pojednostavio razvojno učenje dubljeg učenja. Posjetite nas na https://www.nanonets.com za više)