Tekoälyn maailmassa on viime aikoina tapahtunut huomattavaa kehitystä kuljettajattomien autojen erittäin julkistetusta edistyksestä koneisiin, jotka nyt muodostavat Chopin-jäljitelmät tai vain olla todella hyvä videopeleissä .
Keskeisiä näissä edistysaskeleissa ovat eräät työkalut, jotka auttavat saamaan syvällisen oppimisen ja muut koneoppimismallit, erityisesti Torch, Caffe ja Theano. Koska Google Brain siirtyi avoimeen lähdekoodiin marraskuussa 2015 omalla puitteet , TensorFlow, olemme havainneet tämän ohjelmistokirjaston suosion nousevan puitteet suosituin syväoppiminen.
Miksi näin on tapahtunut? Syitä ovat suuri määrä saatavilla olevaa tukea ja dokumentaatiota, sen valmistelu tuotantoa varten, laskelmien jakamisen helppous useille laitteille ja erinomainen visualisointityökalu: Tensorboard .
Viime kädessä TensorFlow onnistuu yhdistämään kattavan ja joustavan teknisten ominaisuuksien joukon erittäin helppokäyttöiseksi.
Tässä artikkelissa saat käsityksen tämän työkalun mekaniikasta käyttämällä sitä ratkaisemaan yleinen numeerinen ongelma hyvin sen ulkopuolella, mitä koneoppiminen normaalisti tarkoittaa, ennen kuin esität sen käyttötarkoitukset syvälliseen oppimiseen yksinkertaisella hermoverkon toteutuksella.
Oletetaan, että koneoppimismenetelmät ymmärretään perusteellisesti. Jos haluat päästä kiinni, tarkista tämä julkaisu .
Kun aiomme esitellä Python-sovellusliittymän, myös Numpyn ymmärtäminen on hyödyllistä.
Määritä TensorFlow noudattamalla löytämiäsi ohjeita tässä .
Jos käytät Windowsia, sinun on huomattava, että tämän asiakirjan kirjoittamisen aikana sinun on käytettävä Python 3.4+, ei 2.7.
Kun olet valmis, sinun pitäisi pystyä tuomaan kirjasto seuraavilla tavoilla:
import tensorflow as tf
TensorFlow-ohjelmien rakentaminen koostuu yleensä kahdesta päävaiheesta, joista ensimmäinen on laskennallisen kaavion rakentaminen, joka kuvaa suoritettavat laskelmat, mutta ei tosiasiallisesti suorita niitä tai ole mitään arvoa.
Kuten kaikilla kaavioilla, meillä on solmuja ja reunoja. Reunat edustavat tensoreita, tensoria, joka edustaa n-ulotteista matriisia. Esimerkiksi tensori, jonka ulottuvuus (tai sijoitus TensorFlow-puheessa) 0 on skalaari, sijoitus 1 on vektori, sijoitus 2 on matriisi ja niin edelleen.
Solmut edustavat toimintoja, jotka tuottavat lähtöjännitteitä ja ottavat tarvittaessa tensoreita tuloina. Tällaisia toimintoja ovat lisäykset (tf.add
), matriisikertomukset (tf.matmul
) sekä vakioiden luominen (tf.constant
).
Joten yhdistetään joitain näistä ensimmäiseen kaavioon.
a = tf.constant([2.5, 2]) b = tf.constant([3, 6], dtype=tf.float32) total = tf.add(a, b)
Täällä olemme luoneet kolme operaatiota, kaksi näistä vakioiden 1-d-taulukoiden luomiseksi.
Tietotyypit päätetään välitetystä arvo-argumentista tai voit merkitä ne argumentilla dtype
Jos en olisi tehnyt tätä b
: lla, niin int32
olisi tullut johtopäätöksi ja virheeksi olisi annettu tf.add
Olisin yrittänyt määritellä lisäyksen kahteen eri tyyppiin.
Kaavio on määritelty, mutta jotta voimme tehdä laskelmat sille (tai sen osalle), meidän on asennettava TensorFlow-istunto.
sess = tf.Session()
Vaihtoehtoisesti, jos suoritamme istunnon interaktiivisessa konsolissa, kuten IPython, käytämme:
sess = tf.InteractiveSession()
run
istuntokohteessa on tapa arvioida tensori.
Siksi arvioidaksemme edellä määritetyn lisäyslaskennan, läpäisemme 'total', Tensorin poistettavan, joka edustaa op tf.add
-tulosta.
print(sess.run(total)) # [ 5.5 8. ]
Tässä vaiheessa esitellään TensorFlow-muuttuja. Jos vakiot ovat kiinteä osa kuvaajan määritelmää, muuttujia voidaan päivittää. Luokkakonstruktori vaatii alkuarvon, mutta muuttujat edellyttävät operaatiota niiden nimenomaiseen alustamiseen, ennen kuin niille suoritetaan muita operaatioita.
Muuttujat ylläpitävät kaavion tilaa tietyssä istunnossa, joten meidän on tarkkailtava, mitä tapahtuu useille istunnoille käyttämällä samaa kaaviota muuttujien ymmärtämiseksi paremmin.
# Crea una variable con un valor inicial de 1 some_var = tf.Variable(1) # Crea una op para ejecutar inicializadores de variables init_op = tf.global_variables_initializer() # Crea una op para reemplazar el valor mantenido por some_var a 3 assign_op = some_var.assign(3) # Instala dos instancias de una sesión sess1 = tf.Session() sess2 = tf.Session() # Inicializa variables en ambas sesiones sess1.run(init_op) sess2.run(init_op) print(sess1.run(some_var)) # Salidas 1 # Cambia some_var en sesión1 sess1.run(assign_op) print(sess1.run(some_var)) # Salidas 3 print(sess2.run(some_var)) # Salidas 1 # Cierra Sesiones sess1.close() sess2.close()
Olemme asentaneet kaavion ja kaksi istuntoa.
Kun olet suorittanut alustuksen molemmissa istunnoissa (jos emme suorita tätä ja sitten arvioimme muuttujan, johon osuimme virheeseen), suoritamme tehtävänoperaation vain yhdessä istunnossa. Kuten näette, muuttujan arvo säilyy, mutta ei kaikissa istunnoissa.
Toinen tärkeä TensorFlow-käsite on paikkamerkki. Vaikka muuttujat ylläpitävät tilaa, paikkamerkkejä käytetään määrittämään, mitä syötteitä kaavio voi odottaa ja sen tietotyyppi (ja valinnaisesti muoto). Voimme sitten syöttää tietoja kaavioon näiden paikkamerkkien kautta, kun suoritamme laskutoimituksen.
TensorFlow-kaavio on alkanut näyttää hermoverkoilta, joita haluamme kouluttaa, mutta ennen sitä käytämme käsitteitä yleisen rahoitusongelman ratkaisemiseksi rahoitusmaailmassa.
Oletetaan, että haluamme löytää y
tällaisessa yhtälössä:
varten v
annettu (vakion C
ja P
kanssa).
Tämä on kaava markkina-arvolainan y
, pääoma v
ja kuponkikohdan P
eräpäivän tuotto (C
) laskemiseksi maksetaan puolivuosittain, mutta diskontatut kassavirrat jatkuvana kokoonpanona.
Pohjimmiltaan meidän on ratkaistava tällainen yhtälö kokeilulla ja virheillä, ja valitsemme puolitusmenetelmän keskittyäksesi lopulliseen arvoon y
Ensin mallinnetaan tämä ongelma TensorFlow-kaaviona.
C
ja P
ne ovat kiinteitä vakioita ja ovat osa kaavion määritelmää. Haluamme prosessin, joka tarkentaa y
: n ala- ja ylärajaa. Siksi nämä rajat (merkitty 'a' ja 'b') ovat hyviä ehdokkaita muuttujille, joita on muutettava jokaisen 'y' arvauksen jälkeen (jota pidetään 'a': n ja 'b': n keskipisteenä).
# Especifica los valores que generarán nuestras operaciones constantes C = tf.constant(5.0) P = tf.constant(100.0) # Especificamos los valores iniciales que serán nuestros límites inferior y superior cuando se inicialicen. # Obviamente, el éxito final de este algoritmo depende de puntos de partida decentes a = tf.Variable(-10.0) b = tf.Variable(10.0) # Esperamos que se inserte un número flotante en la gráfica v_target = tf.placeholder('float') # Recuerda que las siguientes operaciones son definiciones, # ninguna se lleva a cabo hasta que se evalúa una operación en una sesión! y = (a+b)/2 v_guess = C*tf.exp(-0.5*y) + C*tf.exp(-y) + C*tf.exp(-1.5*y) + (C + P)*tf.exp(-2*y) # Operaciones para establecer valores temporales (a_ y b_) destinado a ser los próximos valores de a y b. # ej. si la conjetura resulta en una v mayor que la v objetivo, # estableceremos a_ como el valor actual de y a_ = tf.where(v_guess > v_target, y, a) b_ = tf.where(v_guess Joten nyt meillä on luettelo toiminnoista ja muuttujista, joista kaikkia voidaan arvioida tietyn istunnon perusteella. Jotkut näistä operaatioista riippuvat muista suoritettavista operaatioista, joten suoritetaan esimerkiksi v_guess
laukaisee ketjureaktion muille tensoreille, kuten C
ja P
, arvioidaan ensin.
Jotkut näistä operaatioista riippuvat paikkamerkistä, jolle arvo on määritettävä, niin miten syötämme kyseisen arvon?
Tämä tehdään argumentilla feed_dict
funktiossa run
.
Jos haluat arvioida a_
, liitämme paikkamerkkimme v_target
arvon seuraavasti:
sess.run(a_, feed_dict={v_target: 100})
Antaa tuloksena 0,0.
Yhdistä v_target
130: sta ja saamme -10,0.
'Vaihe' -operaatiomme edellyttää, että kaikki muut toiminnot suoritetaan ennakkoedellytyksenä ja joka suorittaa koko kaavion. Se on myös toiminto, joka todella muuttaa istuntomme todellisen tilan. Siksi mitä enemmän suoritamme vaihetta, sitä enemmän työnnämme asteittain muuttujia a
ja b
kohti y
: n todellista arvoa.
Joten sanotaan arvomme v
yhtälömme on yhtä suuri kuin 95. Perustetaan istunto ja suoritetaan kaaviosi siinä 100 kertaa.
# Configurar una sesión e inicializar variables sess = tf.Session() tf.global_variables_initializer().run() # Ejecuta la operación de paso (y, por lo tanto, toda la gráfica) 100 veces para i en el rango (100): sess.run(step, feed_dict={v_target:95})
Jos arvioimme tensorin y
nyt saamme jotain toivottavaa vastausta
print(sess.run(y)) # 0.125163
Neuroverkot
Nyt kun olemme ymmärtäneet TensorFlow'n mekaniikan, voimme yhdistää tämän muutamiin TensorFlow'n sisäänrakennettuihin koneoppimistoimintoihin yksinkertaisen hermoverkon kouluttamiseksi.
Tässä haluaisimme luokitella datapisteet 2d-koordinaattijärjestelmään sen mukaan, putoavatko ne tietylle alueelle ympyrään, jonka säde on 0,5 keskitettynä alkupisteeseen.
Tietenkin tämä voidaan tarkistaa konkreettisesti yksinkertaisesti etsimällä tiettyä pistettä (a,b)
kyllä a^2 + b^2 <0.5
, mutta tässä koneoppimiskokeessa haluaisimme sen sijaan käydä läpi harjoitusjoukon: sarjan satunnaisia pisteitä ja kuuluvatko ne ennustetulle alueellemme. Tässä on yksi tapa luoda tämä:
import numpy as np NO_OF_RANDOM_POINTS = 100 CIRCLE_RADIUS = 0.5 random_spots = np.random.rand(NO_OF_RANDOM_POINTS, 2) * 2 - 1 is_inside_circle = (np.power(random_spots[:,0],2) + np.power(random_spots[:,1],2) Luomme hermoverkon, jolla on seuraavat ominaisuudet:
- Se koostuu kahdesta solmusta tulevasta tulokerroksesta, jossa syötämme sarjamme 'random_spots' sisältämiä kaksiulotteisia vektoreita. Tätä edustaa paikkamerkki, joka odottaa harjoitustietoja.
- Lähtökerroksessa on myös kaksi solmua, joten meidän on syötettävä harjoitusleimojen sarja ('is_inside_circle') skalaarin paikkamerkkiin ja sitten muutettava nämä arvot kaksiulotteiseksi kuumaksi vektoriksi.
- Meillä on piilotettu kerros, joka koostuu kolmesta solmusta, joten meidän on käytettävä muuttujia painomatriiseissamme ja biasvektoreissamme, koska nämä ovat arvoja, jotka on puhdistettava harjoittelun aikana.
INPUT_LAYER_SIZE = 2 HIDDEN_LAYER_SIZE = 3 OUTPUT_LAYER_SIZE = 2 # Los valores iniciales para los pesos y los sesgos se dibujan aleatoria y uniformemente a partir de [-1, 1] # Por ejemplo, W1 es una matriz de forma 2x3 W1 = tf.Variable(tf.random_uniform([INPUT_LAYER_SIZE, HIDDEN_LAYER_SIZE], -1, 1)) b1 = tf.Variable(tf.random_uniform([HIDDEN_LAYER_SIZE], -1, 1)) W2 = tf.Variable(tf.random_uniform([HIDDEN_LAYER_SIZE, OUTPUT_LAYER_SIZE], -1, 1)) b2 = tf.Variable(tf.random_uniform([OUTPUT_LAYER_SIZE], -1, 1)) # Especificando que el marcador de posición X puede esperar una matriz de 2 columnas (pero cualquier cantidad de filas) # representando lugares aleatorios X = tf.placeholder(tf.float32, [None, INPUT_LAYER_SIZE]) # El marcador de posición Y puede esperar números enteros que representen si el punto correspondiente está en el círculo # o no (sin forma específica) Y = tf.placeholder(tf.uint8) # Una op para convertir a un único vector caliente onehot_output = tf.one_hot(Y, OUTPUT_LAYER_SIZE)
Kaavion määrittelyn täydentämiseksi määritämme joitain operaatioita, jotka auttavat meitä kouluttamaan muuttujia parempaan luokittelijaan. Näitä ovat matriisilaskelmat, aktivointitoiminnot ja optimoija.
LEARNING_RATE = 0.01 # Op para ejecutar un cálculo de matriz X*W1 + b1 hidden_layer = tf.add(tf.matmul(X, W1), b1) # Utiliza la función de activación sigmoidea en el resultado activated_hidden_layer = tf.sigmoid(hidden_layer) # Aplica los siguientes pesos y sesgo (W2, b2) a la capa oculta y luego aplica la función softmax # para obtener nuestra capa de salida (cada vector sumando 1) output_layer = tf.nn.softmax(tf.add(tf.matmul(activated_hidden_layer, W2), b2)) # Calcula la entropía cruzada para nuestra función de pérdida loss = -tf.reduce_sum(onehot_output * tf.log(output_layer)) # Utiliza el optimizador de descenso de gradiente a la velocidad de aprendizaje especificada para minimizar el valor dado por el tensor de pérdida train_step = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss)
Kaavion asettamisen jälkeen on aika perustaa istunto ja suorittaa 'junapassi' (joka suorittaa myös ennakkoedellytykset). Jotkut näistä toiminnoista käyttävät paikkamerkkejä, joten arvot on annettava. Tämä harjoitteluvaihe edustaa aikakautta oppimisalgoritmissamme, ja sellaisenaan se on sidottu haluamiemme aikakausien määrään. Voimme käyttää kaavion muita osia, kuten 'häviötensoria' informaatiotarkoituksiin.
EPOCH_COUNT = 1000 sess = tf.Session() tf.global_variables_initializer().run() para i en rango(EPOCH_COUNT): if i%100 == 0: print('Loss after %d runs: %f' % (i, sess.run(loss, feed_dict={X: random_spots, Y: is_inside_circle}))) sess.run(train_step, feed_dict={X: random_spots, Y: is_inside_circle}) print('Final loss after %d runs: %f' % (i, sess.run(loss, feed_dict={X: random_spots, Y: is_inside_circle})))
Kun olemme kouluttaneet algoritmin, voimme syöttää pisteen ja saada hermoverkon lähdön näin:
sess.run(output_layer, feed_dict={X: [[1, 1]]}) # Hopefully something close to [1, 0] sess.run(output_layer, feed_dict={X: [[0, 0]]}) # Hopefully something close to [0, 1]
Piste voidaan luokitella ympyrän ulkopuolelle, jos lähtövektorin ensimmäinen jäsen on suurempi kuin 0,5, muuten sisällä. Suoritettaessa tensoria output_layer
Monista pisteistä voimme saada käsityksen siitä, kuinka oppija visualisoi alueen, joka sisältää positiivisesti järjestetyt pisteet. Harjoittelusarjan koko, oppimisnopeus ja muut parametrit ovat pelaamisen arvoisia, jotta voimme nähdä, kuinka lähellä pääsemme aiotulle ympyrälle.

Harjoitussarja: 100 pistettä
Oppimisnopeus: 0,01
Ajat: 1000

Harjoittelusetti: 1000 pistettä
Oppimisnopeus: 0,01
Ajat: 1000

Harjoittelusetti: 1000 pistettä
Oppimisnopeus: 0,01
Ajat: 10000

Harjoittelusetti: 1000 pistettä
Oppimisnopeus: 0,0001
Ajat: 10000
Loppuun
Tämä on hyvä oppitunti, että koulutussarjan kasvu tai ajankäyttö ei takaa hyvää opiskelijaa, joten oppimisnopeus on sovitettava asianmukaisesti.
Onneksi nämä demot ovat antaneet sinulle hyvän käsityksen TensorFlow-ohjelman perusteista ja tarjoavat vankan perustan monimutkaisempien tekniikoiden toteuttamiseen.
Emme ole käsittäneet sellaisia käsitteitä kuin Tensorboard tai harjoittaneet mallejamme näytönohjaimilla, mutta nämä ovat hyvin käsiteltyjä TensorFlow-dokumentaatio . Asiakirjoista löytyy erilaisia reseptejä, jotka voivat auttaa sinua pääsemään vauhtiin jännittävien syvällisten oppimistehtävien avulla tällä tehokkaalla kehyksellä.