Efektīva TensorFlow 2.0: labākā prakse un izmaiņas

Iesūtīja TensorFlow komanda

Nesenā rakstā mēs pieminējām, ka TensorFlow 2.0 ir pārveidots, koncentrējoties uz izstrādātāju produktivitāti, vienkāršību un lietošanas vienkāršību.

Lai tuvāk apskatītu mainītās lietas un uzzinātu par labāko praksi, iepazīstieties ar jauno ceļvedi Efektīva TensorFlow 2.0 (publicēts vietnē GitHub). Šajā rakstā ir sniegts īss tajā atrodamā satura kopsavilkums. Ja kāda no šīm tēmām jūs interesē, dodieties uz ceļvedi, lai uzzinātu vairāk!

Īss galveno izmaiņu kopsavilkums

TensorFlow 2.0 ir daudz izmaiņu, lai padarītu lietotājus produktīvākus, ieskaitot lieko API noņemšanu, API saskanības uzlabošanu (Unified RNNs, Unified Optimizer) un labāku integrāciju Python izpildlaikos ar Eager izpildi.

Daudzi RFC (pārbaudiet tos, ja neesat viņiem jauns) ir izskaidrojuši izmaiņas un domāšanu, kas ir radījusi TensorFlow 2.0. Šajā rokasgrāmatā sniegts redzējums par to, kā vajadzētu izskatīties TensorFlow 2.0. Tiek pieņemts, ka jums ir zināmas zināšanas par TensorFlow 1.x.

API tīrīšana

Daudzas API vairs netiek izmantotas vai pārvietotas TF 2.0, un dažas ir aizstātas ar to 2.0 ekvivalentiem - tf.summary, tf.keras.metrics un tf.keras.optimizers. Vienkāršākais veids, kā automātiski lietot šos pārdēvējumus, ir izmantot v2 jaunināšanas skriptu.

Dedzīga izpilde

TensorFlow 1.X pieprasa lietotājiem manuāli salīmēt abstraktu sintakse koku (diagrammu), veicot tf. * API zvanus. Pēc tam lietotājiem tiek prasīts manuāli apkopot abstraktu sintakse koku, nododot izejas tenzoru un ieejas tenzoru kopu session.run () zvanam. Turpretī TensorFlow 2.0 darbojas dedzīgi (tāpat kā Python parasti to dara), un 2.0, diagrammām un sesijām vajadzētu justies kā ieviešanas detaļām.

Vairs nav globālu

TensorFlow 1.X ļoti paļāvās uz netieši globālajām nosaukumvietām. Kad jūs piezvanījāt tf.Variable (), tas tiks ievietots noklusējuma diagrammā un paliks tajā pat tad, ja pazaudēsit Python mainīgā rādītāju, kas uz to norāda. Pēc tam jūs varētu atgūt šo mainīgo, bet tikai tad, ja zinātu vārdu, ar kuru tas tika izveidots. To bija grūti izdarīt, ja jūs nekontrolējat mainīgā izveidi. Tā rezultātā izplatījās visa veida mehānismi, lai mēģinātu lietotājiem atkal atrast savus mainīgos.

TensorFlow 2.0 novērš visus šos mehānismus (Mainīgie 2.0 RFC) par labu noklusējuma mehānismam: Sekojiet līdzi mainīgajiem! Ja pazaudējat uzskaiti par mainīgu, tas savāc atkritumus. Plašāku informāciju skat.

Funkcijas, nevis sesijas

Sesijas session.run () zvans ir gandrīz kā funkcijas izsaukums: jūs norādāt ieejas un izsaucamo funkciju, un jūs saņemat atpakaļ izeju kopu. TensorFlow 2.0 jūs varat izrotāt Python funkciju, izmantojot tf.function (), lai atzīmētu to JIT kompilācijai, lai TensorFlow to darbinātu kā vienu diagrammu (Funkcijas 2.0 RFC).

Šis mehānisms ļauj TensorFlow 2.0 iegūt visas diagrammas režīma priekšrocības:

  • Veiktspēja: funkciju var optimizēt (mezglu atzarošana, kodola saplūšana utt.)
  • Pārnesamība: funkciju var eksportēt / reimportēt (SavedModel 2.0 RFC), ļaujot lietotājiem atkārtoti izmantot un dalīties ar modulārajām TensorFlow funkcijām.

Izmantojot iespēju brīvi šķērsot Python un TensorFlow kodu, jūs varat pilnībā izmantot Python izteiksmīgumu. Bet portatīvo TensorFlow izpilda kontekstā bez Python tulka - mobilais, C ++ un JS. Lai lietotājiem palīdzētu izvairīties no nepieciešamības pārrakstīt savu kodu, pievienojot @ tf.function, AutoGraph pārveidos Python konstrukciju apakškopu savos TensorFlow ekvivalentos.

Plašāku informāciju skat.

Ieteikumi idiomatiskai TensorFlow 2.0

Refaktorējiet savu kodu mazākās funkcijās

