Što je TensorFlow? Kako funkcionira, Architekstura i značajke

⚡ Pametni sažetak

TensorFlow je platforma otvorenog koda Google izgrađen za strojno učenje, predstavljajući svaki izračun kao graf toka podataka tenzora. Ovaj pregled pokriva arhitekturu, komponente, način izvršavanja izračuna i način unosa podataka kroz ulazni cjevovod.

  • 🧮 Osnovni objekt: Tenzor je n-dimenzionalni niz čije vrijednosti dijele jedan tip podataka i poznati ili djelomično poznati oblik.
  • 🔗 Model grafa: Čvorovi nose operacije, bridovi nose tenzore, a cijeli graf se može spremiti, prenijeti i kasnije ponovno reproducirati.
  • 🏗️ Trostupanjski Architekstura: Prethodno obradite podatke, izgradite model, a zatim ga trenirajte i evaluirajte.
  • ⚠️ Granica verzije: tf.placeholder i tf.Session pripadaju TensorFlowu 1.x i uklonjeni su u verziji 2.0, koja se prema zadanim postavkama pokreće Eaglesful.
  • 💾 Učitavanje podataka: Učitajte male skupove podataka u memoriju pomoću pande i koristite tf.data cjevovode za sve što je preveliko da bi stalo.
  • 📊 Praćenje: TensorBoard vizualizira graf, metrike i raspodjelu težina dok se model trenira.

Što je TensorFlow Architektura

Što je TensorFlow?

TensorFlow je end-to-end platforma otvorenog koda za izradu aplikacija strojnog učenja. To je simbolična matematička knjižnica koja koristi tijek podataka i diferencijabilno programiranje za obavljanje različitih zadataka usmjerenih na obuku i zaključivanje dubokih neuronskih mreža. Programerima omogućuje stvaranje aplikacija za strojno učenje pomoću različitih alata, biblioteka i resursa zajednice.

Trenutno je najpoznatija knjižnica za duboko učenje na svijetu GoogleTensorFlow je. Google primjenjuje strojno učenje u svim svojim proizvodima kako bi poboljšao pretraživanje, prijevod, opise slika i preporuke.

Primjer TensorFlow

Da dam konkretan primjer, Google Korisnici mogu iskusiti brže i preciznije iskustvo pretraživanja uz pomoć umjetne inteligencije. Ako korisnik upiše ključnu riječ u traku za pretraživanje, Google daje preporuku o tome što bi mogla biti sljedeća riječ.

Primjer TensorFlow
Primjer TensorFlow

Google želi koristiti strojno učenje kako bi iskoristio svoje ogromne skupove podataka i pružio korisnicima najbolje iskustvo. Tri različite skupine koriste strojno učenje:

  • Istraživači
  • Znanstvenici podataka
  • programeri

Svi mogu koristiti isti skup alata za međusobnu suradnju i poboljšanje svoje učinkovitosti.

Google ne samo da sadrži velike skupove podataka, već i pokreće ogromnu računalnu infrastrukturu, pa je TensorFlow od samog početka izgrađen za skaliranje. TensorFlow je biblioteka koju je razvio Google Brain Team za ubrzanje strojnog učenja i istraživanja dubokih neuronskih mreža.

Napravljen je za rad na više CPU-a ili GPU-a, pa čak i na mobilnim operativnim sustavima, a ima nekoliko omotača na nekoliko jezika kao što su Python, C++ or Java.

Povijest TensorFlowa

Prije nekoliko godina, duboko učenje je počelo nadmašivati ​​sve ostale algoritme strojnog učenja pri obradi ogromne količine podataka. Google vidio je da može koristiti ove duboke neuronske mreže za poboljšanje svojih usluga:

  • Gmail
  • foto
  • Google tražilica

Izgradili su okvir pod nazivom TensorFlow kako bi istraživači i programeri mogli raditi na istom modelu, a zatim ga implementirati u mjerilu koje bi mnogi ljudi mogli koristiti.

TensorFlow je javno objavljen u studenom 2015., a verzija 1.0 uslijedila je u veljači 2017. Daleko veća promjena došla je s TensorFlow 2.0 u rujnu 2019., što je učinilo brzo izvršavanje zadanim i usvojilo Keras kao standardni API visoke razine. Od verzije 2.16 nadalje, Keras 3 je zadani, a isti kod modela može se izvoditi i na JAX-u ili Py-u.Torch pozadinski sustavi.

TensorFlow je objavljen pod licencom Apache 2.0, tako da ga možete koristiti, mijenjati i distribuirati, uključujući komercijalno, bez plaćanja Google.

Kako radi TensorFlow

TensorFlow vam omogućuje da izgradite grafove protoka podataka i strukture kako biste definirali kako se podaci kreću kroz graf uzimajući ulaze kao višedimenzionalni niz koji se zove Tensor. Omogućuje vam izradu dijagrama toka operacija koje se mogu izvesti na ovim ulazima, koji ide na jednom kraju, a dolazi na drugom kraju kao izlaz.

TensorFlow Architektura

Arhitektura TensorFlowa funkcionira u tri dijela:

  • Predobrada podataka
  • Izgradite model
  • Obučite i procijenite model

Zove se TensorFlow jer prima ulazne podatke kao višedimenzionalni niz, također poznat kao tenzori. Možete konstruirati neku vrstu dijagram toka operacija (nazvanih graf) koje želite izvesti na tom unosu. Ulaz ulazi na jednom kraju, a zatim teče kroz ovaj sustav višestrukih operacija i izlazi na drugom kraju kao izlaz.

Gdje se TensorFlow može pokrenuti?

Hardverski i softverski zahtjevi TensorFlowa podijeljeni su u dvije faze:

Faza razvoja: ovo je kada trenirate model, obično na stolnom ili prijenosnom računalu.

Faza izvođenja ili zaključivanjaNakon što je obuka završena, model se može pokretati na mnogim platformama:

  • Rad na stolnom računalu Windows, macOS ili Linux
  • Cloud kao web servis
  • Mobilni uređaji poput iOS-a i Android

Možete ga trenirati na više strojeva, a zatim ga možete pokrenuti na drugom stroju, nakon što dobijete obučeni model.

Model se može trenirati i koristiti na GPU-ima kao i na CPU-ima. GPU-i su izvorno dizajnirani za videoigre. Oko 2009. godine, istraživači sa Stanforda pokazali su da su GPU-i izuzetno učinkoviti u operacijama s matricama i linearnom algebrom o kojima ovise neuronske mreže. Duboko učenje oslanja se na puno množenja matrica. TensorFlow je vrlo brz u izračunavanju množenja matrica jer je napisan u C++. Iako je implementiran u C++, TensorFlowu se može pristupiti i kontrolirati uglavnom drugim jezicima, Python.

Još jedna značajna karakteristika je TensorBoard, koji vizualizira graf, metrike treniranja i raspodjelu težina dok se model izvodi.

Komponente TensorFlow

tenzor

Ime TensorFlowa izravno je izvedeno iz njegovog osnovnog okvira: tenzorU TensorFlowu, svi izračuni uključuju tenzore. Tenzor je vektor or matrica n-dimenzija koje predstavljaju sve vrste podataka. Sve vrijednosti u tenzoru sadrže identičan tip podataka s poznatim (ili djelomično poznatim) oblikovati. Oblik podataka je dimenzionalnost matrice ili niza.

Tenzor može nastati iz ulaznih podataka ili rezultata izračuna. U TensorFlowu se sve operacije provode unutar a grafikon. Graf je skup izračuna koji se odvija sukcesivno. Svaka se operacija naziva an operativni čvor i međusobno su povezani.

Grafikon ocrtava operacije i veze između čvorova. Međutim, ne prikazuje vrijednosti. Rub čvorova je tenzor, tj. način da se operacija popuni podacima.

Grafovi

TensorFlow koristi okvir grafa. Grafikon prikuplja i opisuje sve proračune serija obavljene tijekom obuke. Graf ima mnogo prednosti:

  • Radi na više CPU-a ili GPU-a, pa čak i na mobilnim operativnim sustavima
  • Prenosivost grafa omogućuje očuvanje izračuna za trenutnu ili kasniju upotrebu. Grafikon se može spremiti da se izvrši u budućnosti.
  • Sva izračunavanja u grafu rade se povezivanjem tenzora
    • Graf ima čvorove i bridove. Svaki čvor nosi matematičku operaciju i proizvodi izlaz, dok bridovi opisuju ulazne i izlazne odnose između čvorova. Sami tenzori putuju duž bridova.

