Effectieve TensorFlow 2.0: best practices en wat er is veranderd

Geplaatst door het TensorFlow-team

In een recent artikel hebben we vermeld dat TensorFlow 2.0 opnieuw is ontworpen met een focus op de productiviteit, eenvoud en gebruiksgemak van ontwikkelaars.

Bekijk de nieuwe Effective TensorFlow 2.0-handleiding (gepubliceerd op GitHub) om de veranderingen te bekijken en meer te weten te komen over best practices. Dit artikel geeft een korte samenvatting van de inhoud die u daar zult vinden. Als een van deze onderwerpen u interesseert, ga dan naar de gids voor meer informatie!

Een korte samenvatting van belangrijke wijzigingen

Er zijn veel wijzigingen in TensorFlow 2.0 om gebruikers productiever te maken, waaronder het verwijderen van redundante API's, het consistenter maken van API's (Unified RNN's, Unified Optimizers) en betere integratie met de Python-runtime met Eager-uitvoering.

Veel RFC's (bekijk ze, als ze nieuw voor je zijn!) Hebben de veranderingen en het denken uitgelegd die zijn doorgevoerd in het maken van TensorFlow 2.0. Deze gids geeft een visie voor de ontwikkeling van TensorFlow 2.0. Er wordt aangenomen dat u bekend bent met TensorFlow 1.x.

API opruimen

Veel API's zijn verdwenen of verplaatst in TF 2.0, en sommige zijn vervangen door hun 2.0-equivalenten - tf.s summary, tf.keras.metrics en tf.keras.optimizers. De eenvoudigste manier om deze hernamen automatisch toe te passen, is door het upgradescript van v2 te gebruiken.

Enorme uitvoering

TensorFlow 1.X vereist dat gebruikers handmatig een abstracte syntax-structuur (de grafiek) samenvoegen door tf. * API-aanroepen te doen. Vervolgens moeten gebruikers de abstracte syntaxisboom handmatig compileren door een set uitvoertensoren en invoertensoren door te geven aan een sessie session.run (). TensorFlow 2.0 wordt daarentegen enthousiast uitgevoerd (zoals Python normaal doet) en in 2.0 moeten grafieken en sessies aanvoelen als implementatiedetails.

Geen globals meer

TensorFlow 1.X was sterk afhankelijk van impliciet wereldwijde naamruimten. Als u tf.Variable () aanroept, wordt dit in de standaardgrafiek geplaatst en blijft het staan, zelfs als u de Python-variabele uit het oog verliest. Je zou die tf.Variabele dan kunnen herstellen, maar alleen als je de naam wist waarmee hij was gemaakt. Dit was moeilijk te doen als je geen controle had over het maken van de variabele. Het gevolg was dat allerlei mechanismen zich uitbreidden om te proberen gebruikers te helpen hun variabelen terug te vinden.

TensorFlow 2.0 elimineert al deze mechanismen (Variabelen 2.0 RFC) ten gunste van het standaardmechanisme: houd uw variabelen bij! Als je een Tf.Variable uit het oog verliest, wordt er afval verzameld. Zie de gids voor meer informatie.

Functies, geen sessies

Een aanroep session.run () lijkt bijna op een functieaanroep: u geeft de ingangen en de aan te roepen functie op en u krijgt een set uitgangen terug. In TensorFlow 2.0 kunt u een Python-functie decoreren met tf.function () om deze te markeren voor JIT-compilatie zodat TensorFlow deze als een enkele grafiek uitvoert (Functions 2.0 RFC).

Met dit mechanisme profiteert TensorFlow 2.0 van alle voordelen van de grafische modus:

  • Prestaties: de functie kan worden geoptimaliseerd (knoopsnoei, kernelfusie, enz.)
  • Draagbaarheid: de functie kan worden geëxporteerd / opnieuw geïmporteerd (SavedModel 2.0 RFC), zodat gebruikers modulaire TensorFlow-functies kunnen hergebruiken en delen.

Met de mogelijkheid om Python en TensorFlow-code vrij te gebruiken, kunt u volledig profiteren van de expressiviteit van Python. Maar draagbare TensorFlow wordt uitgevoerd in contexten zonder een Python-interpreter - mobiel, C ++ en JS. Om gebruikers te helpen voorkomen dat ze hun code moeten herschrijven bij het toevoegen van @ tf.function, converteert AutoGraph een subset van Python-constructen naar hun TensorFlow-equivalenten.

Zie de gids voor meer informatie.

Aanbevelingen voor idiomatische TensorFlow 2.0

Verander uw code in kleinere functies

Een gebruikelijk gebruikspatroon in TensorFlow 1.X was de strategie van de "gootsteen", waarbij de unie van alle mogelijke berekeningen preventief werd vastgelegd en vervolgens geselecteerde tensoren werden geëvalueerd via session.run (). In TensorFlow 2.0 moeten gebruikers hun code omzetten in kleinere functies die naar behoefte worden aangeroepen. Over het algemeen is het niet nodig om elk van deze kleinere functies te decoreren met tf.function; gebruik tf.functie alleen om berekeningen op hoog niveau te versieren - bijvoorbeeld een trainingsstap of de voorwaartse pass van uw model.

Gebruik Keras-lagen en -modellen om variabelen te beheren

Keras-modellen en -lagen bieden de handige variabelen en trainable_variables eigenschappen, die recursief alle afhankelijke variabelen verzamelen. Dit maakt het gemakkelijk om variabelen lokaal te beheren tot waar ze worden gebruikt.

Lagen / modellen van Keras erven van tf.train.Checkpointable en zijn geïntegreerd met @ tf.functionaliteit, waardoor het mogelijk is om opgeslagen modellen direct van Keras-objecten te controleren of te exporteren. U hoeft Keras’s.fit () API niet noodzakelijkerwijs te gebruiken om van deze integraties te profiteren.

Zie de gids voor meer informatie.

Combineer tf.data.Datasets en @ tf.function

Bij het herhalen van trainingsgegevens die in het geheugen passen, kunt u regelmatig Python-iteratie gebruiken. Anders is tf.data.Dataset de beste manier om trainingsgegevens van schijf te streamen. Datasets zijn iterables (geen iterators) en werken net als andere Python iterables in Eager-modus. U kunt de dataset async prefetching / streaming-functies volledig gebruiken door uw code te verpakken in tf.function (), die Python-iteratie vervangt door de equivalente grafische bewerkingen met AutoGraph.

@ tf.function
def trein (model, dataset, optimizer):
 voor x, y in dataset:
  met tf.GradientTape () als tape:
   voorspelling = model (x)
   loss = loss_fn (voorspelling, y)
  verlopen = tape.gradients (verlies, model.trainable_variables)
  optimizer.apply_gradients (verlopen, model.trainable_variables)

Als u de API Keras .fit () gebruikt, hoeft u zich geen zorgen te maken over iteratie van gegevensset.

model.compile (optimizer = optimizer, loss = loss_fn)
model.fit (dataset)

Profiteer van AutoGraph met Python-besturingsstroom

AutoGraph biedt een manier om gegevensafhankelijke besturingsstromen om te zetten in grafische modusequivalenten zoals tf.cond en tf.while_loop.

Een veel voorkomende plaats waar gegevensafhankelijke besturingsstroom verschijnt is in sequentiemodellen. tf.keras.layers.RNN verpakt een RNN-cel, zodat u de herhaling statisch of dynamisch kunt ontrollen. Voor de demonstratie zou u dynamische afrollen als volgt opnieuw kunnen implementeren:

klasse DynamicRNN (tf.keras.Model):
def __init __ (self, rnn_cell):
 super (DynamicRNN, self) .__ init __ (self)
 self.cell = rnn_cell
def-aanroep (self, input_data):
 # [batch, tijd, functies] -> [tijd, batch, functies]
 input_data = tf.transpose (input_data, [1, 0, 2])
 outputs = tf.TensorArray (tf.float32, input_data.shape [0])
 state = self.cell.zero_state (input_data.shape [1], dtype = tf.float32)
 voor i in tf.range (input_data.shape [0]):
  output, state = self.cell (input_data [i], state)
  outputs = outputs.write (i, output)
 retourneer tf.transpose (outputs.stack (), [1, 0, 2]), status

Zie de gids voor meer informatie.

Gebruik tf.metrics om gegevens te verzamelen en tf.samenvatting om deze te loggen

Eindelijk komt er een complete set tf.samenvattingssymbolen. U kunt de 2.0-versie van tf.s summary openen met:

van tensorflow.python.ops import summary_ops_v2

Zie de gids voor meer informatie.

Volgende stappen

Dit artikel gaf een korte samenvatting van de Effectieve TF 2.0-gids (als u geïnteresseerd bent in deze onderwerpen, gaat u daarheen voor meer informatie!) Voor meer informatie over TensorFlow 2.0 raden we ook deze recente artikelen aan:

  • Bijdragen aan TensorFlow: SIG's, RFC's, testen en documenten.
  • Wat zijn symbolische en imperatieve API's in TensorFlow 2.0?
  • Standaardiseren op Keras: richtlijnen voor API's op hoog niveau in TensorFlow 2.0

En stem af op de TensorFlow-ontwikkelaarstop op 6 en 7 maart. Zoals altijd worden alle gesprekken geüpload naar YouTube voor mensen die het niet persoonlijk kunnen redden.