Kopīgs TensorFlow 1.X lietojuma paraugs bija “virtuves izlietnes” stratēģija, kurā tika priekšroku dota visu iespējamo aprēķinu apvienošana, un pēc tam atlasītie tenori tika novērtēti, izmantojot session.run (). TensorFlow 2.0 lietotājiem lietotājiem ir jāpārveido savs kods mazākās funkcijās, kuras tiek izsauktas pēc nepieciešamības. Parasti nav nepieciešams dekorēt katru no šīm mazākajām funkcijām ar tf.function; Izmantojiet tikai tf.function, lai rotā augsta līmeņa aprēķinus - piemēram, vienu apmācības soli vai sava modeļa pārsūtīšanu uz priekšu.

Izmantojiet Keras slāņus un modeļus, lai pārvaldītu mainīgos

Keras modeļi un slāņi piedāvā ērtus mainīgos un trainable_variables īpašības, kas rekursīvi apkopo visus atkarīgos mainīgos. Tas ļauj ērti pārvaldīt mainīgos lielumus lokāli, kur tie tiek izmantoti.

Keras slāņi / modeļi manto no tf.train.Checkpointable un ir integrēti ar @ tf.function, kas dod iespēju tieši kontrolpunktam vai eksportēt SavedModels no Keras objektiem. Lai izmantotu šīs integrācijas, jums nav obligāti jāizmanto Keras’s.fit () API.

Plašāku informāciju skat.

Apvieno tf.data.Datasets un @ tf.function

Atkārtojot atmiņā ietilpstošos treniņu datus, jūtieties brīvi izmantot regulāru Python iterāciju. Pretējā gadījumā tf.data.Dataset ir labākais veids, kā straumēt apmācības datus no diska. Datu kopas ir iterable (nevis iterator), un darbojas tāpat kā citas Python iterables Eager režīmā. Datu kopas async iepriekšējās ielādēšanas / straumēšanas funkcijas var pilnībā izmantot, iesaiņojot kodu tf.function (), kas Python iterāciju aizstāj ar līdzvērtīgām grafika operācijām, izmantojot AutoGraph.

@ tf.funkcija
def vilciens (modelis, datu kopa, optimizētājs):
 x, y datu kopā:
  ar tf.GradientTape () kā lenti:
   prognoze = modelis (x)
   zaudējumi = loss_fn (prognoze, y)
  slīpumi = lente.gradienti (zaudējumi, modelis.pārvietojamie mainīgie)
  optimizer.apply_gradients (slīpumi, model.trainable_variables)

Ja jūs izmantojat Keras .fit () API, jums nevajadzēs uztraukties par datu kopu atkārtošanu.

model.compile (optimizētājs = optimizētājs, zaudējumi = loss_fn)
model.fit (datu kopa)

Izmantojiet AutoGraph priekšrocības, izmantojot Python vadības plūsmu

AutoGraph nodrošina veidu, kā pārveidot no datiem atkarīgu vadības plūsmu grafika režīma ekvivalentos, piemēram, tf.cond un tf.while_loop.

Viena izplatīta vieta, kur parādās no datiem atkarīga vadības plūsma, ir secīgi modeļi. tf.keras.layers.RNN ietina RNN šūnu, ļaujot gan statiski, gan dinamiski atskrūvēt atkārtošanos. Demonstrācijas labad jūs varētu atkārtoti aktivizēt dinamisko ritināšanu šādi:

klase DynamicRNN (tf.keras.Model):
def __init __ (pats, rnn_cell):
 super (DynamicRNN, self) .__ init __ (self)
 self.cell = rnn_cell
def izsaukums (self, input_data):
 # [partija, laiks, funkcijas] -> [laiks, partija, funkcijas]
 input_data = tf.transponēt (input_data, [1, 0, 2])
 output = tf.TensorArray (tf.float32, input_data.shape [0])
 state = self.cell.zero_state (input_data.shape [1], dtype = tf.float32)
 i tf.range (ievades_datu forma [0]):
  izvade, stāvoklis = self.cell (ievades_dati [i], stāvoklis)
  output = output.write (i, output)
 atgriešanās tf.transponēt (output.stack (), [1, 0, 2]), stāvoklis

Plašāku informāciju skat.

Izmantojiet tf.metrics, lai apkopotu datus, un tf.summary, lai to reģistrētu

Visbeidzot, drīzumā parādīsies pilns tf.summary simbolu komplekts. Jūs varat piekļūt tf.summary 2.0 versijai, izmantojot:

no vietnes tensorflow.python.ops importa kopsavilkums_ops_v2

Plašāku informāciju skat.

Nākamie soļi

Šajā rakstā tika sniegts īss efektīvās TF 2.0 rokasgrāmatas kopsavilkums (ja jums ir interese par šīm tēmām, dodieties tur, lai uzzinātu vairāk!) Lai uzzinātu vairāk par TensorFlow 2.0, mēs iesakām arī šos jaunākos rakstus:

  • Ieguldījums TensorFlow: SIG, RFC, testēšana un dokumenti.
  • Kas ir simboliskas un obligātas API TensorFlow 2.0?
  • Standartizācija Keras: Norādījumi par augsta līmeņa API TensorFlow 2.0

Un, lūdzu, pieskaņojieties TensorFlow izstrādātāju samitam 6. un 7. martā. Kā vienmēr, visas sarunas tiks augšupielādētas vietnē YouTube lietotājiem, kuri nevar to sarunāt personīgi.