Podstawy TensorFlow: Tensor, kształt, typ, sesje & Operatorzy

Spisie treści:

Anonim

Co to jest tensor?

Nazwa Tensorflow wywodzi się bezpośrednio z jego podstawowego szkieletu: Tensor. W Tensorflow wszystkie obliczenia obejmują tensory. Tensor to wektor lub macierz n-wymiarów, która reprezentuje wszystkie typy danych. Wszystkie wartości w tensorze mają identyczny typ danych o znanym (lub częściowo znanym) kształcie. Kształt danych to wymiarowość macierzy lub tablicy.

Tensor może pochodzić z danych wejściowych lub z wyniku obliczenia. W TensorFlow wszystkie operacje są przeprowadzane wewnątrz wykresu. Wykres jest zbiorem obliczeń, które odbywają się sukcesywnie. Każda operacja nazywana jest węzłem operacyjnym i jest ze sobą połączona.

Wykres przedstawia operacje i połączenia między węzłami. Jednak nie wyświetla wartości. Krawędź węzłów to tensor, czyli sposób na wypełnienie operacji danymi.

W uczeniu maszynowym modele są zasilane z listą obiektów zwanych wektorami funkcji. Wektor cech może mieć dowolny typ danych. Wektor cech będzie zwykle podstawowym wejściem do wypełnienia tensora. Wartości te wpłyną do węzła operacyjnego przez tensor, a wynik tej operacji / obliczenia utworzy nowy tensor, który z kolei zostanie użyty w nowej operacji. Wszystkie te operacje można zobaczyć na wykresie.

W tym samouczku nauczysz się podstaw TensorFlow, takich jak:

  • Co to jest tensor?
  • Reprezentacja tensora
  • Rodzaje tensorów
  • Utwórz tensor wymiaru n
  • Kształt tensora
  • Rodzaj danych
  • Operator tworzenia
  • Niektóre przydatne operatory TensorFlow
  • Zmienne
  • Symbol zastępczy
  • Sesja
  • Wykres

Reprezentacja tensora

W TensorFlow tensor to zbiór wektorów cech (tj. Tablic) o n-wymiarach. Przykładowo, jeśli mamy macierz 2x3 o wartościach od 1 do 6, piszemy:

Reprezentacja tensora

TensorFlow przedstawia tę macierz jako:

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

Jeśli utworzymy trójwymiarową macierz o wartościach od 1 do 8, otrzymamy:

TensorFlow przedstawia tę macierz jako:

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

Uwaga: tensor może być reprezentowany przez skalar lub może mieć kształt więcej niż trzech wymiarów. Po prostu wizualizacja wyższego poziomu wymiaru jest bardziej skomplikowana.

Rodzaje tensorów

W TensorFlow wszystkie obliczenia przechodzą przez jeden lub więcej tensorów. Tf.tensor to obiekt o trzech właściwościach:

  • Unikalna etykieta (nazwa)
  • Wymiar (kształt)
  • Typ danych (dtype)

Każda operacja, którą wykonasz za pomocą TensorFlow, obejmuje manipulację tensorem. Istnieją cztery główne typy tensorów, które można utworzyć:

  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

W tym samouczku dowiesz się, jak utworzyć zmienną tf.constant i tf.Variable.

Zanim przejdziemy przez samouczek, upewnij się, że aktywujesz środowisko Conda za pomocą TensorFlow. Nazwaliśmy to środowisko hello-tf.

Dla użytkownika MacOS:

source activate hello-tf 

W przypadku użytkownika systemu Windows:

activate hello-tf 

Po wykonaniu tej czynności możesz zaimportować tensorflow

# Import tfimport tensorflow as tf 

Utwórz tensor wymiaru n

Zaczynasz od stworzenia tensora z jednym wymiarem, a mianowicie skalarem.

Aby utworzyć tensor, możesz użyć tf.constant (), jak pokazano na poniższym przykładzie kształtu tensora 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` 

Aby utworzyć tensor wymiaru 0, uruchom następujący kod

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

Wynik

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

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

Wynik

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

Każdy tensor jest wyświetlany przez nazwę tensora. Każdy obiekt tensora jest definiowany za pomocą atrybutów tensora, takich jak unikalna etykieta (nazwa), wymiar (kształt) i typy danych TensorFlow (dtype).

Możesz zdefiniować tensor z wartościami dziesiętnymi lub z łańcuchem, zmieniając typ danych.

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

Wynik

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

Tensor wymiaru 1 można utworzyć w następujący sposób:

## 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) 

Wynik

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

Możesz zauważyć, że kształt TensorFlow składa się tylko z 1 kolumny.

Aby utworzyć tablicę 2 wymiarów tensora, musisz zamknąć nawiasy po każdym wierszu. Sprawdź poniższy przykład kształtu tensora Keras

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

Wynik

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

Macierz ma 2 wiersze i 2 kolumny wypełnione wartościami 1, 2, 3, 4.

Macierz z 3 wymiarami jest konstruowana przez dodanie kolejnego poziomu za pomocą nawiasów.

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

Wynik

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

Macierz wygląda jak na rysunku 2.

Kształt tensora

Podczas drukowania tensora TensorFlow zgaduje kształt. Jednak kształt tensora można uzyskać za pomocą właściwości kształtu TensorFlow.

Poniżej konstruujesz macierz wypełnioną liczbą od 10 do 15 i sprawdzasz kształt m_shape

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

Wynik

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

Macierz ma 3 wiersze i 2 kolumny.

TensorFlow zawiera przydatne polecenia do tworzenia wektora lub macierzy wypełnionej 0 lub 1. Na przykład, jeśli chcesz utworzyć tensor 1-D o określonym kształcie 10, wypełnionym 0, możesz uruchomić poniższy kod:

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

Wynik

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

Właściwość działa również dla macierzy. Tutaj tworzysz macierz 10x10 wypełnioną 1

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

Wynik

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

Możesz użyć kształtu danej macierzy, aby utworzyć wektor jedności. Macierz m_shape ma wymiary 3x2. Możesz utworzyć tensor z 3 wierszami wypełnionymi przez jeden z następującym kodem:

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

Wynik

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

Jeśli przekażesz wartość 1 do nawiasu, możesz skonstruować wektor jedynek równych liczbie kolumn w macierzy m_shape.

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

Wynik

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

Wreszcie możesz stworzyć macierz 3x2 tylko z jednym

print(tf.ones(m_shape.shape)) 

Wynik

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

Rodzaj danych

Drugą właściwością tensora jest typ danych. Tensor może mieć tylko jeden typ danych naraz. Tensor może mieć tylko jeden typ danych. Możesz zwrócić typ z właściwością dtype.

print(m_shape.dtype) 

Wynik

 

Czasami chcesz zmienić typ danych. W TensorFlow jest to możliwe dzięki metodzie tf.cast.

Przykład

Poniżej tensor typu float jest konwertowany na liczbę całkowitą przy użyciu metody rzutowania.

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

Wynik


 

TensorFlow automatycznie wybiera typ danych, gdy argument nie jest określony podczas tworzenia tensora. TensorFlow zgadnie, jakie są najbardziej prawdopodobne typy danych. Na przykład, jeśli przekażesz tekst, zgadnie, że jest to ciąg i przekształci go w łańcuch.

Operator tworzenia

Niektóre przydatne operatory TensorFlow

Wiesz, jak utworzyć tensor za pomocą TensorFlow. Czas nauczyć się wykonywania operacji matematycznych.

TensorFlow zawiera wszystkie podstawowe operacje. Możesz zacząć od prostego. Do obliczenia kwadratu liczby użyjesz metody TensorFlow. Ta operacja jest prosta, ponieważ do skonstruowania tensora wymagany jest tylko jeden argument.

Kwadrat liczby jest konstruowany za pomocą tf.sqrt (x), gdzie x jest liczbą zmiennoprzecinkową.

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

Wynik

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

Uwaga: Wyjście zwróciło obiekt tensora, a nie wynik kwadratu 2. W tym przykładzie drukujesz definicję tensora, a nie faktyczną ocenę operacji. W następnej sekcji dowiesz się, jak działa TensorFlow przy wykonywaniu operacji.

Poniżej znajduje się lista najczęściej używanych operacji. Idea jest taka sama. Każda operacja wymaga co najmniej jednego argumentu.

  • 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)

Przykład

# Addtensor_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) 

Wynik

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

Objaśnienie kodu

Utwórz dwa tensory:

  • jeden tensor z 1 i 2
  • jeden tensor z 3 i 4

Dodajesz oba tensory.

Uwaga : oba tensory muszą mieć ten sam kształt. Możesz wykonać mnożenie przez dwa tensory.

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

Wynik

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

Zmienne

Jak dotąd stworzyłeś tylko stałe tensory. Nie jest to zbyt użyteczne. Dane zawsze przychodzą z różnymi wartościami, aby to uchwycić, możesz użyć klasy Variable. Będzie reprezentować węzeł, w którym wartości zawsze się zmieniają.

Aby utworzyć zmienną, możesz użyć metody 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. OptionalIf initializer is specified, there is no need to include the `values` as the shape of `initializer` is used. 

Na przykład poniższy kod tworzy dwuwymiarową zmienną z dwiema losowymi wartościami. Domyślnie TensorFlow zwraca losową wartość. Nazywasz zmienną var

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

Wynik

(1, 2) 

W drugim przykładzie utworzysz zmienną z jednym wierszem i dwiema kolumnami. Musisz użyć [1,2], aby stworzyć wymiar zmiennej

Wartości początkowe tego tensora wynoszą zero. Na przykład, kiedy trenujesz model, musisz mieć wartości początkowe, aby obliczyć wagę elementów. Poniżej ustawiasz te początkowe wartości na zero.

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

Wynik

(1, 2) 

Możesz przekazać wartości stałego tensora w zmiennej. Tworzysz stały tensor za pomocą metody tf.constant (). Używasz tego tensora do inicjalizacji zmiennej.

Pierwsze wartości zmiennej to 10, 20, 30 i 40. Nowy tensor będzie miał kształt 2x2.

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

Wynik

(2, 2) 

Symbol zastępczy

Symbol zastępczy służy do zasilania tensora. Symbol zastępczy służy do inicjowania danych w celu przepływu wewnątrz tensorów. Aby podać symbol zastępczy, musisz użyć metody feed_dict. Symbol zastępczy będzie podawany tylko w trakcie sesji.

W następnym przykładzie zobaczysz, jak utworzyć symbol zastępczy za pomocą metody tf.placeholder. W następnej sesji nauczysz się podawać element zastępczy rzeczywistą wartością tensora.

Składnia jest następująca:

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. Optionaldata_placeholder_a = tf.placeholder(tf.float32, name = "data_placeholder_a")print(data_placeholder_a) 

Wynik

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

Sesja

TensorFlow działa wokół 3 głównych komponentów:

  • Wykres
  • Napinacz
  • Sesja
składniki Descritption

Wykres

Wykres ma podstawowe znaczenie w TensorFlow. Wszystkie operacje matematyczne (ops) są wykonywane wewnątrz wykresu. Możesz sobie wyobrazić wykres jako projekt, w którym wykonywane są wszystkie operacje. Węzły reprezentują te operacje, mogą absorbować lub tworzyć nowe tensory.

Napinacz

Tensor reprezentuje dane, które przechodzą między operacjami. Wcześniej widziałeś, jak zainicjować tensor. Różnica między stałą a zmienną polega na tym, że początkowe wartości zmiennej będą się zmieniać w czasie.

Sesja

Sesja wykona operację z poziomu wykresu. Aby zasilić wykres wartościami tensora, musisz otworzyć sesję. Wewnątrz sesji musisz uruchomić operator, aby utworzyć wynik.

Wykresy i sesje są niezależne. Możesz uruchomić sesję i pobrać wartości do późniejszego wykorzystania w dalszych obliczeniach.

W poniższym przykładzie:

  • Utwórz dwa tensory
  • Utwórz operację
  • Otwórz sesję
  • Wydrukuj wynik

Krok 1) Tworzysz dwa tensory x i y

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

Krok 2) Tworzysz operator mnożąc x i y

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

Krok 3) Otwierasz sesję. Wszystkie obliczenia zostaną wykonane w ramach sesji. Kiedy skończysz, musisz zamknąć sesję.

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

Wynik

[8] 

Objaśnienie kodu

  • tf.Session (): Otwórz sesję. Wszystkie operacje będą przebiegać w ramach sesji
  • run (multiply): wykonaj operację utworzoną w kroku 2.
  • print (result_1): Wreszcie możesz wydrukować wynik
  • close (): Zamknij sesję

Wynik pokazuje 8, czyli pomnożenie x i y.

Innym sposobem tworzenia sesji jest wewnątrz bloku. Zaletą jest to, że automatycznie zamyka sesję.

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

Wynik

[8] 

W kontekście sesji do wykonania operacji można użyć metody eval (). Jest odpowiednikiem run (). Dzięki temu kod jest bardziej czytelny.

Możesz utworzyć sesję i zobaczyć wartości wewnątrz tensorów, które utworzyłeś do tej pory.

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

Wynik

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

Zmienne są domyślnie puste, nawet po utworzeniu tensora. Musisz zainicjować zmienną, jeśli chcesz jej użyć. Obiekt tf.global_variables_initializer () musi zostać wywołany w celu zainicjowania wartości zmiennej. Ten obiekt jawnie zainicjuje wszystkie zmienne. Jest to przydatne przed wytrenowaniem modelu.

Możesz sprawdzić wartości zmiennych, które utworzyłeś wcześniej. Zauważ, że musisz użyć run, aby ocenić tensor

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

Wynik

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

Możesz użyć utworzonego wcześniej symbolu zastępczego i podać mu rzeczywistą wartość. Musisz przekazać dane do metody feed_dict.

Na przykład weźmiesz potęgę 2 symbolu zastępczego data_placeholder_a.

import numpy as nppower_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śnienie kodu

  • import numpy as np: Importuj bibliotekę numpy, aby utworzyć dane
  • tf.pow (data_placeholder_a, 2): Utwórz ops
  • np.random.rand (1, 10): Utwórz losową tablicę danych
  • feed_dict = {data_placeholder_a: data}: podaj symbol zastępczy danymi

Wynik

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

Wykres

TensorFlow polega na genialnym podejściu do renderowania operacji. Wszystkie obliczenia są przedstawiane za pomocą schematu przepływu danych. Wykres przepływu danych został opracowany, aby zobaczyć zależności danych między poszczególnymi operacjami. Wzór matematyczny lub algorytm składa się z szeregu następujących po sobie operacji. Wykres to wygodny sposób na wizualizację sposobu koordynacji obliczeń.

Wykres przedstawia węzeł i krawędź . Węzeł jest reprezentacją operacji, czyli jednostką obliczeniową. Krawędź jest tensorem, może tworzyć nowy tensor lub zużywać dane wejściowe. Zależy to od zależności między poszczególnymi operacjami.

Struktura wykresu łączy ze sobą operacje (tj. Węzły) i sposób, w jaki te operacje są zasilane. Zwróć uwagę, że wykres nie przedstawia wyników operacji, a jedynie pomaga wizualizować powiązania między poszczególnymi operacjami.

Zobaczmy przykład.

Wyobraź sobie, że chcesz ocenić następującą funkcję:

TensorFlow utworzy wykres do wykonania funkcji. Wykres wygląda następująco:

Przykład wykresu TensorFlow

Możesz łatwo zobaczyć ścieżkę, którą pokonają tensory, aby dotrzeć do ostatecznego celu.

Na przykład możesz zobaczyć, że nie można wykonać operacji dodawania przed i. Wykres wyjaśnia, że:

  1. oblicz i:
  2. dodać 1) razem
  3. dodaj do 2)
  4. dodać 3) do
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śnienie kodu

  • x: Zainicjuj zmienną o nazwie x ze stałą wartością 5
  • z: Zainicjuj zmienną o nazwie z ze stałą wartością 6
  • c: Zainicjuj stały tensor o nazwie c ze stałą wartością 5
  • kwadrat: Zainicjuj stały tensor zwany kwadratem o stałej wartości 2
  • f: Skonstruuj operatora

W tym przykładzie zdecydowaliśmy się zachować stałe wartości zmiennych. Stworzyliśmy również stały tensor o nazwie c, który jest stałym parametrem w funkcji f. Przyjmuje stałą wartość 5. Na wykresie można zobaczyć ten parametr w tensorze zwanym stałą.

Skonstruowaliśmy również stały tensor dla mocy w operatorze tf.pow (). To nie jest konieczne. Zrobiliśmy to, abyś mógł zobaczyć nazwę tensora na wykresie. Jest to okrąg zwany kwadratem.

Z wykresu można zrozumieć, co się stanie z tensorami i jak może zwrócić wynik 66.

Poniższy kod ocenia funkcję w sesji.

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

Wynik

[66] 

Podsumowanie

TensorFlow działa wokół:

  • Wykres : środowisko obliczeniowe zawierające operacje i tensory
  • Tensory : reprezentuje dane (lub wartość), które będą płynąć na wykresie. To jest krawędź na wykresie
  • Sesje : Zezwalaj na wykonywanie operacji

Utwórz stały tensor

stały obiekt

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)

Utwórz operator

Utwórz operator Obiekt

a + b

tf.add (a, b)

a * b

tf.multiply (a, b)

Utwórz zmienny tensor

Utwórz zmienną

obiekt

wartość losowa

tf.get_variable ("zmienna", [1, 2])

zainicjowana pierwsza wartość

tf.get_variable ("var_init_2", dtype = tf.int32, initializer = [[1, 2], [3, 4]])

Otwórz sesję

Sesja obiekt

Utwórz sesję

tf.Session ()

Uruchom sesję

tf.Session.run ()

Oceń tensor

nazwa_zmiennej.eval ()

Zamknij sesję

sess.close ()

Sesja po bloku

z tf.Session () as sess: