forked from KEMT/zpwiki
		
	oprava preklepu
This commit is contained in:
		
							parent
							
								
									676f66822b
								
							
						
					
					
						commit
						6e45bf17c8
					
				@ -1,4 +1,5 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# PYTORCH - LSTM TUTORIÁL
 | 
					# PYTORCH - LSTM TUTORIÁL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Čo je to Pytorch?
 | 
					### Čo je to Pytorch?
 | 
				
			||||||
@ -96,20 +97,25 @@ import torch
 | 
				
			|||||||
import torch.nn as nn
 | 
					import torch.nn as nn
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Následne sa presunieme k vytváraniu LSTM vrstvy, ktoré funguje rovnako ako pri ostatných typoch vrstiev. LSTM vrste totiž budeme priradzovať argumenty. V tomto príklade budú použité 3 argumenty:
 | 
					Následne sa presunieme k vytváraniu LSTM vrstvy, ktoré funguje rovnako ako pri ostatných typoch vrstiev. LSTM vrste totiž budeme priradzovať argumenty. V tomto príklade budú použité 3 argumenty:
 | 
				
			||||||
- vstupná dimenzia (*input dimension*): definuje veľkosť vstupu v každom časovom kroku, napr. ak má vstupná dimenzia veľkosť 5, vstup bude vyzerať podobne - `[5, 3, 8, 6, 2]`
 | 
					- vstupná dimenzia (*input dimension*): definuje veľkosť vstupu v každom časovom kroku, napr. ak má vstupná dimenzia veľkosť 5, vstup bude vyzerať podobne - `[5, 3, 8, 6, 2]`,
 | 
				
			||||||
- skrytá dimenzia (*hidden dimension*): predstavuje veľkosť "cell state" a "hidden state" v každom časovom kroku
 | 
					- skrytá dimenzia (*hidden dimension*): predstavuje veľkosť "cell state" a "hidden state" v každom časovom kroku,
 | 
				
			||||||
- počet vrstiev: počet LSTM vrstiev "naskladaných" na seba
 | 
					- počet vrstiev: počet LSTM vrstiev "naskladaných" na seba.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```python
 | 
					```python
 | 
				
			||||||
input_dim = 5 #velkost vstupnej dimenzie
 | 
					input_dim = 5 #velkost vstupnej dimenzie
 | 
				
			||||||
hidden_dim = 10 #velkosť skrytej dimenzie
 | 
					hidden_dim = 10 #velkosť skrytej dimenzie
 | 
				
			||||||
n_layers = 1 #pocet vrstiev
 | 
					n_layers = 1 #pocet vrstiev
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tieto parametre potom uložíme do LSTM vrstvy nasledovne:
 | 
					Tieto parametre potom uložíme do LSTM vrstvy nasledovne:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```python
 | 
					```python
 | 
				
			||||||
lstm_layer = nn.LSTM(input_dim, hidden_dim, n_layers)
 | 
					lstm_layer = nn.LSTM(input_dim, hidden_dim, n_layers)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
V ďalšom kroku si vytvoríme fiktívne dáta aby sme videli, ako funguje vstup na vrstve. Keďže sme veľkosť dimenzie definovali ako 5, potrebujeme vytvoriť tensor vo tvare `(1, 1, 5)`. Hodnoty v tensore reprezentujú `(veľkosť vzorky, dĺžka sekvencie, veľkosť vstupnej dimenzie)`.
 | 
					V ďalšom kroku si vytvoríme fiktívne dáta aby sme videli, ako funguje vstup na vrstve. Keďže sme veľkosť dimenzie definovali ako 5, potrebujeme vytvoriť tensor vo tvare `(1, 1, 5)`. Hodnoty v tensore reprezentujú `(veľkosť vzorky, dĺžka sekvencie, veľkosť vstupnej dimenzie)`.
 | 
				
			||||||
Taktiež potrebujeme inicializovať "cell state" a "hidden state" jednotky LSTM. Tieto 2 parametre sú uložené vo "zväzku" vo formáte `(hidden state, cell state)`.
 | 
					Taktiež potrebujeme inicializovať "cell state" a "hidden state" jednotky LSTM. Tieto 2 parametre sú uložené vo "zväzku" vo formáte `(hidden state, cell state)`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```python
 | 
					```python
 | 
				
			||||||
batch_size = 1 #velkost vzorky
 | 
					batch_size = 1 #velkost vzorky
 | 
				
			||||||
seq_len = 1 #dlzka sekvencie
 | 
					seq_len = 1 #dlzka sekvencie
 | 
				
			||||||
@ -119,26 +125,34 @@ hidden_state = torch.randn(n_layers, batch_size, hidden_dim)
 | 
				
			|||||||
cell_state = torch.randn(n_layers, batch_size, hidden_dim)
 | 
					cell_state = torch.randn(n_layers, batch_size, hidden_dim)
 | 
				
			||||||
hidden = (hidden_state, cell_state)
 | 
					hidden = (hidden_state, cell_state)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> Ak máme vstupnú sekvenciu (*seq_len*) napr. 100, veľkosť vzorky (*batch_size*) udáva, v akých dávkach sa bude sekvencia spracovaná a vyhodnotená. Ak máme napr. veľkosť vzorky 20, sekvencia bude spracovaná v 5 dávkach po 20.
 | 
					> Ak máme vstupnú sekvenciu (*seq_len*) napr. 100, veľkosť vzorky (*batch_size*) udáva, v akých dávkach sa bude sekvencia spracovaná a vyhodnotená. Ak máme napr. veľkosť vzorky 20, sekvencia bude spracovaná v 5 dávkach po 20.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Ak si chceme skontrolovať v akom tvare bude vyzerať tvar vstupnej vrstvy a skrytej vrstvy, môžeme to urobiť pomocou príkazov `print` a `shape`:
 | 
					Ak si chceme skontrolovať v akom tvare bude vyzerať tvar vstupnej vrstvy a skrytej vrstvy, môžeme to urobiť pomocou príkazov `print` a `shape`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```python
 | 
					```python
 | 
				
			||||||
print("Input shape:", inp.shape)
 | 
					print("Input shape:", inp.shape)
 | 
				
			||||||
print("Hidden shape:", hidden_state.shape, ",", cell_state.shape)
 | 
					print("Hidden shape:", hidden_state.shape, ",", cell_state.shape)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Výstup bude vyzerať nasledovne:
 | 
					Výstup bude vyzerať nasledovne:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
(base) dl874wn@Darius-PC:~$ python test.py
 | 
					(base) dl874wn@Darius-PC:~$ python test.py
 | 
				
			||||||
Input shape: torch.Size([1, 1, 5])
 | 
					Input shape: torch.Size([1, 1, 5])
 | 
				
			||||||
Hidden shape: torch.Size([1, 1, 10]) , torch.Size([1, 1, 10])
 | 
					Hidden shape: torch.Size([1, 1, 10]) , torch.Size([1, 1, 10])
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Na záver pridáme vstupy a skryté stavy (*hidden states*):
 | 
					Na záver pridáme vstupy a skryté stavy (*hidden states*):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```python
 | 
					```python
 | 
				
			||||||
out, hidden = lstm_layer(inp, hidden)
 | 
					out, hidden = lstm_layer(inp, hidden)
 | 
				
			||||||
print("Output shape:", out.shape)
 | 
					print("Output shape:", out.shape)
 | 
				
			||||||
print("Hidden:", hidden)
 | 
					print("Hidden:", hidden)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Na výstupe by sa mal objaviť tvar výstupných tensorov a taktiež samotné tensory pre "cell state" a "hidden state":
 | 
					Na výstupe by sa mal objaviť tvar výstupných tensorov a taktiež samotné tensory pre "cell state" a "hidden state":
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
Output shape: torch.Size([1, 1, 10])
 | 
					Output shape: torch.Size([1, 1, 10])
 | 
				
			||||||
Hidden: (tensor([[[-0.3184, 0.0795, -0.2122, -0.0699, -0.1824, -0.1231, -0.1314, 0.3096, -0.0371, 0.0488]]], grad_fn=<StackBackward>), tensor([[[-0.5415, 0.2349, -0.4794, -0.1918, -0.2433, -0.2443, -0.2989, 0.5557, -0.0896, 0.1062]]], grad_fn=<StackBackward>))
 | 
					Hidden: (tensor([[[-0.3184, 0.0795, -0.2122, -0.0699, -0.1824, -0.1231, -0.1314, 0.3096, -0.0371, 0.0488]]], grad_fn=<StackBackward>), tensor([[[-0.5415, 0.2349, -0.4794, -0.1918, -0.2433, -0.2443, -0.2989, 0.5557, -0.0896, 0.1062]]], grad_fn=<StackBackward>))
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user