{"id":39,"date":"2016-08-17T08:26:20","date_gmt":"2016-08-17T08:26:20","guid":{"rendered":"http:\/\/liipetti.net\/retkia\/?p=39"},"modified":"2016-08-17T09:59:42","modified_gmt":"2016-08-17T09:59:42","slug":"tyylinsiirto-neuroverkolla-missa-nyt-mennaan","status":"publish","type":"post","link":"https:\/\/liipetti.net\/retkia\/tyylinsiirto-neuroverkolla-missa-nyt-mennaan\/","title":{"rendered":"Tyylinsiirto neuroverkolla -miss\u00e4 nyt menn\u00e4\u00e4n?"},"content":{"rendered":"<p>Tyylinsiirto neuroverkolla, jossa luodaan uusi kuva niin ett\u00e4 yhden kuvan sis\u00e4lt\u00f6 yhdistet\u00e4\u00e4n toisen kuvan tyyliin, syntyi noin vuosi sitten. Kaikki alkoi Leon Gatysin jne. tieteellisest\u00e4\u00a0<a href=\"https:\/\/arxiv.org\/abs\/1508.06576\" target=\"_blank\">artikkelista<\/a>. Siin\u00e4 kuvattiin menetelm\u00e4, joka k\u00e4ytti konvoluutioneuroverkkoa yhdistettyn\u00e4 Gramianin matriiseihin (katso\u00a0<a href=\"https:\/\/liipetti.net\/retkia\/index.php\/2016\/03\/03\/kuinka-neural-style-toimii\/\" target=\"_blank\">Kuinka neural style toimii<\/a>). Ei mennyt kauaakaan kun githubista jo l\u00f6ytyi toimivia toteutuksia. N\u00e4ist\u00e4 menestyksekk\u00e4in oli varmaankin neural-style; se ker\u00e4si nopeasti laajan ja aktiivisen k\u00e4ytt\u00e4j\u00e4kunnan ja se on\u00a0my\u00f6s monen jatkokehitellyn toteutuksen pohjana.<\/p>\n<p>Justin Johnsonin kehitt\u00e4m\u00e4<strong>\u00a0<a href=\"https:\/\/github.com\/jcjohnson\/neural-style\" target=\"_blank\">neural-style<\/a><\/strong>\u00a0on monipuolinen, varmatoiminen ja suhteellisen helppo asentaa, kunhan on jonkinverran perehtynyt linuxin komentorivik\u00e4ytt\u00f6\u00f6n ja github-sovellusten asentamiseen. Se toimii yll\u00e4tt\u00e4v\u00e4nkin hyvin monenlaisella kuva- ja tyyliaineistolla, ja vaikka sovelluksen asetuksien kirjo onkin aloittelijalle h\u00e4mment\u00e4v\u00e4, asetukset toimivat hyvin kunhan niihin ensin tottuu. K\u00e4ytt\u00e4jille isoimpia ongelmia ovat olleet <em>nopeus<\/em> ja <em>skaalautuvuus<\/em>. Neural-style tekee kuvan iteroimalla ja siihen menee aikaa, joskin GPU:n kanssa toiminta on silti melko nopeaa. Itselleni nopeus ei ole ollut ongelma, siit\u00e4k\u00e4\u00e4n huolimatta ett\u00e4 viime aikoihin asti olen ollut ilman GPU:ta. Kun laittaa ohjelman tallentamaan v\u00e4lituloksia tarpeeksi usein, on ihan mukava seurata kuvan synty\u00e4 ja kehittymist\u00e4, siin\u00e4 oppii tuntemaan ohjelman ja sen asetusten toimintaa ja kuvanteon voi my\u00f6s keskeytt\u00e4\u00e4 kun se tuntuu kehittyv\u00e4n v\u00e4\u00e4r\u00e4\u00e4n suuntaan.<\/p>\n<p>Skaalautuvuus on hankalampi ongelma. K\u00e4ytett\u00e4viss\u00e4 oleva muisti rajoittaa kuvien kokoa, useimmilla k\u00e4ytt\u00e4jill\u00e4 on enint\u00e4\u00e4n 8GB GPU-k\u00e4yt\u00f6ss\u00e4. Voisi ajatella, ett\u00e4 k\u00e4ytt\u00e4\u00e4 GPU:ta hakemaan sopivat asetukset ja sen j\u00e4lkeen luo lopullisen kokoisen kuvan CPU:lla, jonka k\u00e4ytt\u00f6\u00f6n on yleens\u00e4 mahdollista asentaa ainakin 32GB. Ik\u00e4v\u00e4 kyll\u00e4 tyylinsiirto ei skaalaudu hyvin: kuvan ulkoasu muuttuu oleellisesti kun kuvakoko kasvaa, eik\u00e4 t\u00e4h\u00e4n ole l\u00f6ydetty ratkaisua asetuksien kautta. Voikin olla, ett\u00e4 muutos johtuu siit\u00e4 ett\u00e4 kun neuroverkko on koulutettu tietyll\u00e4 kuvakoolla, se oppii reagoimaan kuvan piirteisiin sen mukaisella pikselitarkkuudella. Kun kuvakoko kasvaa, sama pikselim\u00e4\u00e4r\u00e4 sis\u00e4lt\u00e4\u00e4 yksityiskohtaisemman osan kuvasta, ja verkko reagoi eri tavoin kuvan piirteisiin. Monet hakevatkin ratkaisua kuvan j\u00e4lkik\u00e4sittelyst\u00e4 ns. superresoluutiotekniikalla, sopivasti opetetun neuroverkon k\u00e4yt\u00f6ll\u00e4 kuvan koon kaksinkertaistamiseen laatua heikent\u00e4m\u00e4tt\u00e4. T\u00e4llaisia ratkaisuja on olemassa, mutta ainakaan toistaiseksi ei ole tullut vastaan riitt\u00e4v\u00e4n hyv\u00e4\u00e4, k\u00e4tev\u00e4\u00e4 ja yleisk\u00e4ytt\u00f6ist\u00e4.<\/p>\n<p>Vuoden aikana on ilmaantunut my\u00f6s yleis\u00f6lle suunnattuja <strong>palveluita<\/strong> ja <strong>sovelluksia<\/strong>, kuten deepart.io, ostagram, pikazo ja prisma. N\u00e4m\u00e4 ovatkin k\u00e4yt\u00e4nn\u00f6ss\u00e4 ohjanneet\u00a0uusien k\u00e4ytt\u00e4jien odotuksia; niinp\u00e4 on aika tavallista ett\u00e4 neural-stylen k\u00e4ytt\u00e4j\u00e4 kyselee &#8221;kuinka saan t\u00e4ll\u00e4 samann\u00e4k\u00f6ist\u00e4 j\u00e4lke\u00e4 kuin X:ll\u00e4?&#8221;. Voi toki my\u00f6s ihmetell\u00e4, miksi nimenomaan haluaa samanlaista j\u00e4lke\u00e4 kuin kaikki muutkin, mutta voihan\u00a0t\u00e4mm\u00f6inen pyrkimys olla my\u00f6s kimmoke opiskella tyylinsiirtoa syvemmin.<\/p>\n<p>Nopeus ja skaalautuvuus ovat erityisen t\u00e4rkeit\u00e4 t\u00e4llaisia palveluita kehitt\u00e4ville ja yll\u00e4pit\u00e4ville. Viime aikoina onkin ilmaantunut uusia ratkaisuja, joissa esimerkiksi k\u00e4ytet\u00e4\u00e4n neuroverkkoa tuottamaan kuva suoraan. Neural-styleh\u00e4n ei suoraan tee kuvaa, vaan mittaa sis\u00e4\u00e4nsy\u00f6tetyn kuvan sis\u00e4lt\u00f6\u00e4 ja tyyli\u00e4, ja pyrkii iteroiden tekem\u00e4\u00e4n halutunlaisen kuvan. Mutta on mahdollista rakentaa my\u00f6s sellainen neuroverkko, joka tekee itse kuvan, ja opettaa t\u00e4mm\u00f6inen verkko muuntamaan kuvaa: kuva sis\u00e4\u00e4n ja muunnettu kuva ulos.<\/p>\n<p>Dmitry Ulyanovin\u00a0<strong><a href=\"https:\/\/github.com\/DmitryUlyanov\/texture_nets\" target=\"_blank\">Texture_nets<\/a><\/strong>\u00a0toimii juuri n\u00e4in. Ensin opetetaan verkko reagoimaan tyylimalliin: otetaan yksi kuva tyylimalliksi ja opetetaan kuvaa tuottava verkko ajamalla sen l\u00e4pi sopivaa kuvamateriaalia kunnes tulos alkaa olla haluttu. Oppimista voi seurata k\u00e4tev\u00e4n selainpohjaisen monitorointik\u00e4ytt\u00f6liittym\u00e4n kautta.<\/p>\n<p><a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/voikukka2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-367\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/voikukka2-1024x455.png\" alt=\"voikukka2\" width=\"900\" height=\"400\" \/><\/a><\/p>\n<p>Koulutus vie yleens\u00e4 puolesta tunnista muutamaan tuntiin, GPU:ta k\u00e4ytt\u00e4en, ja kun verkko on valmiiksi koulutettu, kuvien muuntaminen on todella nopeata. Kun kokeilin sit\u00e4 ensimm\u00e4isen kerran, tuntui ettei mit\u00e4\u00e4n tapahtunut, ohjelma alusti neuroverkon ja lopetti samantien. Mutta olihan sinne hakemistoon ilmaantunut se kuva.<\/p>\n<p><a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/kcy-svanstein.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-368 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/kcy-svanstein.png\" alt=\"kcy-svanstein\" width=\"540\" height=\"405\" \/><\/a><\/p>\n<p>Verkon kouluttaminen ei kuitenkaan ole ihan ongelmatonta, eik\u00e4 kokemus neural-stylest\u00e4 v\u00e4ltt\u00e4m\u00e4tt\u00e4 auta ollenkaan. Toistaiseksi tuntuu ett\u00e4 mahdollisten tyylien kirjo on jollain tavalla rajallinen, tyylikuvasta huolimatta muunnetuissa kuvissa on jotakin ratkaisulle tyypillist\u00e4, jota on vaikea sanoin ilmaista. Tyylit voivat my\u00f6s toimia upeasti, mutta n\u00e4ytt\u00e4\u00e4 oleellisesti erilaisilta kuin tyylin mallina ollut kuva. T\u00e4ss\u00e4 voi osittain olla mittakaava ongelmana. Toisin kuin neural-style, texture-nets ei skaalaa kuvia, se vain rajaa kuvista halutunkokoisen alueen koulutuksen aikana. Niinp\u00e4 korkean resoluution kuvista rajautuukin pieni\u00e4 yksityiskohtia jotka eiv\u00e4t v\u00e4ltt\u00e4m\u00e4tt\u00e4 olekaan tyylin oppimisen kannalta j\u00e4rkevi\u00e4. Kuvamateriaali kannattaa siis valmiiksi skaalata sellaiseen kokoon, ett\u00e4 koulutuksen aikana kuvat rajautuvat mielekk\u00e4\u00e4ll\u00e4 tavalla.<\/p>\n<p>Texture_nets on ilman muuta hieno ty\u00f6kalu ja tarjoaa mielenkiintoisia haasteita. Sill\u00e4 saa toisinaan upeaa j\u00e4lke\u00e4, mutta sen ei voi olettaa saman tien toimivan kuten neural-style tai tuottavan automaattisesti halutun tyylin kopioita.<br \/>\n<a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/sg0121-o6b-5000.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-370 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/sg0121-o6b-5000.png\" alt=\"sg0121-o6b-5000\" width=\"539\" height=\"404\" \/><\/a><\/p>\n<p>Texture-nets ei ole ainoa, eik\u00e4 edes ensimm\u00e4inen t\u00e4llaista kuvan valmiiksi tekev\u00e4\u00e4 ratkaisua k\u00e4ytt\u00e4v\u00e4 sovellus. Neural-stylen kehitt\u00e4j\u00e4, Justin Johnson, esitti ratkaisun periaatteen artikkelissa maaliskuussa 2016. H\u00e4n ei ole julkaissut omaa toteutustaan, mutta ainakin yksi h\u00e4nen artikkeliinsa perustuva toteutus on julkaistu githubissa:\u00a0<a href=\"https:\/\/github.com\/yusuketomoto\/chainer-fast-neuralstyle\" target=\"_blank\">chainer-fast-neuralstyle<\/a>.<\/p>\n<p>Texture-nets k\u00e4ytt\u00e4\u00e4 verkon koulutuksessa Gramianin matriiseja tyylin mittaamiseen ja mallintamiseen, seuraten Leon Gatysin menetelm\u00e4\u00e4 ja neural-stylen toteutusta. Alex J. Champandardin<strong>\u00a0<a href=\"https:\/\/github.com\/alexjc\/neural-doodle\" target=\"_blank\">neural-doodle<\/a><\/strong>\u00a0perustuu erilaiseen ratkaisuun. Gramianin matriisien sijaan siin\u00e4 k\u00e4ytet\u00e4\u00e4n MRF:\u00e4\u00e4 (Markov random fields) ja pilkotaan tyylikuva pieniksi paloiksi (patches), joiden pohjalta lopullinen kuva sitten kootaan niin ett\u00e4 palat sopivat mahdollisimman hyvin yhteen. Menetelm\u00e4 on hyvin erilainen kuin neural-styless\u00e4, ja my\u00f6s asetusten kannalta melkoisen mutkikas, h\u00e4mment\u00e4v\u00e4kin. Toisaalta, siin\u00e4 miss\u00e4 Gramianin matriisi tilastollisena ratkaisuna kadottaa kokonaan tyylikuvan tilallisen rakenteen, MRF ja palat s\u00e4ilytt\u00e4v\u00e4t jonkin verran tyylikuvan tilakokonaisuutta, sit\u00e4 miten tyylilliset osat liittyv\u00e4t toisiinsa ja my\u00f6s sit\u00e4 mihin ne sijoittuvat suhteessa sis\u00e4lt\u00e4\u00e4n. Picasson maalaamat silm\u00e4t voivat aivan oikein ilmaantua juuri sinne miss\u00e4 sis\u00e4lt\u00f6kuvassa silmien pit\u00e4\u00e4kin olla. Toisaalta lopputulos menee helposti sekavaksi tyylikuvan osista muodostuvaksi koosteeksi.<\/p>\n<p><a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/webcam-8.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-376 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/webcam-8.png\" alt=\"webcam-8\" width=\"539\" height=\"302\" \/><\/a><\/p>\n<p>Neural-doodlen perustoteutus ei tee kuvaa kerralla, mutta projektista on my\u00f6s ns. forward-versio. Sen asentaminen voi olla hieman hankalaa, mutta kun sen saa toimimaan, se on yll\u00e4tt\u00e4v\u00e4n nopea my\u00f6s ilman GPU:ta (15 &#8211; 45 sekuntia per kuva tehokkaalla CPU:lla). Toteutus k\u00e4ytt\u00e4\u00e4 kuvan kerralla tekev\u00e4\u00e4 neuroverkkoa, mutta siit\u00e4 huolimatta my\u00f6s iteroi. En ole tarkkaan perehtynyt koodin toimintaan, mutta oletan ett\u00e4 iteroinnilla haetaan sit\u00e4 ett\u00e4 tyylin palat saadaan riitt\u00e4v\u00e4n hyvin sovitettua yhteen.<\/p>\n<p>Joistakin eriskummallisuuksistaan huolimatta neural-doodle\/forward on mahtava ty\u00f6kalu. Olen pit\u00e4nyt sit\u00e4 joitakin p\u00e4ivi\u00e4 muuntamassa webbikamerakuvaa vaihtelevan tyylikuvan ja satunnaisten asetusten mukaan. Nopeuden lis\u00e4ksi neural-doodle\/forwardissa on slice-parametri jonka pit\u00e4isi mahdollistaa suuren kuvan k\u00e4sittely pienemm\u00e4ll\u00e4 muistikoolla. En ole t\u00e4t\u00e4 tarkkaan testannut, mutta joskus muistin loputtua olen sen avulla saanut kuvan tehty\u00e4. Skaalautuvuuteen voi siis olla t\u00e4ss\u00e4 ratkaisu. En ole kuitenkaan kokeillut pysyyk\u00f6 tyylin ulkoasu samana kuvakoon kasvaessa.<\/p>\n<p><a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13319832_10154350678878729_9121630049567734789_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-381 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13319832_10154350678878729_9121630049567734789_n.jpg\" alt=\"13319832_10154350678878729_9121630049567734789_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13631426_10154447075118729_4305692201693102001_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-382 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13631426_10154447075118729_4305692201693102001_n.jpg\" alt=\"13631426_10154447075118729_4305692201693102001_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13590365_10154441100598729_1529703482112326313_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-383 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13590365_10154441100598729_1529703482112326313_n.jpg\" alt=\"13590365_10154441100598729_1529703482112326313_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13407122_10154362334043729_9195650560963400310_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-384 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13407122_10154362334043729_9195650560963400310_n.jpg\" alt=\"13407122_10154362334043729_9195650560963400310_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13406702_10154358832833729_6778726443557436080_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-385 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13406702_10154358832833729_6778726443557436080_n.jpg\" alt=\"13406702_10154358832833729_6778726443557436080_n\" width=\"538\" height=\"301\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13335945_10154363850698729_7387738817002639327_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-386 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13335945_10154363850698729_7387738817002639327_n.jpg\" alt=\"13335945_10154363850698729_7387738817002639327_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13335635_10154353353698729_8706872279582061958_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-387 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13335635_10154353353698729_8706872279582061958_n.jpg\" alt=\"13335635_10154353353698729_8706872279582061958_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13332961_10154356924908729_2820591695876020740_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-388 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13332961_10154356924908729_2820591695876020740_n.jpg\" alt=\"13332961_10154356924908729_2820591695876020740_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13332785_10154353187183729_3501822723956145775_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-389 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13332785_10154353187183729_3501822723956145775_n.jpg\" alt=\"13332785_10154353187183729_3501822723956145775_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13319895_10154351699898729_4175794135248685437_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-390 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13319895_10154351699898729_4175794135248685437_n.jpg\" alt=\"13319895_10154351699898729_4175794135248685437_n\" width=\"539\" height=\"302\" \/><\/a> <a href=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13315332_10154355498193729_3888213330757277491_n.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-391 aligncenter\" src=\"http:\/\/liipetti.net\/erratic\/wp-content\/uploads\/2016\/08\/13315332_10154355498193729_3888213330757277491_n.jpg\" alt=\"13315332_10154355498193729_3888213330757277491_n\" width=\"539\" height=\"302\" \/><\/a><\/p>\n<p>Mik\u00e4 n\u00e4ist\u00e4 sovelluksista sitten on paras? Itselleni t\u00e4m\u00e4 ei oikeastaan ole mielek\u00e4s kysymys ollenkaan. Kaikki kolme ovat hyvi\u00e4 ty\u00f6kalua, ja kaikki ovat my\u00f6s erilaisia. Mill\u00e4\u00e4n niist\u00e4 ei ole helppo tehd\u00e4 samaa j\u00e4lke\u00e4 kuin toisella, liek\u00f6 edes mahdollistakaan. Sit\u00e4paitsi, ratkaisuja ja sovelluksia on muitakin, uutta tutkimusta ilmestyy p\u00e4ivitt\u00e4in ja sovellukset kehittyv\u00e4t samaa, hurjaa vauhtia. Nyt jo teemme n\u00e4ill\u00e4 juttuja joita emme vuosi sitten pit\u00e4neet j\u00e4rkev\u00e4sti mahdollisina.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tyylinsiirto neuroverkolla, jossa luodaan uusi kuva niin ett\u00e4 yhden kuvan sis\u00e4lt\u00f6 yhdistet\u00e4\u00e4n toisen kuvan tyyliin, syntyi noin vuosi sitten. Kaikki alkoi Leon Gatysin jne. tieteellisest\u00e4\u00a0artikkelista. Siin\u00e4 kuvattiin menetelm\u00e4, joka k\u00e4ytti konvoluutioneuroverkkoa yhdistettyn\u00e4 Gramianin matriiseihin (katso\u00a0Kuinka neural style toimii). Ei mennyt kauaakaan kun githubista jo l\u00f6ytyi toimivia toteutuksia. N\u00e4ist\u00e4 menestyksekk\u00e4in oli\u2026<\/p>\n<p class=\"continue-reading-button\"> <a class=\"continue-reading-link\" href=\"https:\/\/liipetti.net\/retkia\/tyylinsiirto-neuroverkolla-missa-nyt-mennaan\/\">Continue reading<i class=\"crycon-right-dir\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,2],"tags":[],"class_list":["post-39","post","type-post","status-publish","format-standard","hentry","category-kuvankasittely","category-neuroverkot"],"_links":{"self":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/39","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/comments?post=39"}],"version-history":[{"count":12,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/39\/revisions"}],"predecessor-version":[{"id":51,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/posts\/39\/revisions\/51"}],"wp:attachment":[{"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/media?parent=39"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/categories?post=39"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/liipetti.net\/retkia\/wp-json\/wp\/v2\/tags?post=39"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}