Osnove TensorFlowa: tenzor, oblik, vrsta, sesije & Operaulagatelji

Što je tenzor?

Ime Tensorflowa izravno je izvedeno iz njegovog temeljnog okvira: Tensor. U Tensorflowu svi proračuni uključuju tenzore. Tenzor je vektor ili matrica n-dimenzija koja predstavlja sve vrste podataka. Sve vrijednosti u tenzoru sadrže identičan tip podataka s poznatim (ili djelomično poznatim) oblikom. 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 grafa. Graf je skup izračuna koji se odvija sukcesivno. Svaka operacija se naziva 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.

U strojnom učenju, modeli se unose popisom objekata koji se nazivaju vektori značajki. Vektor obilježja može biti bilo koje vrste podataka. Vektor obilježja obično će biti primarni ulaz za popunjavanje tenzora. Ove vrijednosti će teći u operativni čvor kroz tenzor, a rezultat ove operacije/izračunavanja će stvoriti novi tenzor koji će se zauzvrat koristiti u novoj operaciji. Sve ove operacije mogu se vidjeti na grafikonu.

Reprezentacija tenzora

U TensorFlowu, tenzor je zbirka vektora značajki (tj. niza) n-dimenzija. Na primjer, ako imamo matricu 2×3 s vrijednostima od 1 do 6, pišemo:

Reprezentacija tenzora
Reprezentacija tenzora

TensorFlow predstavlja ovu matricu kao:

[[1, 2, 3], 
   [4, 5, 6]]

Ako kreiramo trodimenzionalnu matricu s vrijednostima od 1 do 8, imamo:

Reprezentacija tenzora

TensorFlow predstavlja ovu matricu kao:

[ [[1, 2],  
       [[3, 4],  
       [[5, 6],  
       [[7,8] ]

Bilješka: Tenzor se može prikazati skalarom ili može imati oblik više od tri dimenzije. Samo je kompliciranije vizualizirati višu razinu dimenzija.

Vrste tenzora

U TensorFlowu sva izračunavanja prolaze kroz jedan ili više tenzora. tf.tensor je objekt s tri svojstva:

  • Jedinstvena oznaka (ime)
  • Dimenzija (oblik)
  • Vrsta podataka (dtype)

Svaka operacija koju ćete učiniti s TensorFlowom uključuje manipulaciju tenzorom. Postoje četiri glavne vrste tenzora koje možete kreirati:

  • tf.Promjenljiva
  • tf.konstantan
  • tf.rezervirano mjesto
  • tf.SparseTensor

U ovom ćete vodiču naučiti kako stvoriti tf.constant i tf.Variable.

Prije nego što prođemo kroz tutorial, provjerite jeste li aktivirali conda okruženje s TensorFlowom. Ovo okruženje nazvali smo hello-tf.

Za korisnika MacOS-a:

source activate hello-tf

Za Windows korisnik:

activate hello-tf

Nakon što to učinite, spremni ste za uvoz tensorflowa

# Import tf
import tensorflow as tf

Napravite tenzor n-dimenzije

Počinjete stvaranjem tenzora s jednom dimenzijom, naime skalarom.

Za izradu tenzora možete koristiti tf.constant() kao što je prikazano u donjem primjeru oblika tenzora TensorFlow:

tf.constant(value, dtype, name = "")
arguments

- `value`: Value of n dimension to define the tensor. Optional
- `dtype`: Define the type of data:    
    - `tf.string`: String variable    
    - `tf.float32`: Float variable    
    - `tf.int16`: Integer variable
- "name": Name of the tensor. Optional. By default, `Const_1:0`

Za stvaranje tenzora dimenzije 0, pokrenite sljedeći kod

## rank 0
# Default name
r1 = tf.constant(1, tf.int16) 
print(r1)			

Izlaz

Tensor("Const:0", shape=(), dtype=int16)

Stvorite tenzor n-dimenzije

# Named my_scalar
r2 = tf.constant(1, tf.int16, name = "my_scalar") 
print(r2)

Izlaz

Tensor("my_scalar:0", shape=(), dtype=int16)

Svaki tenzor je prikazan imenom tenzora. Svaki objekt tenzora definiran je atributima tenzora kao što su jedinstvena oznaka (ime), dimenzija (oblik) i tipovi podataka TensorFlow (dtype).

Tenzor možete definirati s decimalnim vrijednostima ili s nizom promjenom vrste podataka.

# Decimal
r1_decimal = tf.constant(1.12345, tf.float32)
print(r1_decimal)
# String
r1_string = tf.constant("Guru99", tf.string)
print(r1_string)

Izlaz

Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("Const_2:0", shape=(), dtype=string)

Tenzor dimenzije 1 može se kreirati na sljedeći način:

## Rank 1r1_vector = tf.constant([1,3,5], tf.int16)
print(r1_vector)
r2_boolean = tf.constant([True, True, False], tf.bool)
print(r2_boolean)

Izlaz

Tensor("Const_3:0", shape=(3,), dtype=int16)
Tensor("Const_4:0", shape=(3,), dtype=bool)

Možete primijetiti da se oblik TensorFlow sastoji samo od 1 stupca.

Da biste stvorili niz od 2 dimenzije tenzora, morate zatvoriti zagrade nakon svakog retka. Pogledajte primjer oblika Kerasovog tenzora u nastavku

## Rank 2
r2_matrix = tf.constant([ [1, 2],
                          [3, 4] ],tf.int16)
print(r2_matrix)

Izlaz

Tensor("Const_5:0", shape=(2, 2), dtype=int16)

Matrica ima 2 retka i 2 stupca ispunjena vrijednostima 1, 2, 3, 4.

Matrica s 3 dimenzije se konstruira dodavanjem još jedne razine sa zagradama.

## Rank 3
r3_matrix = tf.constant([ [[1, 2],
                           [3, 4], 
                           [5, 6]] ], tf.int16)
print(r3_matrix)

Izlaz

Tensor("Const_6:0", shape=(1, 3, 2), dtype=int16)

Matrica izgleda kao na slici 2.

Oblik tenzora

Kada ispisujete tenzor, TensorFlow pogađa oblik. Međutim, možete dobiti oblik tenzora sa svojstvom oblika TensorFlow.

U nastavku konstruirate matricu ispunjenu brojevima od 10 do 15 i provjerite oblik m_shape

# Shape of tensor
m_shape = tf.constant([ [10, 11],
                        [12, 13],
                        [14, 15] ]                      
                     ) 
m_shape.shape

Izlaz

TensorShape([Dimension(3), Dimension(2)])

Matrica ima 3 retka i 2 stupca.

TensorFlow ima korisne naredbe za stvaranje vektora ili matrice ispunjene s 0 ili 1. Na primjer, ako želite stvoriti 1-D tenzor s određenim oblikom 10, ispunjenim s 0, možete pokrenuti kod u nastavku:

# Create a vector of 0
print(tf.zeros(10))

Izlaz

Tensor("zeros:0", shape=(10,), dtype=float32)

Svojstvo vrijedi i za matricu. Ovdje stvarate matricu 10×10 ispunjenu s 1

# Create a vector of 1
print(tf.ones([10, 10]))

Izlaz

Tensor("ones:0", shape=(10, 10), dtype=float32)

Možete upotrijebiti oblik zadane matrice da napravite vektor jedinica. Matrica m_shape je dimenzija 3×2. Možete stvoriti tenzor s 3 retka ispunjena jednim pomoću sljedećeg koda:

# Create a vector of ones with the same number of rows as m_shape
print(tf.ones(m_shape.shape[0]))

Izlaz

Tensor("ones_1:0", shape=(3,), dtype=float32)

Ako prenesete vrijednost 1 u zagradu, možete konstruirati vektor od jedinica jednak broju stupaca u matrici m_shape.

# Create a vector of ones with the same number of column as m_shape
print(tf.ones(m_shape.shape[1]))

Izlaz

Tensor("ones_2:0", shape=(2,), dtype=float32)

Konačno, možete stvoriti matricu 3×2 samo s jednim

print(tf.ones(m_shape.shape))

Izlaz

Tensor("ones_3:0", shape=(3, 2), dtype=float32)

Vrsta podataka

Drugo svojstvo tenzora je vrsta podataka. Tenzor može imati samo jednu vrstu podataka u isto vrijeme. Tenzor može imati samo jednu vrstu podataka. Možete vratiti tip sa svojstvom dtype.

print(m_shape.dtype)

Izlaz

<dtype: 'int32'>

U nekim slučajevima želite promijeniti vrstu podataka. U TensorFlowu je to moguće pomoću metode tf.cast.

Primjer

U nastavku se tenzor float pretvara u cijeli broj korištenjem metode cast.

# Change type of data
type_float = tf.constant(3.123456789, tf.float32)
type_int = tf.cast(type_float, dtype=tf.int32)
print(type_float.dtype)
print(type_int.dtype)

Izlaz

<dtype: 'float32'>
<dtype: 'int32'>

TensorFlow automatski odabire vrstu podataka kada argument nije naveden tijekom stvaranja tenzora. TensorFlow će pogoditi koja je najvjerojatnija vrsta podataka. Na primjer, ako proslijedite tekst, on će pogoditi da je niz i pretvoriti ga u niz.

Izrada operatora

Neki korisni TensorFlow operatori

Znate kako stvoriti tenzor s TensorFlowom. Vrijeme je da naučite izvoditi matematičke operacije.

TensorFlow sadrži sve osnovne operacije. Možete početi s jednostavnim. Koristit ćete metodu TensorFlow za izračunavanje kvadrata broja. Ova operacija je jednostavna jer je za konstrukciju tenzora potreban samo jedan argument.

Kvadrat broja konstruiran je s tf.sqrt(x) s x kao pokretnim brojem.

x = tf.constant([2.0], dtype = tf.float32)
print(tf.sqrt(x))

Izlaz

Tensor("Sqrt:0", shape=(1,), dtype=float32)

Bilješka: Izlaz je vratio objekt tenzora, a ne rezultat kvadrata 2. U primjeru ispisujete definiciju tenzora, a ne stvarnu procjenu operacije. U sljedećem odjeljku naučit ćete kako TensorFlow radi na izvršavanju operacija.

Slijedi popis često korištenih operacija. Ideja je ista. Svaka operacija zahtijeva jedan ili više argumenata.

  • tf.add(a, b)
  • tf.substract(a, b)
  • tf.multiply(a, b)
  • tf.div(a, b)
  • tf.pow(a, b)
  • tf.exp(a)
  • tf.sqrt(a)

Primjer

# Add
tensor_a = tf.constant([[1,2]], dtype = tf.int32)
tensor_b = tf.constant([[3, 4]], dtype = tf.int32)

tensor_add = tf.add(tensor_a, tensor_b)print(tensor_add)

Izlaz

Tensor("Add:0", shape=(1, 2), dtype=int32)

Objašnjenje koda

Napravite dva tenzora:

  • jedan tenzor s 1 i 2
  • jedan tenzor s 3 i 4

Zbrajate oba tenzora.

obavijest: da oba tenzora moraju imati isti oblik. Možete izvršiti množenje nad dva tenzora.

# Multiply
tensor_multiply = tf.multiply(tensor_a, tensor_b)
print(tensor_multiply)

Izlaz

Tensor("Mul:0", shape=(1, 2), dtype=int32)

Varijable

Do sada ste kreirali samo konstantne tenzore. Nije od velike koristi. Podaci uvijek stižu s različitim vrijednostima, da biste to uhvatili, možete koristiti klasu Variable. Predstavljat će čvor u kojem se vrijednosti uvijek mijenjaju.

Za izradu varijable možete koristiti metodu tf.get_variable().

tf.get_variable(name = "", values, dtype, initializer)
argument
- `name = ""`: Name of the variable
- `values`: Dimension of the tensor
- `dtype`: Type of data. Optional
- `initializer`: How to initialize the tensor. Optional
If initializer is specified, there is no need to include the `values` as the shape of `initializer` is used.

Na primjer, kod u nastavku stvara dvodimenzionalnu varijablu s dvije nasumične vrijednosti. TensorFlow prema zadanim postavkama vraća slučajnu vrijednost. Vi varijablu imenujete var

# Create a Variable
## Create 2 Randomized values
var = tf.get_variable("var", [1, 2])
print(var.shape)

Izlaz

(1, 2)

U drugom primjeru stvarate varijablu s jednim retkom i dva stupca. Morate upotrijebiti [1,2] za stvaranje dimenzije varijable

Početne vrijednosti ovog tenzora su nula. Na primjer, kada trenirate model, morate imati početne vrijednosti za izračunavanje težine značajki. U nastavku ove početne vrijednosti postavljate na nulu.

var_init_1 = tf.get_variable("var_init_1", [1, 2], dtype=tf.int32,  initializer=tf.zeros_initializer)
print(var_init_1.shape)

Izlaz

(1, 2)

Možete proslijediti vrijednosti konstantnog tenzora u varijabli. Konstantni tenzor stvarate metodom tf.constant(). Ovaj tenzor koristite za inicijalizaciju varijable.

Prve vrijednosti varijable su 10, 20, 30 i 40. Novi tenzor će imati oblik 2×2.

# Create a 2x2 matrixtensor_const = tf.constant([[10, 20],
[30, 40]])
# Initialize the first value of the tensor equals to tensor_const
var_init_2 = tf.get_variable("var_init_2", dtype=tf.int32,  initializer=tensor_const)
print(var_init_2.shape)

Izlaz

(2, 2)

Činovnik

Svrha čuvara mjesta je da dopuni tenzor. Rezervirano mjesto se koristi za pokretanje protoka podataka unutar tenzora. Da biste unijeli rezervirano mjesto, morate koristiti metodu feed_dict. Rezervirano mjesto bit će uneseno samo unutar sesije.

U sljedećem primjeru vidjet ćete kako stvoriti rezervirano mjesto metodom tf.placeholder. U sljedećoj ćete sesiji naučiti staviti rezervirano mjesto stvarnom vrijednošću tenzora.

Sintaksa je:

tf.placeholder(dtype,shape=None,name=None )
arguments:
- `dtype`: Type of data
- `shape`: dimension of the placeholder. Optional. By default, shape of the data
- `name`: Name of the placeholder. Optional			
data_placeholder_a = tf.placeholder(tf.float32, name = "data_placeholder_a")
print(data_placeholder_a)

Izlaz

Tensor("data_placeholder_a:0", dtype=float32)

Sjednica

TensorFlow radi oko 3 glavne komponente:

  • Grafikon
  • tenzor
  • Sjednica
Komponente Opis
Grafikon Graf je fundamentalan u TensorFlowu. Sve matematičke operacije (ops) izvode se unutar grafa. Možete zamisliti graf kao projekt u kojem se obavljaju sve operacije. Čvorovi predstavljaju te operacije, mogu apsorbirati ili stvoriti nove tenzore.
tenzor Tenzor predstavlja podatke koji napreduju između operacija. Prethodno ste vidjeli kako inicijalizirati tenzor. Razlika između konstante i varijable je u tome što će se početne vrijednosti varijable mijenjati tijekom vremena.
Sjednica Sesija će izvršiti operaciju iz grafikona. Da biste graf napunili vrijednostima tenzora, morate otvoriti sesiju. Unutar sesije morate pokrenuti operator za stvaranje izlaza.

Grafikoni i sesije su neovisni. Možete pokrenuti sesiju i dobiti vrijednosti koje ćete kasnije koristiti za daljnje izračune.

U donjem primjeru ćete:

  • Napravite dva tenzora
  • Stvorite operaciju
  • Otvorite sesiju
  • Ispišite rezultat

Korak 1) Kreirate dva tenzora x i y

## Create, run  and evaluate a session
x = tf.constant([2])
y = tf.constant([4])

Korak 2) Operator stvarate množenjem x i y

## Create operator
multiply = tf.multiply(x, y)

Korak 3) Otvarate sesiju. Sva izračunavanja dogodit će se unutar sesije. Kada ste gotovi, trebate zatvoriti sesiju.

## Create a session to run the code
sess = tf.Session()result_1 = sess.run(multiply)
print(result_1)
sess.close()

Izlaz

[8]

Objašnjenje koda

  • tf.Session(): Otvaranje sesije. Sve će operacije teći unutar sesija
  • run(multiply): izvršite operaciju stvorenu u koraku 2.
  • print(result_1): Konačno, možete ispisati rezultat
  • close(): Zatvori sesiju

Rezultat pokazuje 8, što je množenje x i y.

Drugi način stvaranja sesije je unutar bloka. Prednost je što automatski zatvara sesiju.

with tf.Session() as sess:    
result_2 = multiply.eval()
print(result_2)

Izlaz

[8]

U kontekstu sesije, možete koristiti metodu eval() za izvršenje operacije. To je ekvivalentno run(). Čini kôd čitljivijim.

Možete stvoriti sesiju i vidjeti vrijednosti unutar tenzora koje ste do sada stvorili.

## Check the tensors created before
sess = tf.Session()
print(sess.run(r1))
print(sess.run(r2_matrix))
print(sess.run(r3_matrix))

Izlaz

1
[[1 2] 
 [3 4]]
[[[1 2]  
  [3 4]  
  [5 6]]]

Varijable su prema zadanim postavkama prazne, čak i nakon što stvorite tenzor. Morate inicijalizirati varijablu ako želite koristiti varijablu. Objekt tf.global_variables_initializer() treba pozvati za inicijalizaciju vrijednosti varijable. Ovaj će objekt eksplicitno inicijalizirati sve varijable. Ovo je korisno prije nego što obučite model.

Možete provjeriti vrijednosti varijabli koje ste prije stvorili. Imajte na umu da morate koristiti run za procjenu tenzora

sess.run(tf.global_variables_initializer())
print(sess.run(var))
print(sess.run(var_init_1))
print(sess.run(var_init_2))

Izlaz

[[-0.05356491  0.75867283]]
[[0 0]]
[[10 20] 
 [30 40]]

Možete upotrijebiti rezervirano mjesto koje ste prije stvorili i dodati mu stvarnu vrijednost. Morate proslijediti podatke u metodu feed_dict.

Na primjer, uzet ćete snagu 2 rezerviranog mjesta data_placeholder_a.

import numpy as np
power_a = tf.pow(data_placeholder_a, 2)
with tf.Session() as sess:  
data = np.random.rand(1, 10)  
print(sess.run(power_a, feed_dict={data_placeholder_a: data}))  # Will succeed.

Objašnjenje koda

  • import numpy kao np: Import knjižnica numpy za stvaranje podataka
  • tf.pow(data_placeholder_a, 2): Kreirajte ops
  • np.random.rand(1, 10): Stvorite nasumični niz podataka
  • feed_dict={data_placeholder_a: data}: Ubaci podatke u rezervirano mjesto

Izlaz

[[0.05478134 0.27213147 0.8803037  0.0398424  0.21172127 0.01444725  0.02584014 0.3763949  0.66022706 0.7565559 ]]

Grafikon

TensorFlow ovisi o genijalnom pristupu renderiranja operacije. Sva su izračunavanja predstavljena shemom tijeka podataka. Grafikon protoka podataka razvijen je kako bi se uočile ovisnosti podataka između pojedinačnih operacija. Matematička formula ili algoritam sastoji se od niza uzastopnih operacija. Grafikon je prikladan način za vizualizaciju načina na koji su proračuni koordinirani.

Grafikon prikazuje a čvor i rub. Čvor je prikaz operacije, tj. jedinica izračuna. Rub je tenzor, može proizvesti novi tenzor ili potrošiti ulazne podatke. Ovisi o ovisnosti između pojedinih operacija.

Struktura grafa povezuje operacije (tj. čvorove) i način na koji se te operacije dovode. Imajte na umu da grafikon ne prikazuje izlaz operacija, on samo pomaže vizualizirati vezu između pojedinačnih operacija.

Pogledajmo primjer.

Zamislite da želite procijeniti sljedeću funkciju:

Grafikon

TensorFlow će stvoriti grafikon za izvršenje funkcije. Grafikon izgleda ovako:

Primjer TensorFlow grafikona

Primjer TensorFlow grafikona

Lako možete vidjeti put kojim će tenzori doći do konačnog odredišta.

Na primjer, možete vidjeti da se operacija add ne može izvršiti prije i . Grafikon objašnjava da će:

  1. izračunati i:
  2. dodati 1) zajedno
  3. dodaj u 2)
  4. dodati 3) na
x = tf.get_variable("x", dtype=tf.int32,  initializer=tf.constant([5]))
z = tf.get_variable("z", dtype=tf.int32,  initializer=tf.constant([6]))
c = tf.constant([5], name =	"constant")square = tf.constant([2], name =	"square")
f = tf.multiply(x, z) + tf.pow(x, square) + z + c

Objašnjenje koda

  • x: Inicijalizirajte varijablu pod nazivom x s konstantnom vrijednošću 5
  • z: Inicijalizirajte varijablu nazvanu z konstantnom vrijednošću 6
  • c: Inicijalizirajte konstantni tenzor nazvan c konstantnom vrijednošću 5
  • kvadrat: Inicijalizirajte konstantni tenzor koji se zove kvadrat s konstantnom vrijednošću 2
  • f: Konstruirajte operator

U ovom primjeru odlučili smo zadržati vrijednosti varijabli fiksnima. Također smo stvorili konstantni tenzor nazvan c koji je konstantni parametar u funkciji f. Zauzima fiksnu vrijednost 5. Na grafikonu možete vidjeti ovaj parametar u tenzoru koji se naziva konstanta.

Također smo konstruirali konstantni tenzor za potenciju u operatoru tf.pow(). Nije potrebno. Napravili smo to tako da možete vidjeti naziv tenzora na grafu. To je krug koji se zove kvadrat.

Iz grafikona možete razumjeti što će se dogoditi s tenzorima i kako mogu vratiti rezultat od 66.

Kod u nastavku procjenjuje funkciju u sesiji.

init = tf.global_variables_initializer() # prepare to initialize all variables
with tf.Session() as sess:    
	init.run() # Initialize x and y    
    function_result = f.eval()
print(function_result)

Izlaz

[66]

Rezime

TensorFlow radi oko:

  • Grafikon: Računalno okruženje koje sadrži operacije i tenzore
  • Tenzori: Predstavlja podatke (ili vrijednosti) koji će teći u grafikonu. To je rub u grafikonu
  • sjednice: Dopusti izvođenje operacija

Napravite konstantni tenzor

konstanta objekt
D0 tf.constant(1, tf.int16)
D1 tf.constant([1,3,5], tf.int16)
D2 tf.constant([ [1, 2], [3, 4] ],tf.int16)
D3 tf.constant([ [[1, 2],[3, 4], [5, 6]] ], tf.int16)

Stvorite operator

Stvorite operator Objekt
a + b tf.add(a, b)
a*b tf.multiply(a, b)

Napravite varijabilni tenzor

Stvorite varijablu objekt
slučajna vrijednost tf.get_variable(“var”, [1, 2])
početna prva vrijednost tf.get_variable(“var_init_2”, dtype=tf.int32, initializer=[ [1, 2], [3, 4] ])

Otvorite sesiju

Sjednica objekt
Stvorite sesiju tf.Session()
Pokrenite sesiju tf.Session.run()
Procijenite tenzor naziv_varijable.eval()
Zatvorite sesiju sess.close()
Sesija po bloku s tf.Session() kao sess: