Për të gjithë të pa iniciuarit: "TensorFlow" është mjeti në trend në komunitetin e të mësuarit të makinerive tani. Nuk është vetë mësimi i makinës; është një mjet që ju mundëson mua dhe juve të shkruajmë dhe të vendosim në fakt aplikacione për mësimin e makinerive. Eshte e mrekullueshme; kështu që le ta shqyrtojmë.

Në zemër të TensorFlow është

grafiku llogaritës.

Çfarë është një grafik llogaritës? Merrni parasysh kodin

a = 2
b = 3
c = a + b
print("c: ", c)

Ky kod kodon një llogaritje. Python do ta përpilojë këtë kod në një grup udhëzimesh që do ta bëjnë CPU-në tuaj të shtojë 2 dhe 3 së bashku. Le ta ekzekutojmë:

c: 5

Por në TensorFlow mund të shkruajmë këtë kod:

import tensorflow

@tensorflow.function
def computational_graph(a, b):
  c = a + b
  return c

a = tensorflow.constant(2)
b = tensorflow.constant(3)
outputs = computational_graph(a, b)
print("c: ", outputs.numpy())

Ky kod nuk kodon më vetë një llogaritje; ky kod kodon një grafik llogaritës. Do të duket kështu:

Pra, ne kemi një grafik. Ky grafik do të ndërtohet dhe ruhet diku nën kapak të TensorFlow. Por ky grafik është një strukturë e të dhënave. TensorFlow ka shërbime të tilla si "një bibliotekë për ekzekutimin e një llogaritjeje nëpër pajisje të shumta". Dhe këto shërbime mund ta kodojnë këtë strukturë të dhënash si një sekuencë bajtësh dhe ta ruajnë atë në disk ose ta transportojnë atë nëpër internet.

Ky grafik në vetvete, natyrisht, nuk është rezultat i llogaritjes. Kjo është ende për t'u përcaktuar. Dhe nëse ekzekutoni kodin e mësipërm TensorFlow, me të vërtetë do të merrni rezultatin:

c: 5

(Mund të merrni edhe disa mesazhe regjistrimi.)

Pra, tani e dini se një grafik TensorFlow është në fakt rezultat i ekzekutimit të kodit Python që importon paketën TensorFlow. Por në rastin tonë të mësipërm, ne nuk krijuam vetëm grafikun TensorFlow, por mbi të, vlerësuam grafikun për të marrë rezultatin: 5.

Një rrjet nervor si një grafik llogaritës

Ky ishte një shembull i bukur, Dimitri. Por si thua të ekzekutosh një kod të vërtetë të mësimit të makinerive?

Më vjen mirë që je kaq i etur për të mësuar. Le të zhytemi në këtë:

import numpy
import tensorflow

tensorflow.random.set_seed(42)
numpy.random.seed(42)

# Define the variables for the layers
weights_1 = tensorflow.Variable(tensorflow.random.normal([4, 8]), name='weights_1')
biases_1 = tensorflow.Variable(tensorflow.zeros([8]), name='biases_1')

weights_2 = tensorflow.Variable(tensorflow.random.normal([8, 2]), name='weights_2')
biases_2 = tensorflow.Variable(tensorflow.zeros([2]), name='biases_2')

# Define the computational graph
@tensorflow.function
def computational_graph(input_data):
  hidden_layer = tensorflow.nn.relu(tensorflow.linalg.matmul(input_data, weights_1) + biases_1)
  output_layer = tensorflow.nn.softmax(tensorflow.linalg.matmul(hidden_layer, weights_2) + biases_2)
  return output_layer

random_input = tensorflow.constant(numpy.random.rand(10, 4), dtype=tensorflow.float32)
outputs = computational_graph(random_input)
print("Output probabilities: ", outputs.numpy())

Ky kod kodon një grafik llogaritës i cili është një rrjet nervor me 4 neurone hyrëse, 8 neurone të fshehura dhe 2 neurone dalëse, në total 2 shtresa.

Ekzekutimi i kësaj jep diçka të tillë:

Output probabilities:  [[0.8037401  0.19625992]
 [0.4764339  0.5235661 ]
 [0.69988924 0.30011073]
 [0.4511033  0.54889673]
 [0.676848   0.32315195]
 [0.42097637 0.5790236 ]
 [0.69996774 0.3000323 ]
 [0.3143181  0.68568194]
 [0.8077571  0.19224294]
 [0.3099702  0.6900298 ]]

Interesante,

mund të thuash.

Por si mund ta shoh grafikun llogaritës për këtë rrjet nervor në të njëjtën mënyrë që pashë grafikun llogaritës për llogaritjen e lodrës së mësipërme?

Në rregull, le të fusim në fakt një kod më shumë në shembullin e mësipërm për të lejuar TensorFlow të na tregojë grafikun llogaritës në një pamje të bukur, siç e keni parë më lart:

import datetime
import numpy
import tensorflow

tensorflow.random.set_seed(42)
numpy.random.seed(42)

# Define the variables for the layers
weights_1 = tensorflow.Variable(tensorflow.random.normal([4, 8]), name='weights_1')
biases_1 = tensorflow.Variable(tensorflow.zeros([8]), name='biases_1')

weights_2 = tensorflow.Variable(tensorflow.random.normal([8, 2]), name='weights_2')
biases_2 = tensorflow.Variable(tensorflow.zeros([2]), name='biases_2')

# Define the computational graph
@tensorflow.function
def computational_graph(input_data):
  hidden_layer = tensorflow.nn.relu(tensorflow.linalg.matmul(input_data, weights_1) + biases_1)
  output_layer = tensorflow.nn.softmax(tensorflow.linalg.matmul(hidden_layer, weights_2) + biases_2)
  return output_layer

# Start recording the computation
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
writer = tensorflow.summary.create_file_writer(log_dir)
tensorflow.summary.trace_on(graph=True, profiler=True)

# Run the graph
# Use random data as an example
random_input = tensorflow.constant(numpy.random.rand(10, 4), dtype=tensorflow.float32)
outputs = computational_graph(random_input)
print("Output probabilities: ", outputs.numpy())

# Write the recording of the computation to disk
with writer.as_default():
  tensorflow.summary.trace_export(
    name="add_trace",
    step=0,
    profiler_outdir=log_dir
  )

Nëse ekzekutoni këtë kod dhe ekzekutoni këtë komandë shell:

tensorboard --logdir=logs/

do të shpërbleheni me këtë pamje:

të dhënat_hyrëse janë vetëm një matricë e hyrjeve. Natyrisht, ne pranojmë vetëm 4 numra të renditur si hyrje. Por ne duam të vlerësojmë një grup të tërë inputesh në të njëjtën kohë, prandaj ne japim 10 grupe me 4 numra të renditur në rrjetin nervor, që është e barabartë me një grup me 10 hyrje.

Pastaj, ne ekzekutojmë shumëzimin tonë të matricës në atë hyrje. Shumëzimi i matricës në thelb përbëhet vetëm nga një matricë 4 herë 8 që do të shumëzojë 8 numra të ndryshëm me secilin nga 4 numrat hyrës. Kjo matricë paraqitet në grafik si një drejtkëndësh kafe me etiketën MatMul.

Pastaj, ne ngjitemi në shkallë. Shtojmë paragjykimin, i cili në thelb është vetëm 1 numër për secilin nga 8 numrat që dalin nga ajo matricë. Këta 8 numra paragjykimesh përmblidhen si shto në figurë.

MatMul_1, ne ekzekutojmë një shumëzim matricë më shumë për t'i kondensuar 8 numrat tanë në 2. Në add_1, ne shtojmë 2 numra të tjerë paragjykimesh tek ata 2. Dhe pastaj kemi vetëm dy numrat e mbetur. "Ne ekzekutojmë funksionin softmax në këtë vektor me 2 komponentë." Ne marrim një tjetër me dy komponentë, por këtë herë këta dy përbërës mblidhen saktësisht në 1.

Forma ovale Identiteti përfaqëson operatorin që merr daljen e rrjetit tonë nervor dhe thjesht deklaron se ky është me të vërtetë dalja e fundit që do të marrim. Më pas, operatori identity_RetVal merr daljen përfundimtare dhe e shënon edhe një herë si daljen përfundimtare, përfundimtare që ka ky rrjet nervor. A e di dikush pse ekzistojnë dy operatorë identiteti?

Në rregull, dhe kjo është ajo: Grafiku llogaritës i një rrjeti nervor. Është e bukur, apo jo? Ju inkurajoj ta shikoni atë mjaft gjatë, nëse nuk e kuptoni menjëherë bukurinë e tij.

Pse grafikët llogaritës? Pse TensorFlow?

Natyrisht, ne gjithashtu mund ta kishim koduar atë grafik llogaritës si kod të pastër Python. Ne nuk kemi nevojë për TensorFlow për të kryer realisht llogaritjen. Por pse ne dhe shumë të tjerë po e bëjmë këtë gjithsesi?

Është thjesht shpejtësi. TensorFlow bën që llogaritja të shkojë më shpejt. Kjo është arsyeja e vetme. Do të ishte një dhimbje e vërtetë për të shkruar kodin Python që mund të shpërndajë ngarkesën llogaritëse në disa pajisje që janë thjesht të lidhura në internet, por jo fizikisht afër njëra-tjetrës. Në TensorFlow, kjo është një e integruar.

Llogaritja po bëhet gjithnjë e më e rëndësishme. Ne bejme

2,950,200,000,000,000,000 operacione lundruese në sekondë,

"duke përdorur vetëm 4 kompjuterët më të mëdhenj në botë". Nëse dëshironi të kuptoni këtë numër, lexoni këto dy artikuj: Nga 1 në 1.000.000 dhe Nga 1.000.000 në numrin e Grahamit.

Dhe kjo nuk po numëron as të gjithë kompjuterët personalë që po thyejnë numrat çdo sekondë. Sa kompjuterë personal vlerësoni se janë atje? Nuk e di, por e di se vetëm në vitin 1980, që nuk është as 30 vjet më parë, askush nuk dinte për kompjuterët personalë.

Llogaritja nuk është vetëm mësim i makinës. Është gjithashtu kërkimi i operacioneve, i cili është aktiviteti në të cilin përfshihen kompanitë për të kursyer burime si paratë, koha e njerëzve ose ari ose minerale të tjera të Tokës që janë të kufizuara në sasinë e tyre.

TensorFlow mundëson që të gjitha llogaritjet të ecin më shpejt. Duke e paketuar atë në copa të vogla dhe më pas duke ekzekutuar secilën pjesë në çdo pak kohë të papunë që ka një kompjuter, më pas duke grumbulluar të gjitha rezultatet dhe duke ia paraqitur ato përdoruesit përfundimtar për të marrë një vendim përfundimtar, ose programuesit për të dhëna vizualizimi.

Përdor TensorFlow! Qëndroni në shpejtësi!