Zašto je TensorFlow popularan?

TensorFlow je široko prihvaćen jer je dostupan na svim razinama stručnosti. Njegovi API-ji pokrivaju sve, od trolinijskog Keras modela do ručno izrađenog CNN-a ili RNN-a. Budući da se izračun izražava kao graf, TensorBoard može vizualizirati mrežu i znatno olakšati otklanjanje pogrešaka. Također se implementira u velikim razmjerima, radi na CPU-u, GPU-u i TPU-u, te na mobilnim uređajima putem TensorFlow Lite-a.

TensorFlow ostaje jedan od dva najčešće korištena okvira za duboko učenje na GitHubu, uz Py.Torch.

TensorFlow Algorithms

TensorFlow dolazi s estimatorima visoke razine za nekoliko klasičnih algoritama. U TensorFlowu 1.x oni su se nalazili pod tf.estimator:

  • Linearna regresija: tf.estimator.LinearRegressor
  • Klasifikacija: tf.estimator.LinearniKlasifikator
  • Klasifikacija dubokog učenja: tf.estimator.DNNClassifier
  • Široko i duboko učenje: tf.estimator.DNNLinearCombinedClassifier
  • Pojačana regresija stabla: tf.estimator.BoostedTreesRegressor
  • Pojačana klasifikacija stabla: tf.estimator.BoostedTreesClassifier

TensorFlow u odnosu na PyTorch: Koji biste trebali odabrati?

TensorFlow i PyTorch su dva dominantna okvira za duboko učenje, a praktične razlike su se znatno smanjile otkako je TensorFlow 2.0 usvojio brzo izvršavanje.

Kriteriji TensorFlow PyTorch
Razvijen od Google Mozak Meta AI
Izvršenje Nestrpljiv, s opcijskom kompilacijom grafa Nestrpljiv, s opcionalnom kompilacijom
API visoke razine Keras, izgrađen u Odvojene biblioteke kao što je Lightning
Mobilni i rubni uređaji Zrelo, putem TensorFlow Lite-a Poboljšanje, putem Execu-aTorch
Implementacija preglednika TensorFlow.js Zahtijeva konverziju u ONNX
Tipično uporište Proizvodnja i implementacija Istraživanje i eksperimentiranje

Pragmatičan odgovor: odaberite TensorFlow kada se model mora isporučiti na mobilne uređaje, preglednike ili upravljane poslužiteljske platforme, a odaberite Py.Torch kada iterirate na arhitekturi modela. Keras 3, zadani od TensorFlowa 2.16 nadalje, dodatno ublažava odluku jer se isti Keras kod može izvoditi na TensorFlowu, JAX-u ili Py-u.Torch pozadinski sustav.

Kako izračuni funkcioniraju u TensorFlowu

⚠️ Napomena o verziji: Upute u nastavku koriste TensorFlow 1.x stil grafa i sesije, što je najjasniji način da se vidi kako graf protoka podataka zapravo funkcionira. tf.placeholder(), tf.Session() i make_initializable_iterator() su uklonjeni u TensorFlowu 2.0 i izazvat će AttributeError na trenutnoj instalaciji. Odjeljak TensorFlow 1.x u odnosu na TensorFlow 2.x dalje nizu dan je moderni ekvivalent svakog primjera.

import numpy as np
import tensorflow as tf

U prva dva retka koda uvezli smo tensorflow kao tf. S Python, uobičajena je praksa koristiti kratki naziv za knjižnicu. Prednost je izbjegavanje upisivanja punog naziva biblioteke kada je trebamo koristiti. Na primjer, tensorflow možemo uvesti kao tf i pozvati tf kada želimo koristiti tensorflow funkciju

Vježbajmo osnovni tijek rada TensorFlowa s jednostavnim TensorFlow primjerima. Izradimo računalni graf koji množi dva broja.

Tijekom primjera, pomnožit ćemo X_1 i X_2. TensorFlow će stvoriti čvor za povezivanje operacije. U našem primjeru, to se zove množenje. Kada se graf odredi, TensorFlow računalni mehanizmi će pomnožiti X_1 i X_2.

Izračuni rade u TensorFlowu

Primjer TensorFlow

Konačno, pokrenut ćemo sesiju TensorFlow koja će pokrenuti računski graf s vrijednostima X_1 i X_2 i ispisati rezultat množenja.

Definirajmo ulazne čvorove X_1 i X_2. Kada stvaramo čvor u TensorFlowu, moramo odabrati koju vrstu čvora želimo stvoriti. Čvorovi X1 i X2 bit će čvor rezerviranog mjesta. Rezervirano mjesto dodjeljuje novu vrijednost svaki put kada napravimo izračun. Kreirat ćemo ih kao čvor rezerviranog mjesta TF točka.

Korak 1: Definirajte varijablu

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

Rezervirano mjesto treba tip podataka. To su brojevi, pa je tf.float32 pravi izbor. Argument imena je opcionalan, ali koristan, jer je to oznaka koja se pojavljuje u TensorBoard vizualizaciji grafa. X_2 je definiran na isti način.

Korak 2: Definirajte izračun

multiply = tf.multiply(X_1, X_2, name = "multiply")

Sada možemo definirati čvor koji izvršava operaciju množenja. U TensorFlowu to možemo učiniti stvaranjem čvora tf.multiply.

Prenijet ćemo čvorove X_1 i X_2 u čvor množenja. Kaže tensorflowu da poveže te čvorove u računskom grafu, pa tražimo od njega da izvuče vrijednosti iz x i y i pomnoži rezultat. Također dajmo čvoru množenja naziv multiply. To je cijela definicija našeg jednostavnog računskog grafa.

Korak 3: Izvršite operaciju

Za izvršavanje operacija na grafu moramo stvoriti sesiju. U TensorFlowu to se radi pomoću tf.Session(). Sada kada imamo sesiju, možemo zatražiti od sesije da izvrši operacije na našem računalnom grafu pozivom session. Za pokretanje izračuna moramo koristiti run.

Kada se operacija množenja izvršava, potrebne su joj vrijednosti čvorova X_1 i X_2, pa ih unosite tijekom izvođenja. To možemo učiniti navođenjem parametra pod nazivom feed_dict. Prosljeđujemo vrijednosti 1,2,3 za X_1 i 4,5,6 za X_2.

Ispisujemo rezultate s print(result). Trebali bismo vidjeti 4, 10 i 18 za 1×4, 2×5 i 3×6

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

multiply = tf.multiply(X_1, X_2, name = "multiply")

with tf.Session() as session:
    result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
    print(result)
[ 4. 10. 18.]

Opcije za učitavanje podataka u TensorFlow

Prvi korak prije treninga a algoritam strojnog učenja je učitavanje podataka. Postoje dva uobičajena načina učitavanja podataka:

1. Učitavanje podataka u memorijuTo je najjednostavnija metoda. Sve podatke učitavaš u memoriju kao jedan niz. Pišeš jednostavno Python za ovo; ništa od toga nije specifično za TensorFlow.

2. TensorFlow podatkovni cjevovodTensorFlow pruža ugrađeni API koji učitava podatke, primjenjuje transformacije i unosi podatke u model. Ova metoda funkcionira vrlo dobro, posebno kada imate veliki skup podataka. Na primjer, poznato je da su slikovni zapisi ogromni i ne stanu u memoriju. Cjevovod podataka sam upravlja memorijom.

Koje rješenje koristiti?

Učitavanje podataka u memoriju

Ako vaš skup podataka nije prevelik, tj. manji od 10 gigabajta, možete koristiti prvu metodu. Podaci mogu stati u memoriju. Za uvoz CSV datoteka možete koristiti poznatu biblioteku Pandas. Naučit ćete više o pandama u sljedećem vodiču.

Učitavanje podataka pomoću TensorFlow cjevovoda

Druga metoda najbolje funkcionira ako imate veliki skup podataka. Na primjer, ako imate skup podataka od 50 gigabajta, a vaše računalo ima samo 16 gigabajta memorije, stroj će se srušiti.

U ovoj situaciji, potrebno je izgraditi TensorFlow cjevovod. Cjevovod će učitavati podatke u serijama ili malim dijelovima. Svaka serija će biti poslana u cjevovod i bit će spremna za obuku. Izgradnja cjevovoda je izvrsno rješenje jer vam omogućuje korištenje paralelnog računanja. To znači da će TensorFlow trenirati model na više CPU-a. To ubrzava računanje i čini ga praktičnim za treniranje većih mreža.

Ukratko: učitajte male skupove podataka u memoriju pomoću pande i koristite TensorFlow cjevovod kada su podaci veliki ili kada želite paralelno učitavanje na više procesora.

Kako stvoriti TensorFlow cjevovod

Evo koraka za stvaranje TensorFlow cjevovoda:

U prethodnom primjeru ručno smo dodali tri vrijednosti za X_1 i X_2. Sada ćemo vidjeti kako učitati podatke u TensorFlow:

Korak 1) Stvorite podatke

Prije svega, upotrijebimo biblioteku numpy za generiranje dvije slučajne vrijednosti.

import numpy as np
x_input = np.random.sample((1,2))
print(x_input)

[[0.8835775 0.23766977]]

Korak 2) Stvorite rezervirano mjesto

Kao u prethodnom primjeru, stvaramo rezervirano mjesto s imenom X. Trebamo eksplicitno odrediti oblik tenzora. U tom slučaju ćemo učitati niz sa samo dvije vrijednosti. Možemo napisati oblik kao shape=[1,2]

# using a placeholder
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')

Korak 3) Definirajte metodu skupa podataka

Zatim moramo definirati skup podataka gdje možemo popuniti vrijednost rezerviranog mjesta x. Moramo koristiti metodu tf.data.Dataset.from_tensor_slices

dataset = tf.data.Dataset.from_tensor_slices(x)

Korak 4) Stvorite cjevovod

U četvrtom koraku moramo inicijalizirati cjevovod kojim će podaci teći. Moramo stvoriti iterator s make_initializable_iterator. Nazivamo ga iterator. Zatim trebamo pozvati ovaj iterator za unos sljedeće serije podataka, get_next. Ovaj korak nazivamo get_next. Imajte na umu da u našem primjeru postoji samo jedna serija podataka sa samo dvije vrijednosti.

iterator = dataset.make_initializable_iterator() 
get_next = iterator.get_next()

Korak 5) Izvršite operaciju

Posljednji korak je sličan prethodnom primjeru. Pokrećemo sesiju i pokrećemo iterator operacije. Feed_dict hranimo vrijednošću koju generira kvrgav. Ove dvije vrijednosti će popuniti rezervirano mjesto x. Zatim pokrećemo get_next za ispis rezultata.

with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iterator.initializer, feed_dict={ x: x_input }) 
    print(sess.run(get_next))
[0.8835775  0.23766978]

TensorFlow 1.x u odnosu na TensorFlow 2.x: Što se promijenilo

TensorFlow 2.0 bio je revolucionarna prerada API-ja usmjerenog na korisnika. Razumijevanje razlike je važno jer velika količina online tutorial koda, uključujući gornje primjere, cilja na stil 1.x.

Koncept TensorFlow 1.x TensorFlow 2.x
Model izvršenja Definirajte graf, a zatim ga pokrenite Nestrpljiv prema zadanim postavkama, operacije se izvršavaju odmah
Podaci o hranjenju tf.placeholder plus feed_dict Proći Python vrijednosti ili tenzora izravno
Izvođenje operacija tf.Session().run() Pozovite funkciju, nije potrebna sesija
API visoke razine tf.estimator Keras, tf.keras
Optimizacija grafa Uvijek na temelju grafova Uključite se s dekoratorom @tf.function
Iteriranje skupa podataka make_inicializable_iterator() Običan Python petlja for preko skupa podataka

Primjer množenja, prepisan. Tri koraka i sesija postaju jedna linija, jer se operacija izvršava u trenutku kada se pozove:

import tensorflow as tf

X_1 = tf.constant([1, 2, 3], dtype=tf.float32)
X_2 = tf.constant([4, 5, 6], dtype=tf.float32)

result = tf.multiply(X_1, X_2, name="multiply")
print(result.numpy())        # [ 4. 10. 18.]

Ulazni cjevovod, prepisan. Nije potreban rezervirano mjesto niti objekt iteratora:

import numpy as np
import tensorflow as tf

x_input = np.random.sample((1, 2))
dataset = tf.data.Dataset.from_tensor_slices(x_input)

for batch in dataset:
    print(batch.numpy())

Ako vam je potrebna brzina kompiliranog grafa, omotajte funkciju u @tf.function i TensorFlow tracautomatski ga pretvara u jedan. Starije 1.x skripte također se mogu izvršavati nepromijenjene putem imenskog prostora tf.compat.v1, iako je ta putanja samo za održavanje i ne bi se trebala koristiti za novi rad.

TensorFlow: Ključne informacije i Code Upućivanje

  • TensorFlow značenje: TensorFlow je najpoznatija knjižnica dubokog učenja posljednjih godina. Praktičar koji koristi TensorFlow može izgraditi bilo koju strukturu dubokog učenja, poput CNN-a, RNN-a ili jednostavne umjetne neuronske mreže.
  • TensorFlow uglavnom koriste akademici, startupi i velike tvrtke. Google koristi TensorFlow u gotovo svemu Google dnevni proizvodi, uključujući Gmail, Fotografija i Google Tražilica.
  • The Google Tim Brain razvio je TensorFlow kako bi smanjio jaz između istraživača i programera proizvoda. Godine 2015. učinili su TensorFlow javnim; njegova popularnost brzo raste. Danas je TensorFlow biblioteka za duboko učenje s najviše repozitorija na GitHubu.
  • Praktičari koriste TensorFlow jer se lako implementira u velikim razmjerima, u oblaku, u pregledniku ili na mobilnim uređajima s iOS-om i Android.

TensorFlow radi u sesiji. Svaka sesija definirana je grafom s različitim izračunima. Jednostavan primjer može biti množenje za dobivanje broja. U TensorFlowu su potrebna tri koraka:

  1. Definirajte varijablu
X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")
  1. Definirajte izračun
multiply = tf.multiply(X_1, X_2, name = "multiply")
  1. Izvršite operaciju
with tf.Session() as session:
    result = session.run(multiply, feed_dict={X_1: [1, 2, 3], X_2: [4, 5, 6]})
    print(result)

Jedna uobičajena praksa u TensorFlowu je stvaranje cjevovoda za učitavanje podataka. Ako slijedite ovih pet koraka, moći ćete učitati podatke u TensorFLow:

  1. Stvorite podatke
import numpy as np
x_input = np.random.sample((1,2))
print(x_input)
  1. Stvorite rezervirano mjesto
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')
  1. Definirajte metodu skupa podataka
dataset = tf.data.Dataset.from_tensor_slices(x)
  1. Stvorite cjevovod
iterator = dataset.make_initializable_iterator()
get_next = iterator.get_next()
  1. Izvršite program
with tf.Session() as sess:
    sess.run(iterator.initializer, feed_dict={x: x_input})
    print(sess.run(get_next))

Pitanja i odgovori

tf.placeholder pripada TensorFlowu 1.x i uklonjen je u verziji 2.0, koja se izvršava brzo i ne treba joj rezervirana mjesta. Vrijednosti se mogu prenijeti izravno ili se koristiti tf.compat.v1 za pokretanje starih skripti bez promjena.

Tenzor je n-dimenzionalni niz gdje svaki element dijeli jedan tip podataka. Skalar je ranga 0, vektor ranga 1, matrica ranga 2, a serija slika je obično ranga 4.

Keras je API visoke razine za definiranje i treniranje modela, dok je TensorFlow temeljni računalni mehanizam. Od verzije 2.16, TensorFlow isporučuje Keras 3, koji se također može pokretati na JAX-u ili Py-u.Torch.

TensorFlow odgovara produkcijskoj umjetnoj inteligenciji: klasifikaciji slika, obradi prirodnog jezika, sustavima preporuka i bilo kojem modelu koji se mora implementirati na mobilne uređaje, preglednike ili klastere za posluživanje.

Da. AI asistenti mogu prepisati kod sesije i rezerviranog mjesta u odgovarajuće ekvivalente i označiti funkcije koje su uklonile oznake. Numerički provjerite izlaz u odnosu na original prije nego što ukinete stari skript.

Sažmite ovu objavu uz: