Realizace neuronových sítí s využitím knihovny PyTorch (3. část)

24. 4. 2025
Doba čtení: 34 minut

Sdílet

Autor: Redakce
Ukázali jsme si konstrukci, trénink a validaci neuronových sítí s využitím knihovny PyTorch. Zbývá nám ovšem seznámit se blíže s konceptem afinních transformací a aktivačních funkcí. Právě to je téma dnešního článku.

Obsah

1. Realizace neuronových sítí s využitím knihovny PyTorch (3. část)

2. Třída torch.nn.Linear: základ pro tvorbu neuronových sítí

3. Přečtení vah i biasu z objektu typu torch.nn.Linear

4. Afinní transformace bez vstupů a výstupů?

5. Specifikace vah a biasu po konstrukci objektu typu torch.nn.Linear

6. Aplikace lineární transformace reprezentované objektem typu torch.nn.Linear

7. Aplikace lineární transformace na tenzor vyššího řádu

8. Transformace v rovině prováděné instancemi třídy Linear

9. Realizace transformace otáčející body v rovině o 90°

10. Neuronová síť s jedním vstupem a jedním výstupem, bez aktivační funkce

11. Realizace neuronové sítě, výpis výsledků

12. Neuronová síť s jedním vstupem a dvěma výstupy, bez aktivační funkce

13. Realizace neuronové sítě, výpis výsledků

14. Neuronová síť se dvěma vstupy a jedním výstupem, bez aktivační funkce

15. Realizace neuronové sítě, výpis výsledků

16. Přidání aktivační funkce

17. Realizace neuronové sítě, výpis výsledků

18. Závěr

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Realizace neuronových sítí s využitím knihovny PyTorch (3. část)torch.nn.Linear: základ pro tvorbu neuronových sítí

V předchozím článku o tvorbě, tréninku a validaci neuronových sítí s využitím knihovny PyTorch jsme při konstrukci neuronových sítí použili třídu nazvanou torch.nn.Linear. Připomeňme si, že tato třída byla použita při konfiguraci jednotlivých vrstev neuronové sítě. Například konstruktor neuronové sítě s jednou vstupní vrstvou, jednou vrstvou skrytou a jednou výstupní vrstvou vypadal následovně:

    def __init__(self, input_dim, hidden_dim, output_dim):
        super().__init__()
        # vrstvy neuronové sítě
        self.layer_1 = nn.Linear(input_dim, hidden_dim)
        self.layer_2 = nn.Linear(hidden_dim, output_dim)

V první části dnešního článku si popíšeme základní vlastnosti této třídy, která sice provádí v podstatě triviální matematické operace, ovšem současně je nezbytným prvkem většiny klasických neuronových sítí.

2. Třída torch.nn.Linear: základ pro tvorbu neuronových sítí

Třída torch.nn.Linear slouží pro konstrukci objektu, který dokáže provádět afinní (a popř. současně i lineární) transformace. A vzhledem k tomu, že knihovna PyTorch nepracuje s běžnými vektory a maticemi, ale s tenzory, jsou tyto transformace prováděny právě s tenzory (které mohou být různého řádu):

y = xAT + b
Poznámka: jedná se tedy o kombinaci (složení) lineární transformace a posunutí.

Interně si tedy instance třídy torch.nn.Linear musí pamatovat tenzory A a b, ovšem vzhledem k tomu, že primárním účelem PyTorche je práce s neuronovými sítěmi, jsou tyto tenzory uloženy do atributů nazvaných weight a bias, protože právě tyto termíny se v oblasti neuronových sítí používají.

Při konstrukci objektů tohoto typu se volí počet vstupů a výstupů, z čehož se odvodí rozměry tenzorů. A taktéž je možné zvolit, zda se bude při výpočtech používat i posun (bias) či nikoli:

Help on class Linear in module torch.nn.modules.linear:
 
class Linear(torch.nn.modules.module.Module)
 |  Linear(in_features: int, out_features: int, bias: bool = True, device=None, dtype=None) -> None
 |
 |  Applies an affine linear transformation to the incoming data: :math:`y = xA^T + b`.
 |
 |  This module supports :ref:`TensorFloat32<tf32_on_ampere>`.
 |
 |  On certain ROCm devices, when using float16 inputs this module will use :ref:`different precision<fp16_on_mi200>` for backward.
 |
 |  Args:
 |      in_features: size of each input sample
 |      out_features: size of each output sample
 |      bias: If set to ``False``, the layer will not learn an additive bias.
 |          Default: ``True``
 |
 |  Shape:
 |      - Input: :math:`(*, H_{in})` where :math:`*` means any number of
 |        dimensions including none and :math:`H_{in} = \text{in\_features}`.
 |      - Output: :math:`(*, H_{out})` where all but the last dimension
 |        are the same shape as the input and :math:`H_{out} = \text{out\_features}`.
 |
 |  Attributes:
 |      weight: the learnable weights of the module of shape
 |          :math:`(\text{out\_features}, \text{in\_features})`. The values are
 |          initialized from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})`, where
 |          :math:`k = \frac{1}{\text{in\_features}}`
 |      bias:   the learnable bias of the module of shape :math:`(\text{out\_features})`.
 |              If :attr:`bias` is ``True``, the values are initialized from
 |              :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
 |              :math:`k = \frac{1}{\text{in\_features}}`
 ...
 ...
 ...
Poznámka: jen na okraj si povšimněte zápisu matematických výrazů v nápovědě, které mají formát TeXu. Ty mohou být vykresleny například při zobrazení nápovědy v Jupyter Notebooku.

3. Přečtení vah i biasu z objektu typu torch.nn.Linear

Při konstrukci objektu typu torch.nn.Linear se v tom nejjednodušším případě specifikuje pouze počet vstupů a výstupů (afinní transformace). V tom nejjednodušším (praktickém) případě budeme mít pouze jeden vstup a jeden výstup, tj. transformace provede mapování jedné skalární hodnoty na jinou skalární hodnotu (interně se však stále pracuje s tenzory!). Tenzor s váhami i tenzor s biasem budou mít každý jen jeden prvek naplněný náhodnou hodnotou v rozmezí 0..1.

Ověřme si tato tvrzení spuštěním následujícího skriptu:

from torch import nn
 
l = nn.Linear(1, 1)
 
print("Weights:", l.weight)
print()
print("Bias:", l.bias)

Výsledkem bude tenzor vah s jediným prvkem, ovšem bude se stále jednat o tenzor druhého řádu (matici). Naproti tomu biasy jsou reprezentovány vektorem – tenzorem prvního řádu:

Weights: Parameter containing:
tensor([[0.0015]], requires_grad=True)
 
Bias: Parameter containing:
tensor([-0.4622], requires_grad=True)

V případě, že při konstrukci objektu typu torch.nn.Linear zakážeme použití biasů, neměl by být příslušný tenzor vůbec inicializován. Opět si to ověříme:

from torch import nn
 
l = nn.Linear(1, 1, bias=False)
 
print("Weights:", l.weight)
print()
print("Bias:", l.bias)

Výsledky ukazují, že se v tomto případě skutečně inicializuje pouze tenzor druhého řádu (matice) s vahami:

Weights: Parameter containing:
tensor([[-0.7296]], requires_grad=True)
 
Bias: None

4. Afinní transformace bez vstupů a výstupů?

Teoreticky je možné zkonstruovat třídu torch.nn.Linear, která bude reprezentovat afinní transformaci bez vstupů popř. bez výstupů. V praxi to nedává smysl, ale knihovna PyTorch nám tuto konstrukci umožňuje, což si opět ověříme:

from torch import nn
 
l = nn.Linear(0, 0)
 
print("Weights:", l.weight)
print()
print("Bias:", l.bias)
print()
 
l = nn.Linear(1, 0)
 
print("Weights:", l.weight)
print()
print("Bias:", l.bias)
print()
 
l = nn.Linear(0, 1)
 
print("Weights:", l.weight)
print()
print("Bias:", l.bias)

Knihovna PyTorch vypíše varování, že výsledek nemusí být užitečný:

torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op
  warnings.warn("Initializing zero-element tensors is a no-op")

Ovšem všechny tři objekty budou zkonstruovány. Povšimněte si, jak jsou nastaveny jejich atributy v těchto mezních případech:

Weights: Parameter containing:
tensor([], size=(0, 0), requires_grad=True)
 
Bias: Parameter containing:
tensor([], requires_grad=True)
 
 
 
Weights: Parameter containing:
tensor([], size=(0, 1), requires_grad=True)
 
Bias: Parameter containing:
tensor([], requires_grad=True)
 
 
 
Weights: Parameter containing:
tensor([], size=(1, 0), requires_grad=True)
 
Bias: Parameter containing:
tensor([0.], requires_grad=True)

5. Specifikace vah a biasu po konstrukci objektu typu torch.nn.Linear

Objekt představující afinní transformaci s náhodnými hodnotami uloženými v matici pro lineární transformaci i vektoru pro posun je sice užitečný při tréninku neuronové sítě, ovšem v některých případech potřebujeme prvky obou tenzorů (matice i vektoru) naplnit explicitně zadanými daty. To je možné provést přímým zápisem do atributů weight a bias. Ovšem je nutné vědět, že se nezapisují přímo tenzory, ale hodnoty typu torch.nn.Parameter, které si prozatím můžeme představit jako tenzory doplněné a metadata.

Pokusme se tedy zkonstruovat objekt, který bude provádět tuto jednoduchou transformaci:

y = 2x + 10

Provedeme to následujícím způsobem:

from torch import tensor, nn
 
l = nn.Linear(1, 1)
 
l.weight = nn.Parameter(data=tensor([[2.0]]))
l.bias = nn.Parameter(data=tensor([10.0]))
 
print("Weights:", l.weight)
print()
print("Bias:", l.bias)

Po spuštění tohoto skriptu si lze snadno ověřit, že parametry transformace jsou nastaveny korektně:

Weights: Parameter containing:
tensor([[2.]], requires_grad=True)
 
Bias: Parameter containing:
tensor([10.], requires_grad=True)

6. Aplikace lineární transformace reprezentované objektem typu torch.nn.Linear

Nyní se konečně dostáváme k praktickému využití objektů typu torch.nn.Linear. Provedeme lineární transformaci, kterou jsme zmínili v předchozí kapitole:

y = 2x + 10

Vstupem bude tenzor s jediným prvkem [1.0] (jedná se o jednorozměrný vektor). Po provedení afinní transformace bychom měli dostat hodnotu 2×1.0+10=12 (resp. tenzor s touto hodnotou), což si ověříme:

from torch import tensor, nn
 
l = nn.Linear(1, 1)
 
l.weight = nn.Parameter(data=tensor([[2.0]]))
l.bias = nn.Parameter(data=tensor([10.0]))
 
x = tensor([1.0])
y = l(x)
 
print(y)

Výsledkem je skutečně tenzor s jediným prvkem majícím hodnotu 12:

tensor([12.], grad_fn=<ViewBackward0>)
Poznámka: povšimněte si, jak se vlastně zapisuje výpočet lineární transformace. Používá se zde přetížený operátor volání (funkce), takže z tohoto pohledu se objekt typu torch.nn.Linear chová jako volatelná funkce.

7. Aplikace lineární transformace na tenzor vyššího řádu

Lineární transformaci je možné aplikovat i na větší množství tenzorů. V praxi postačuje, aby tenzor měl více dimenzí (větší řád), než odpovídá nakonfigurované transformaci. V tomto případě je transformace vypočtena pro celý vstupní tenzor. Asi nejlépe bude celý postup patrný z dalšího demonstračního příkladu, ve kterém je (opět) nakonfigurována transformace:

y = 2x + 10

Teoreticky by tedy měl být na vstupu tenzor s jediným prvkem. Pokud ovšem předáme (de facto) vektor, bude transformace aplikována na všechny prvky tohoto vektoru. To ovšem není nic překvapivého a odpovídá to popisu uvedeného v úvodní kapitole. V dalším příkladu budeme transformovat vektor s deseti prvky. Povšimněte si, jaký je tvar tohoto tenzoru:

import torch
from torch import nn
 
l = nn.Linear(1, 1)
 
l.weight = nn.Parameter(data=torch.tensor([[2.0]]))
l.bias = nn.Parameter(data=torch.tensor([10.0]))
 
x = torch.reshape(torch.arange(1.0, 11), (10, 1))
y = l(x)
 
print(y)

Výsledek by měl vypadat následovně:

tensor([[12.],
        [14.],
        [16.],
        [18.],
        [20.],
        [22.],
        [24.],
        [26.],
        [28.],
        [30.]], grad_fn=<.AddmmBackward0>)

Jedná se tedy postupně o prvky s hodnotou 1×2+10=12, 2×2+10=14 atd.

8. Transformace v rovině prováděné instancemi třídy Linear

V případě, že bude tenzor s váhami tvořit matici 2×2 prvky a vektor s biasy bude dvouprvkovým vektorem, bude možné provádět afinní transformaci bodů v rovině. Tato transformace se obecně skládá z rotace, změny měřítka (nezávisle v obou osách) a zkosení zkombinovaných s posunem. Ukažme si nejprve, jak vypadá reprezentace takové transformace ihned po konstrukci objektu typu torch.nn.Linear:

from torch import tensor, nn
 
l = nn.Linear(2, 2)
 
print("Weights:", l.weight)
print()
print("Bias:", l.bias)

Z vypsaných hodnot je patrné, že transformace je skutečně popsána maticí 2×2 prvky a vektorem se dvěma prvky. Hodnoty jsou náhodné:

Weights: Parameter containing:
tensor([[ 0.2398,  0.0439],
        [-0.2865,  0.5355]], requires_grad=True)
 
Bias: Parameter containing:
tensor([ 0.3383, -0.6409], requires_grad=True)

9. Realizace transformace otáčející body v rovině o 90°

V dalším kroku si vyzkoušíme nastavit objekt typu torch.nn.Linear takovým způsobem, aby se skutečně prováděla základní lineární transformace v rovině. Konkrétně se bude jednat o otáčení bodů o 90°. Takovou transformaci lze reprezentovat maticí 2×2 prvky, přičemž hodnoty prvků budou rovny hodnotám cos φ a sin φ (v jednom místě se změnou znaménka):

|                 |
| cos φ    -sin φ |
|                 |
| sin φ     cos φ |
|                 |

Nejprve si necháme vypočítat hodnoty sinů a kosinů pro zadaný úhel:

phi = 90
cos_phi = math.cos(math.radians(phi))
sin_phi = math.sin(math.radians(phi))

Dále matici zkonstruujeme, a to prozatím ve formě seznamu seznamů:

rotation_matrix = [
        [cos_phi, -sin_phi],
        [sin_phi,  cos_phi],
        ]

Provádět budeme jen rotaci, nikoli posun, takže vektor (biasů) bude obsahovat nulové prvky:

translation_vector = [0.0, 0.0]

Následně jen musíme zkonstruovat objekt představující lineární transformaci a nastavit příslušné tenzory vah a biasů:

l = nn.Linear(2, 2)
 
l.weight = nn.Parameter(data=torch.tensor(rotation_matrix))
l.bias = nn.Parameter(data=torch.tensor(translation_vector))

V ukázkovém skriptu se pokusíme o rotaci bodu [1, 2] v rovině:

import math
import torch
from torch import nn
 
l = nn.Linear(2, 2)
 
phi = 90
cos_phi = math.cos(math.radians(phi))
sin_phi = math.sin(math.radians(phi))
 
rotation_matrix = [
        [cos_phi, -sin_phi],
        [sin_phi,  cos_phi],
        ]
 
translation_vector = [0.0, 0.0]
 
l.weight = nn.Parameter(data=torch.tensor(rotation_matrix))
l.bias = nn.Parameter(data=torch.tensor(translation_vector))
 
x = torch.tensor([1.0, 2.0])
y = l(x)
 
print(y)

Z výsledků je patrné, že rotace skutečně proběhla:

tensor([-2.,  1.], grad_fn=<ViewBackward0>)

Což si můžeme i vizualizovat:

             |
             |......+ [1,2]
 [-2,1]      |      :
   +.........|      :
   :         |      :
   :         |      :
-------------+--------------
             | [0,0]
             |
             |
             |
             |
             |

10. Neuronová síť s jedním vstupem a jedním výstupem, bez aktivační funkce

Nyní již známe všechny důležité vlastnosti třídy torch.nn.Linear. Můžeme jít dále – vytvoříme si velmi jednoduchou neuronovou síť, která bude mít jediný vstup, jediný výstup a nebude obsahovat aktivační funkci (namísto ní si představte identitu). Tato síť tedy bude provádět nám již známou transformaci jednoho skaláru na jiný skalár:

y = xAT + b

přičemž A je matice 1×1 a b je jednoprvkový vektor.

Konstrukce neuronové sítě s nastavením matice A i vektoru b na nějaké „rozumné“ hodnoty může vypadat takto:

def __init__(self, input_dim, output_dim):
    super().__init__()
    # vrstvy neuronové sítě
    self.layer_1 = nn.Linear(input_dim, output_dim)
    self.layer_1.weight = nn.Parameter(data=torch.tensor([[2.0]]))
    self.layer_1.bias = nn.Parameter(data=torch.tensor([10.0]))

Důležitá je metoda forward, která využívá lineární transformaci uloženou do atributu layer1:

def forward(self, x):
    # propagace hodnot přes neuronovou síť
    return self.layer_1(x)

Povšimněte si, že jsme jednoduše pro vstup x použili přímo lineární transformaci pro výpočet výstupní hodnoty neuronové sítě.

11. Realizace neuronové sítě, výpis výsledků

Skript s realizací neuronové sítě popsané v desáté kapitole ověří, zda síť pracuje přesně tak, jak je očekáváno, tj. zda se provádí korektní transformace:

import torch
from torch import nn
 
 
class NeuralNetwork(nn.Module):
    """Třída reprezentující neuronovou síť."""
 
    def __init__(self, input_dim, output_dim):
        super().__init__()
        # vrstvy neuronové sítě
        self.layer_1 = nn.Linear(input_dim, output_dim)
        self.layer_1.weight = nn.Parameter(data=torch.tensor([[2.0]]))
        self.layer_1.bias = nn.Parameter(data=torch.tensor([10.0]))
 
    def forward(self, x):
        # propagace hodnot přes neuronovou síť
        return self.layer_1(x)
 
 
# konfigurace vrstev neuronové sítě
input_dim = 1
output_dim = 1
 
# konstrukce neuronové sítě
nn1 = NeuralNetwork(input_dim, output_dim)
 
# výpis základních informací o neuronové síti
print("Neural network:", nn1)
print()
 
# výpis informace o vrstvě neuronové sítě
print("Layer 1:", nn1.layer_1)
print()
 
# výpis informace o transformační matici a biasech
print("Weights:", nn1.layer_1.weight)
print("Bias:", nn1.layer_1.bias)
print()
 
with torch.no_grad():
    X = torch.reshape(torch.arange(1.0, 11), (10, 1))
    output = nn1(X)
    print(output)

Po spuštění skriptu se nejdříve zobrazí základní informace o neuronové síti:

Neural network: NeuralNetwork(
  (layer_1): Linear(in_features=1, out_features=1, bias=True)
)
 
Layer 1: Linear(in_features=1, out_features=1, bias=True)

Dále se zobrazí matice A a vektor b jediné vrstvy sítě:

Weights: Parameter containing:
tensor([[2.]], requires_grad=True)
 
Bias: Parameter containing:
tensor([10.], requires_grad=True)

Nejdůležitější jsou však „predikce“ této sítě pro hodnoty 1–10 uložené v tenzoru. Výsledky by měly vypadat následovně:

tensor([[12.],
        [14.],
        [16.],
        [18.],
        [20.],
        [22.],
        [24.],
        [26.],
        [28.],
        [30.]])

Síť tedy odpovídá přesně na základě dat, kterými jsme ji naučili – a to přímo (bez zpětné propagace).

12. Neuronová síť s jedním vstupem a dvěma výstupy, bez aktivační funkce

Samozřejmě nám nic nebrání v úpravě konfigurace neuronové sítě takovým způsobem, že namísto jedné výstupní hodnoty (skaláru) získáme dvouprvkový vektor. Transformace, která se bude provádět, bude stále stejná:

y = xAT + b

ovšem lišit se bude velikost matice A (nikoli jeden prvek, ale sloupec se dvěma řádky) i délka vektoru b (namísto jednoho prvku bude mít vektor prvky dva).

Samotný konstruktor neuronové sítě se změní následovně:

def __init__(self, input_dim, output_dim):
    super().__init__()
    # vrstvy neuronové sítě
    self.layer_1 = nn.Linear(input_dim, output_dim)
    self.layer_1.weight = nn.Parameter(data=torch.tensor([[1.0], [2.0]]))
    self.layer_1.bias = nn.Parameter(data=torch.tensor([0.0, 0.0]))
Poznámka: zapamatujte si především strukturu tenzoru, kterým se naplní atribut weight (jedná se tedy o matici A z předchozího vztahu). V dalším příkladu budeme taktéž konstruovat tenzor se dvěma prvky, ovšem jeho struktura bude odlišná (jednoduše – počet řádků se zamění za počet sloupců).

13. Realizace neuronové sítě, výpis výsledků

Opět si ukažme úplný skript, který po svém spuštění vytvoří neuronovou síť s jediným vstupem a s dvojicí výstupů, dále naplní hodnoty matice A a vektoru b a následně ověří, zda síť provádí korektní transformace:

import torch
from torch import nn
 
 
class NeuralNetwork(nn.Module):
    """Třída reprezentující neuronovou síť."""
 
    def __init__(self, input_dim, output_dim):
        super().__init__()
        # vrstvy neuronové sítě
        self.layer_1 = nn.Linear(input_dim, output_dim)
        self.layer_1.weight = nn.Parameter(data=torch.tensor([[1.0], [2.0]]))
        self.layer_1.bias = nn.Parameter(data=torch.tensor([0.0, 0.0]))
 
    def forward(self, x):
        # propagace hodnot přes neuronovou síť
        return self.layer_1(x)
 
 
# konfigurace vrstev neuronové sítě
input_dim = 1
output_dim = 2
 
# konstrukce neuronové sítě
nn1 = NeuralNetwork(input_dim, output_dim)
 
# výpis základních informací o neuronové síti
print("Neural network:", nn1)
print()
 
# výpis informace o vrstvě neuronové sítě
print("Layer 1:", nn1.layer_1)
print()
 
# výpis informace o transformační matici a biasech
print("Weights:", nn1.layer_1.weight)
print("Bias:", nn1.layer_1.bias)
print()
 
with torch.no_grad():
    X = torch.reshape(torch.arange(1.0, 11), (10, 1))
    output = nn1(X)
    print(output)

Po spuštění skriptu se opět nejdříve zobrazí základní parametry sítě:

Neural network: NeuralNetwork(
  (layer_1): Linear(in_features=1, out_features=2, bias=True)
)
 
Layer 1: Linear(in_features=1, out_features=2, bias=True)

Dále se zobrazí matice A a vektor b, tedy váhy a biasy jediné vrstvy:

Weights: Parameter containing:
tensor([[1.],
        [2.]], requires_grad=True)
 
Bias: Parameter containing:
tensor([0., 0.], requires_grad=True)

A konečně si necháme pro vstupní vektor s prvky s hodnotami 1..10 vypočítat výslednou matici – každý prvek (skalár) je totiž transformován na dvojici hodnot. Například prvek 1 je transformován na vektor [1, 2] atd.:

tensor([[ 1.,  2.],
        [ 2.,  4.],
        [ 3.,  6.],
        [ 4.,  8.],
        [ 5., 10.],
        [ 6., 12.],
        [ 7., 14.],
        [ 8., 16.],
        [ 9., 18.],
        [10., 20.]])

Neuronová síť tedy opět provádí přesně tu transformaci, na kterou jsme ji natrénovali.

14. Neuronová síť se dvěma vstupy a jedním výstupem, bez aktivační funkce

Naposledy se podívejme na konstrukci neuronové sítě, ve které se bude (stále) používat stejná afinní transformace:

y = xAT + b

Nyní bude ovšem síť akceptovat dva vstupy (tedy vektor) a bude mít jen jeden výstup. To znamená, že nyní je x dvouprvkovým vektorem a by jsou naopak skaláry (resp. přesněji řečeno skaláry reprezentované formou tenzorů).

Pro jednoduchost bude síť provádět výpočet průměru prvků vstupního dvouprvkového vektoru x=[x1, x2]:

y = (x1+x2)/2

To lze zapsat:

y = x1*0,5 + x2*0,5 = x*[0,5, 0,5]T + [0]

To znamená, že v matici A budou uloženy hodnoty [0,5 0,5] a ve vektoru b bude jediný nulový prvek:

def __init__(self, input_dim, output_dim):
    super().__init__()
    # vrstvy neuronové sítě
    self.layer_1 = nn.Linear(input_dim, output_dim)
    self.layer_1.weight = nn.Parameter(data=torch.tensor([[0.5, 0.5]]))
    self.layer_1.bias = nn.Parameter(data=torch.tensor([0.0]))
Poznámka: tenzor představující matici A tedy má opět dva prvky, ale skutečně došlo k záměně řádků za sloupce.

15. Realizace neuronové sítě, výpis výsledků

V dnešním předposledním skriptu je zkonstruována síť popsaná v předchozí kapitole a následně je provedena transformace tří vstupních vektorů na trojici skalárních hodnot. Vstupy jsou zvoleny takovým způsobem, aby se dalo jednoduše ověřit, zda síť skutečně provádí očekávané výpočty:

import torch
from torch import nn
 
 
class NeuralNetwork(nn.Module):
    """Třída reprezentující neuronovou síť."""
 
    def __init__(self, input_dim, output_dim):
        super().__init__()
        # vrstvy neuronové sítě
        self.layer_1 = nn.Linear(input_dim, output_dim)
        self.layer_1.weight = nn.Parameter(data=torch.tensor([[0.5, 0.5]]))
        self.layer_1.bias = nn.Parameter(data=torch.tensor([0.0]))
 
    def forward(self, x):
        # propagace hodnot přes neuronovou síť
        return self.layer_1(x)
 
 
# konfigurace vrstev neuronové sítě
input_dim = 2
output_dim = 1
 
# konstrukce neuronové sítě
nn1 = NeuralNetwork(input_dim, output_dim)
 
# výpis základních informací o neuronové síti
print("Neural network:", nn1)
print()
 
# výpis informace o vrstvě neuronové sítě
print("Layer 1:", nn1.layer_1)
print()
 
# výpis informace o transformační matici a biasech
print("Weights:", nn1.layer_1.weight)
print("Bias:", nn1.layer_1.bias)
print()
 
with torch.no_grad():
    print(nn1(torch.tensor([1.0, 1.0])))
    print(nn1(torch.tensor([1.0, 2.0])))
    print(nn1(torch.tensor([2.0, 2.0])))

Struktura sítě zobrazená po spuštění skriptu:

Neural network: NeuralNetwork(
  (layer_1): Linear(in_features=2, out_features=1, bias=True)
)
 
Layer 1: Linear(in_features=2, out_features=1, bias=True)

Parametry jediné vrstvy naší neuronové sítě:

Weights: Parameter containing:
tensor([[0.5000, 0.5000]], requires_grad=True)
 
Bias: Parameter containing:
tensor([0.], requires_grad=True)

Na závěr skript zobrazí výsledky tří transformací v této podobě:

tensor([1.])
tensor([1.5000])
tensor([2.])

Realizované výpočty si můžeme zobrazit následujícím způsobem:

[1.0, 1.0] → [1.])
[1.0, 2.0] → [1.5000])
[2.0, 2.0] → [2.])

Na levé straně jsou vektory přivedené na vstup neuronové sítě, na straně pravé pak výsledné skaláry, ovšem stále reprezentované formou tenzoru.

16. Přidání aktivační funkce

Prozatím všechny tři neuronové sítě, které jsme si ukázali, nepoužívaly aktivační funkci (resp. namísto ní byla použita identita). Samotná transformace prováděná neuronovou sítí je deklarována v metodě forward. Pro síť s jedinou vrstvou, navíc bez aktivační funkce, tato metoda vypadá následovně:

def forward(self, x):
    # propagace hodnot přes neuronovou síť
    return self.layer_1(x)

V posledním kroku, který si dnes ukážeme, do neuronové sítě přidáme aktivační funkci. Konkrétně se bude jednat o ReLU (rectified linear unit), jejíž průběh dobře známe:

pytorch-nn-1

Obrázek 1: Aktivační funkce ReLU.

Metodu forward je tedy nutné upravit do této podoby:

def forward(self, x):
    # propagace hodnot přes neuronovou síť
    x = nn.functional.relu(self.layer_1(x))
    return x

17. Realizace neuronové sítě, výpis výsledků

Pro otestování neuronové sítě s přidanou aktivační funkcí ReLU si nepatrně upravíme příklad z desáté kapitoly. Konkrétně síť nakonfigurujeme tak, že bude provádět afinní transformaci:

y = x - 5

To znamená, že matice A bude obsahovat jediný prvek 1,0 a vektor b bude obsahovat jediný prvek s hodnotou –5:

import torch
from torch import nn
 
 
class NeuralNetwork(nn.Module):
    """Třída reprezentující neuronovou síť."""
 
    def __init__(self, input_dim, output_dim):
        super().__init__()
        # vrstvy neuronové sítě
        self.layer_1 = nn.Linear(input_dim, output_dim)
        self.layer_1.weight = nn.Parameter(data=torch.tensor([[1.0]]))
        self.layer_1.bias = nn.Parameter(data=torch.tensor([-5.0]))
 
    def forward(self, x):
        # propagace hodnot přes neuronovou síť
        x = nn.functional.relu(self.layer_1(x))
        return x
 
 
# konfigurace vrstev neuronové sítě
input_dim = 1
output_dim = 1
 
# konstrukce neuronové sítě
nn1 = NeuralNetwork(input_dim, output_dim)
 
# výpis základních informací o neuronové síti
print("Neural network:", nn1)
print()
 
# výpis informace o vrstvě neuronové sítě
print("Layer 1:", nn1.layer_1)
print()
 
# výpis informace o transformační matici a biasech
print("Weights:", nn1.layer_1.weight)
print("Bias:", nn1.layer_1.bias)
print()
 
with torch.no_grad():
    X = torch.reshape(torch.arange(1.0, 11), (10, 1))
    output = nn1(X)
    print(X)
    print(output)

Skript po svém spuštění opět nejdříve zobrazí konfiguraci neuronové sítě:

Neural network: NeuralNetwork(
  (layer_1): Linear(in_features=1, out_features=1, bias=True)
)
 
Layer 1: Linear(in_features=1, out_features=1, bias=True)

Dále se zobrazí vlastnosti její jediné vrstvy:

Weights: Parameter containing:
tensor([[1.]], requires_grad=True)
 
Bias: Parameter containing:
tensor([-5.], requires_grad=True)

A nakonec se zobrazí dvojice tenzorů. První tenzor obsahuje vstupní prvky 1, 2 až 10, druhý tenzor pak výsledky vyprodukované neuronovou sítí, což jsou konkrétně hodnoty 0, 0, …0, 1, 2, 3, 4 a 5:

tensor([[ 1.],
        [ 2.],
        [ 3.],
        [ 4.],
        [ 5.],
        [ 6.],
        [ 7.],
        [ 8.],
        [ 9.],
        [10.]])
tensor([[0.],
        [0.],
        [0.],
        [0.],
        [0.],
        [1.],
        [2.],
        [3.],
        [4.],
        [5.]])

Výsledky si opět můžeme zobrazit formou jednoduché tabulky:

docker + kubernetes školení s dotací tip

 x    x-5.0   ReLU(x-5.0)
-------------------------
 1    -4      0
 2    -3      0
 3    -2      0
 4    -1      0
 5     0      0
 6     1      1
 7     2      2
 8     3      3
 9     4      4
10     5      5
Poznámka: díky ReLU jsme tedy do sítě vnesli potřebnou nelinearitu.

18. Závěr

V tento okamžik již velmi dobře víme, jakým způsobem neuronová síť provádí dopředné (forward) výpočty, tedy transformace a aplikace aktivačních funkcí. Máme taktéž odzkoušenu práci s tenzory. Zbývá nám jediné – zjistit způsob učení sítě formou zpětné propagace očekávaných výsledků pro zadané vstupy. To je, jak jsme již ostatně viděli minule, velmi důležité téma, protože při špatném nastavení sítě může docházet k jejímu nedoučení, přeučení atd. Příště tedy toto téma dokončíme a ukážeme si další variantu neuronových sítí. Bude se jednat o konvoluční neuronové sítě, které jsou v současnosti používány velmi často.

19. Repositář s demonstračními příklady

Všechny demonstrační příklady využívající knihovnu PyTorch lze nalézt v repositáři https://github.com/tisnik/most-popular-python-libs. Následují odkazy na jednotlivé příklady:

# Příklad Stručný popis Adresa příkladu
1 tensor_constructor_scalar1.py konstrukce tenzoru nultého a prvního řádu https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_scalar1.py
2 tensor_constructor_scalar2.py inicializace tenzoru prvního řádu s jedním prvkem https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_scalar2.py
3 tensor_constructor_vector1.py konstrukce tenzoru prvního řádu (tříprvkový vektor) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_vector1.py
4 tensor_constructor_vector2.py konstrukce tenzoru prvního řádu s inicializací prvků https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_vector2.py
5 tensor_constructor_vector3.py konstrukce tenzoru prvního řádu s využitím generátoru range https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_vector3.py
6 tensor_constructor_matrix1.py vytvoření a inicializace tenzoru druhého řádu, který může být reprezentován maticí https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_matrix1.py
7 tensor_constructor_matrix2.py inicializace prvků matice https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_matrix2.py
8 tensor_constructor_3D1.py tenzor třetího řádu reprezentovaný „3D maticí“ https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_3D1.py
9 tensor_constructor_3D2.py tenzor třetího řádu reprezentovaný „3D maticí“ (jiná forma inicializace) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_3D2.py
       
10 tensor_constructor_scalar_zero.py vynulování prvků tenzoru nultého řádu https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_scalar_ze­ro.py
11 tensor_constructor_vector_zero.py vynulování prvků tenzoru prvního řádu https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_vector_ze­ro.py
12 tensor_constructor_matrix_zero.py vynulování prvků tenzoru druhého řádu https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_matrix_ze­ro.py
13 tensor_constructor_3D_zero.py vynulování prvků tenzoru třetího řádu https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_constructor_3D_zero.py
       
14 tensor_zeros_shape.py použití konstruktoru zeros pro tenzory různých řádů a tvarů https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_zeros_shape.py
15 tensor_ones_shape.py použití konstruktoru ones pro tenzory různých řádů a tvarů https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_ones_shape.py
16 tensor_eye.py konstrukce jednotkové matice https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/tensor_eye.py
       
17 tensor_range.py využití konstruktoru range https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_range.py
18 tensor_arange.py využití konstruktoru arange https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_arange.py
       
19 tensor_shape.py zjištění tvaru tenzoru https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_shape.py
20 tensor_zeros_shape.py zjištění tvaru tenzoru vytvořeného konstruktorem zeros https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_zeros_shape.py
21 tensor_ones_shape.py zjištění tvaru tenzoru vytvořeného konstruktorem ones https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_ones_shape.py
22 tensor_read_dtype.py zjištění, jakého typu jsou prvky tenzoru https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_read_dtype.py
23 tensor_set_dtype.py nastavení či změna typu prvků tenzoru https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_set_dtype.py
       
24 tensor_storage1.py získání datové struktury se zdrojem dat pro tenzor https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_storage1.py
25 tensor_storage2.py získání datové struktury se zdrojem dat pro tenzor https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_storage2.py
26 tensor_storage3.py získání datové struktury se zdrojem dat pro tenzor https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_storage3.py
27 tensor_storage_casts.py přetypování datové struktury se zdrojem dat pro tenzor https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_storage_casts.py
       
28 tensor_slice_operation1.py konstrukce řezu z tenzoru prvního řádu https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_slice_operation1.py
29 tensor_slice_operation2.py konstrukce řezu z tenzoru druhého řádu (přes řádky a sloupce) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_slice_operation2.py
30 tensor_slice_operation3.py konstrukce řezu s jeho následnou modifikací https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_slice_operation3.py
31 tensor_slice_operation4.py konstrukce řezu s jeho následnou modifikací (odlišné operace od předchozího příkladu) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_slice_operation4.py
32 tensor_is_slice.py test základních vlastností řezů https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_is_slice.py
       
33 tensor_stride1.py význam atributů stride a storage_offset https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_stride1.py
34 tensor_stride2.py význam atributů stride a storage_offset https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_stride2.py
35 tensor_stride3.py význam atributů stride a storage_offset https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_stride3.py
       
36 tensor_reshape.py změna tvaru tenzoru operací reshape https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_reshape.py
37 tensor_reshape2.py změna tvaru tenzoru operací reshape https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_reshape2.py
       
38 tensor_narrow_operation1.py operace nad celým tenzorem typu narrow, první ukázka https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_narrow_operation1.py
39 tensor_narrow_operation1_B.py operace nad celým tenzorem typu narrow, první ukázka přepsaná do volání metody https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_narrow_operation1_B.py
40 tensor_narrow_operation2.py operace nad celým tenzorem typu narrow, druhá ukázka https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_narrow_operation2.py
41 tensor_narrow_operation2_B.py operace nad celým tenzorem typu narrow, druhá ukázka přepsaná do volání metody https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_narrow_operation2_B.py
42 tensor_narrow_operation3.py operace nad celým tenzorem typu narrow, třetí ukázka https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_narrow_operation3.py
43 tensor_narrow_operation3_B.py operace nad celým tenzorem typu narrow, třetí ukázka přepsaná do volání metody https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_narrow_operation3_B.py
44 tensor_narrow_operation4.py přepis původní matice přes pohled na ni (view) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_narrow_operation4.py
45 tensor_narrow_operation5.py přepis původní matice přes pohled na ni (view)narrow, třetí ukázka https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_narrow_operation5.py
       
46 tensor_operator_add.py součet dvou tenzorů prvek po prvku https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_add.py
47 tensor_operator_sub.py rozdíl dvou tenzorů prvek po prvku https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_sub.py
48 tensor_operator_mul.py součin dvou tenzorů prvek po prvku https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_mul.py
49 tensor_operator_div.py podíl dvou tenzorů prvek po prvku https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_div.py
50 tensor_dot_product.py skalární součin dvou tenzorů prvního řádu https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_dot_product.py
50 tensor_operator_matmul.py maticové násobení (dvou tenzorů druhého řádu) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_matmul.py
51 tensor_operator_matmul2.py maticové násobení (dvou tenzorů druhého řádu) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_matmul2.py
52 tensor_operator_matmul3.py maticové násobení v případě nekompatibilních tvarů matic https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_matmul3.py
53 tensor_operator_matmul4.py maticové násobení s broadcastingem https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_matmul4.py
54 tensor_operator_matmul5.py násobení vektoru a matice https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_operator_matmul5.py
       
55 tensor_broadcast1.py operace broadcast (součin každého prvku tenzoru se skalárem) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_broadcast1.py
56 tensor_broadcast2.py operace broadcast (součin tenzoru druhého řádu s vektorem) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_broadcast2.py
57 tensor_broadcast3.py operace broadcast (součin vektoru s tenzorem druhého řádu) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_broadcast3.py
58 tensor_broadcast4.py operace broadcast (součet tenzorů druhého a třetího řádu) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_broadcast4.py
       
59 tensor_sparse.py konstrukce řídkého tenzoru https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ten­sor_sparse.py
       
60 activation_function_relu_.py aktivační funkce ReLU vypočtená knihovnou NumPy https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ac­tivation_function_relu_num­py.py
61 activation_function_relu_pytorch.py aktivační funkce ReLU vypočtená knihovnou PyTorch https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ac­tivation_function_relu_py­torch.py
62 activation_function_sigmoid_.py aktivační funkce sigmoid vypočtená knihovnou NumPy https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ac­tivation_function_sigmoid_num­py.py
63 activation_function_sigmoid_pytorch.py aktivační funkce sigmoid vypočtená knihovnou PyTorch https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ac­tivation_function_sigmoid_py­torch.py
64 activation_function_tanh_.py aktivační funkce tanh vypočtená knihovnou NumPy https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ac­tivation_function_tanh_num­py.py
65 activation_function_tanh_pytorch.py aktivační funkce tanh vypočtená knihovnou PyTorch https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ac­tivation_function_tanh_py­torch.py
       
66 make_circles.py vygenerování dat pro neuronovou síť funkcí make_circles https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ma­ke_circles.py
67 make_circles_labels.py vizualizace dat společně s jejich skupinou (ohodnocením) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ma­ke_circles_labels.py
68 make_more_noise_circles.py získání náhodnějších dat funkcí make_circles https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ma­ke_more_noise_circles.py
69 make_data_set.py náhodné rozdělení datové sady funkcí train_test_split https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/ma­ke_data_set.py
70 prepare_for_training.py konverze původních dat z n-dimenzionálních polí do tenzorů https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/pre­pare_for_training.py
       
71 compute_train_and_test_data.py výpočet trénovacích a testovacích dat pro neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/com­pute_train_and_test_data.py
72 print_train_and_test_data.py tisk dat získaných předchozím skriptem https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/prin­t_train_and_test_data.py
73 nn01.py deklarace třídy představující neuronovou síť https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn01.py
74 nn02.py definice vrstev neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn02.py
75 nn03.py trénink neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn03.py
76 nn04.py trénink neuronové sítě se zobrazením kvality tréninku https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn04.py
77 nn05.py neuronová síť s jednou skrytou vrstvou https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn05.py
78 nn06.py neuronová síť s více skrytými vrstvami, která nebude dotrénována https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn06.py
79 nn07.py vliv parametru learning_rate na rychlosti naučení sítě https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn07.py
80 nn08.py výpočet kvality neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn08.py
81 nn09.py vizualizace predikce neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn09.py
       
82 nn_linear_help.py zobrazení nápovědy ke třídě torch.nn.Linear i k parametrům konstruktorů této třídy https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near_help.py
83 nn_linear1.py konstrukce objektu typu torch.nn.Linear s biasem (transformace s jedním vstupem a jedním výstupem) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near1.py
84 nn_linear2.py konstrukce objektu typu torch.nn.Linear bez biasu (transformace s jedním vstupem a jedním výstupem) https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near2.py
85 nn_linear3.py specifikace vah a biasu po konstrukci objektu typu torch.nn.Linear https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near3.py
86 nn_linear4.py aplikace lineární transformace reprezentované objektem typu torch.nn.Linear https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near4.py
87 nn_linear5.py aplikace lineární transformace na větší soubor vstupních tenzorů https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near5.py
88 nn_linear6.py 2D transformace prováděná objektem typu torch.nn.Linear https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near6.py
89 nn_linear7.py 2D transformace – otočení bodů v rovině https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near7.py
90 nn_linear_zeros.py konstrukce objektu typu torch.nn.Linear pro nulový počet vstupů a/nebo výstupů https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_li­near_zeros.py
91 nn_forward1.py neuronová síť s jedním vstupem a jedním výstupem, bez aktivační funkce https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_for­ward1.py
92 nn_forward2.py neuronová síť s jedním vstupem a dvěma výstupy, bez aktivační funkce https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_for­ward2.py
93 nn_forward3.py neuronová síť se dvěma vstupy a jedním výstupem, bez aktivační funkce https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_for­ward3.py
94 nn_forward4.py přidání aktivační funkce do neuronové sítě https://github.com/tisnik/most-popular-python-libs/blob/master/PyTorch/nn_for­ward4.py

20. Odkazy na Internetu

  1. Seriál Programovací jazyk Lua na Rootu:
    https://www.root.cz/seria­ly/programovaci-jazyk-lua/
  2. PDM: moderní správce balíčků a virtuálních prostředí Pythonu:
    https://www.root.cz/clanky/pdm-moderni-spravce-balicku-a-virtualnich-prostredi-pythonu/
  3. PyTorch Tutorial: Building a Simple Neural Network From Scratch
    https://www.datacamp.com/tu­torial/pytorch-tutorial-building-a-simple-neural-network-from-scratch
  4. Interní reprezentace numerických hodnot: od skutečného počítačového pravěku po IEEE 754–2008:
    https://www.root.cz/clanky/interni-reprezentace-numerickych-hodnot-od-skutecneho-pocitacoveho-praveku-po-ieee-754–2008/
  5. Interní reprezentace numerických hodnot: od skutečného počítačového pravěku po IEEE 754–2008 (dokončení):
    https://www.root.cz/clanky/interni-reprezentace-numerickych-hodnot-od-skutecneho-pocitacoveho-praveku-po-ieee-754–2008-dokonceni/
  6. Brain Floating Point – nový formát uložení čísel pro strojové učení a chytrá čidla:
    https://www.root.cz/clanky/brain-floating-point-ndash-novy-format-ulozeni-cisel-pro-strojove-uceni-a-chytra-cidla/
  7. Stránky projektu PyTorch:
    https://pytorch.org/
  8. Informace o instalaci PyTorche:
    https://pytorch.org/get-started/locally/
  9. Tenzor (Wikipedia):
    https://cs.wikipedia.org/wiki/Tenzor
  10. Introduction to Tensors:
    https://www.youtube.com/wat­ch?v=uaQeXi4E7gA
  11. Introduction to Tensors: Transformation Rules:
    https://www.youtube.com/wat­ch?v=j6DazQDbEhQ
  12. Tensor Attributes:
    https://pytorch.org/docs/sta­ble/tensor_attributes.html
  13. Tensors Explained Intuitively: Covariant, Contravariant, Rank :
    https://www.youtube.com/wat­ch?v=CliW7kSxxWU
  14. What is the relationship between PyTorch and Torch?:
    https://stackoverflow.com/qu­estions/44371560/what-is-the-relationship-between-pytorch-and-torch
  15. What is a tensor anyway?? (from a mathematician):
    https://www.youtube.com/wat­ch?v=K7f2pCQ3p3U
  16. Visualization of tensors – part 1 :
    https://www.youtube.com/wat­ch?v=YxXyN2ifK8A
  17. Visualization of tensors – part 2A:
    https://www.youtube.com/wat­ch?v=A95jdIuUUW0
  18. Visualization of tensors – part 2B:
    https://www.youtube.com/wat­ch?v=A95jdIuUUW0
  19. What the HECK is a Tensor?!?:
    https://www.youtube.com/wat­ch?v=bpG3gqDM80w
  20. Stránka projektu Torch
    http://torch.ch/
  21. Torch na GitHubu (několik repositářů)
    https://github.com/torch
  22. Torch (machine learning), Wikipedia
    https://en.wikipedia.org/wi­ki/Torch_%28machine_learnin­g%29
  23. Torch Package Reference Manual
    https://github.com/torch/tor­ch7/blob/master/README.md
  24. Torch Cheatsheet
    https://github.com/torch/tor­ch7/wiki/Cheatsheet
  25. An Introduction to Tensors
    https://math.stackexchange­.com/questions/10282/an-introduction-to-tensors
  26. Differences between a matrix and a tensor
    https://math.stackexchange­.com/questions/412423/dif­ferences-between-a-matrix-and-a-tensor
  27. Qualitatively, what is the difference between a matrix and a tensor?
    https://math.stackexchange­.com/questions/1444412/qu­alitatively-what-is-the-difference-between-a-matrix-and-a-tensor?
  28. Tensors for Neural Networks, Clearly Explained!!!:
    https://www.youtube.com/wat­ch?v=L35fFDpwIM4
  29. Tensor Processing Unit:
    https://en.wikipedia.org/wi­ki/Tensor_Processing_Unit
  30. Třída Storage:
    http://docs.pytorch.wiki/en/sto­rage.html
  31. Funkce torch.dot
    https://pytorch.org/docs/sta­ble/generated/torch.dot.html#tor­ch.dot
  32. Funkce torch.narrow
    https://pytorch.org/docs/sta­ble/generated/torch.narrow­.html
  33. Funkce torch.matmul
    https://pytorch.org/docs/sta­ble/generated/torch.matmul­.html
  34. Funkce torch.reshape
    https://pytorch.org/docs/sta­ble/generated/torch.resha­pe.html
  35. Funkce torch.arange
    https://pytorch.org/docs/sta­ble/generated/torch.arange­.html
  36. Funkce torch.range
    https://pytorch.org/docs/sta­ble/generated/torch.range­.html
  37. Třída torch.Tensor
    https://pytorch.org/docs/sta­ble/tensors.html
  38. Atributy tenzorů
    https://pytorch.org/docs/sta­ble/tensor_attributes.html
  39. Pohledy vytvořené nad tenzory
    https://pytorch.org/docs/sta­ble/tensor_view.html
  40. Broadcasting v knihovně
    https://numpy.org/doc/sta­ble/user/basics.broadcastin­g.html
  41. Broadcasting semantics (v knihovně PyTorch)
    https://pytorch.org/docs/sta­ble/notes/broadcasting.html
  42. Dot Product In Physics: What Is The Physical Meaning of It?
    https://profoundphysics.com/dot-product-in-physics-what-is-the-physical-meaning-of-it/
  43. scikit-learn: Getting Started
    https://scikit-learn.org/stable/getting_started.html
  44. Support Vector Machines
    https://scikit-learn.org/stable/modules/svm.html
  45. Use Deep Learning to Detect Programming Languages
    http://searene.me/2017/11/26/use-neural-networks-to-detect-programming-languages/
  46. Data pro neuronové sítě
    http://archive.ics.uci.edu/ml/in­dex.php
  47. Feedforward neural network
    https://en.wikipedia.org/wi­ki/Feedforward_neural_net­work
  48. Biologické algoritmy (4) – Neuronové sítě
    https://www.root.cz/clanky/biologicke-algoritmy-4-neuronove-site/
  49. Biologické algoritmy (5) – Neuronové sítě
    https://www.root.cz/clanky/biologicke-algoritmy-5-neuronove-site/
  50. Umělá neuronová síť (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Um%C4%9Bl%C3%A1_neuronov%C3%A1_s%C3%AD%C5%A5
  51. AI vs Machine Learning (Youtube)
    https://www.youtube.com/wat­ch?v=4RixMPF4×is
  52. Machine Learning | What Is Machine Learning? | Introduction To Machine Learning | 2024 | Simplilearn (Youtube)
    https://www.youtube.com/wat­ch?v=ukzFI9rgwfU
  53. A Gentle Introduction to Machine Learning (Youtube)
    https://www.youtube.com/wat­ch?v=Gv9_4yMHFhI
  54. Machine Learning vs Deep Learning
    https://www.youtube.com/wat­ch?v=q6kJ71tEYqM
  55. Umělá inteligence (slajdy)
    https://slideplayer.cz/sli­de/12119218/
  56. Úvod do umělé inteligence
    https://slideplayer.cz/slide/2505525/
  57. Umělá inteligence I / Artificial Intelligence I
    https://ktiml.mff.cuni.cz/~bartak/ui/
  58. Třída torch.nn.Linear
    https://pytorch.org/docs/sta­ble/generated/torch.nn.Li­near.html
  59. Třída torch.nn.Parameter
    https://pytorch.org/docs/sta­ble/generated/torch.nn.pa­rameter.Parameter.html
  60. Třída torch.nn.Sigmoid
    https://pytorch.org/docs/sta­ble/generated/torch.nn.Sig­moid.html

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.