Przykłady w PyTorchu
This commit is contained in:
parent
8f531a680c
commit
3d70d8a7ec
44
wyk/pytorch-regression/analyzer.py
Normal file
44
wyk/pytorch-regression/analyzer.py
Normal file
@ -0,0 +1,44 @@
|
||||
import regex as re
|
||||
from sklearn.feature_extraction.text import HashingVectorizer
|
||||
import torch
|
||||
|
||||
|
||||
token_root_len = 7
|
||||
|
||||
|
||||
class Analyzer(object):
|
||||
|
||||
def __init__(self):
|
||||
self.token_pat = re.compile(r'(?:\p{L}|\d)+')
|
||||
|
||||
def __call__(self, doc):
|
||||
return [tok[0:token_root_len] for tok in self.token_pat.findall(doc)]
|
||||
|
||||
|
||||
# hiperparametr - liczba bitów hasza
|
||||
vector_length = 2**18
|
||||
|
||||
|
||||
vectorizer = HashingVectorizer(n_features=vector_length, analyzer=Analyzer())
|
||||
|
||||
midpoint = 1913.0
|
||||
|
||||
|
||||
def vectorize_text(content):
|
||||
# musimy przekonwertować macierz sklearn => macierz numpy => tensor pytorcha
|
||||
return (torch.from_numpy(vectorizer.fit_transform([content]).toarray()))[0]
|
||||
|
||||
|
||||
def vectorize_batch(contents):
|
||||
# musimy przekonwertować macierz sklearn => macierz numpy => tensor pytorcha
|
||||
return (torch.from_numpy(vectorizer.fit_transform(contents).toarray()))
|
||||
|
||||
|
||||
|
||||
def process_line(line):
|
||||
fields = line.strip('\n').split('\t')
|
||||
|
||||
year_from, year_to, _, _, content = fields
|
||||
# normalizujemy lata do wartości (-1,1)
|
||||
year_normalized = ((float(year_from) + float(year_to)) / 2 - midpoint) / 100.0
|
||||
return (content, torch.tensor(year_normalized))
|
41
wyk/pytorch-regression/analyzer_classification.py
Normal file
41
wyk/pytorch-regression/analyzer_classification.py
Normal file
@ -0,0 +1,41 @@
|
||||
import regex as re
|
||||
from sklearn.feature_extraction.text import HashingVectorizer
|
||||
import torch
|
||||
|
||||
|
||||
token_root_len = 7
|
||||
|
||||
|
||||
class Analyzer(object):
|
||||
|
||||
def __init__(self):
|
||||
self.token_pat = re.compile(r'(?:\p{L}|\d)+')
|
||||
|
||||
def __call__(self, doc):
|
||||
return [tok[0:token_root_len] for tok in self.token_pat.findall(doc)]
|
||||
|
||||
|
||||
# hiperparametr - liczba bitów hasza
|
||||
vector_length = 2**18
|
||||
|
||||
|
||||
vectorizer = HashingVectorizer(n_features=vector_length, analyzer=Analyzer())
|
||||
|
||||
def vectorize_text(content):
|
||||
# musimy przekonwertować macierz sklearn => macierz numpy => tensor pytorcha
|
||||
return (torch.from_numpy(vectorizer.fit_transform([content]).toarray()))[0]
|
||||
|
||||
|
||||
def vectorize_batch(contents):
|
||||
# musimy przekonwertować macierz sklearn => macierz numpy => tensor pytorcha
|
||||
return (torch.from_numpy(vectorizer.fit_transform(contents).toarray()))
|
||||
|
||||
|
||||
|
||||
def process_line(line):
|
||||
fields = line.strip('\n').split('\t')
|
||||
|
||||
label, content = fields
|
||||
# normalizujemy lata do wartości (-1,1)
|
||||
y = float(label)
|
||||
return (content, torch.tensor(y))
|
24
wyk/pytorch-regression/linear0-infer.py
Executable file
24
wyk/pytorch-regression/linear0-infer.py
Executable file
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
|
||||
from analyzer import midpoint, vectorize_text
|
||||
import torch
|
||||
|
||||
w = torch.load('model.bin')
|
||||
|
||||
|
||||
def model(w, x):
|
||||
return x @ w
|
||||
|
||||
|
||||
for line in sys.stdin:
|
||||
line = line.strip('\n')
|
||||
content = line
|
||||
|
||||
x = vectorize_text(content)
|
||||
|
||||
y_hat = model(w, x)
|
||||
|
||||
# na wyjściu musimy mieć z powrotem rok
|
||||
print(max(1814.0, min(2013.999, y_hat.item() * 100.0 + midpoint)))
|
68
wyk/pytorch-regression/linear0.py
Executable file
68
wyk/pytorch-regression/linear0.py
Executable file
@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import torch
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_text
|
||||
|
||||
# Nasz model to zestaw wag w. Na koniec dojdziemy do modeli
|
||||
# Transformer o wielu milionach wag; w pewnym sensie algorytm
|
||||
# uczenia się nie zmieni.
|
||||
# W naszym zadaniu lepiej zacząć od zerowych wag zamiast losowych.
|
||||
# Znaczenie `requires_grad` zostanie omówione w kolejnym skrypcie.
|
||||
w = torch.zeros(vector_length, dtype=torch.double, requires_grad=False)
|
||||
|
||||
# Hiperparametr uczenia
|
||||
learning_rate = torch.tensor(.0032, dtype=torch.double)
|
||||
|
||||
|
||||
def model(w, x):
|
||||
# @ to iloczyn wektorów/macierzy w PyTorchu
|
||||
return x @ w
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return (y_hat - y_exp)**2
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 5000
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
for line in sys.stdin:
|
||||
content, y_exp = process_line(line)
|
||||
|
||||
x = vectorize_text(content)
|
||||
|
||||
# wartość z predykcji
|
||||
y_hat = model(w, x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
# Obliczamy gradient i aktualizujemy wagi.
|
||||
# TU SIĘ ODBYWA UCZENIE!
|
||||
grad = (y_hat - y_exp)
|
||||
w = w - learning_rate * x * grad
|
||||
|
||||
# (Niedogodność tej wersji: jeśli zmienimy model lub funkcję kosztu,
|
||||
# będziemy musieli zróżniczkować wszystko i ustalić formułę na grad.
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
closs += loss
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp.item(), " => ", y_hat.item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(w, "model.bin")
|
23
wyk/pytorch-regression/linear1-infer.py
Executable file
23
wyk/pytorch-regression/linear1-infer.py
Executable file
@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
|
||||
from analyzer import vectorizer
|
||||
import torch
|
||||
|
||||
w = torch.load('model.bin')
|
||||
|
||||
|
||||
def fun(w, x):
|
||||
return x @ w
|
||||
|
||||
|
||||
for line in sys.stdin:
|
||||
line = line.strip('\n')
|
||||
content = line
|
||||
|
||||
x = (torch.from_numpy(vectorizer.fit_transform([content]).toarray()))[0]
|
||||
|
||||
y_hat = fun(w, x)
|
||||
|
||||
print(max(1814.0, min(2013.999, y_hat.item() * 100.0 + 1913.0)))
|
70
wyk/pytorch-regression/linear1.py
Executable file
70
wyk/pytorch-regression/linear1.py
Executable file
@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# To samo co linear0.py tylko z automatycznym różniczkowaniem
|
||||
|
||||
import sys
|
||||
import torch
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_text
|
||||
|
||||
# Nasz model to zestaw wag w. Na koniec dojdziemy do modeli
|
||||
# Transformer o wielu milionach wag; w pewnym sensie algorytm
|
||||
# uczenia się nie zmieni.
|
||||
# W naszym zadaniu lepiej zacząć od zerowych wag zamiast losowych.
|
||||
# Tym razem zaznaczamy, że względem w będziemy różniczkować
|
||||
w = torch.zeros(vector_length, dtype=torch.double, requires_grad=True)
|
||||
|
||||
# Hiperparametr uczenia
|
||||
learning_rate = torch.tensor(.0032, dtype=torch.double)
|
||||
|
||||
|
||||
def model(w, x):
|
||||
# @ to iloczyn wektorów/macierzy w PyTorchu
|
||||
return x @ w
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return (y_hat - y_exp)**2
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 5000
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
for line in sys.stdin:
|
||||
content, y_exp = process_line(line)
|
||||
|
||||
x = vectorize_text(content)
|
||||
|
||||
# wartość z predykcji
|
||||
y_hat = model(w, x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
w = w - learning_rate * w.grad
|
||||
closs += loss
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp.item(), " => ", y_hat.item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
# ponownie ustawiamy (i zerujemy) wagi
|
||||
w.requires_grad_(True)
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(w, "model.bin")
|
70
wyk/pytorch-regression/linear1b.py
Executable file
70
wyk/pytorch-regression/linear1b.py
Executable file
@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# To samo co linear0.py tylko z automatycznym różniczkowaniem
|
||||
|
||||
import sys
|
||||
import torch
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_text
|
||||
|
||||
# Nasz model to zestaw wag w. Na koniec dojdziemy do modeli
|
||||
# Transformer o wielu milionach wag; w pewnym sensie algorytm
|
||||
# uczenia się nie zmieni.
|
||||
# W naszym zadaniu lepiej zacząć od zerowych wag zamiast losowych.
|
||||
# Tym razem zaznaczamy, że względem w będziemy różniczkować
|
||||
w = torch.zeros(vector_length, dtype=torch.double, requires_grad=True)
|
||||
|
||||
# Hiperparametr uczenia
|
||||
learning_rate = torch.tensor(.0032, dtype=torch.double)
|
||||
|
||||
|
||||
def model(w, x):
|
||||
# @ to iloczyn wektorów/macierzy w PyTorchu
|
||||
return torch.tanh(x @ w)
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return (y_hat - y_exp)**2
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 5000
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
for line in sys.stdin:
|
||||
content, y_exp = process_line(line)
|
||||
|
||||
x = vectorize_text(content)
|
||||
|
||||
# wartość z predykcji
|
||||
y_hat = model(w, x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
w = w - learning_rate * w.grad
|
||||
closs += loss
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp.item(), " => ", y_hat.item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
# ponownie ustawiamy (i zerujemy) wagi
|
||||
w.requires_grad_(True)
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(w, "model.bin")
|
72
wyk/pytorch-regression/linear2.py
Executable file
72
wyk/pytorch-regression/linear2.py
Executable file
@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# To samo co linear0.py tylko z automatycznym różniczkowaniem
|
||||
|
||||
import sys
|
||||
import torch
|
||||
from torch import optim
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_text
|
||||
|
||||
# Nasz model to zestaw wag w. Na koniec dojdziemy do modeli
|
||||
# Transformer o wielu milionach wag; w pewnym sensie algorytm
|
||||
# uczenia się nie zmieni.
|
||||
# W naszym zadaniu lepiej zacząć od zerowych wag zamiast losowych.
|
||||
# Tym razem zaznaczamy, że względem w będziemy różniczkować
|
||||
w = torch.zeros(vector_length, dtype=torch.double, requires_grad=True)
|
||||
|
||||
# Tym razem użyjemy optymalizatora
|
||||
optimizer = optim.SGD([w], lr=.0064)
|
||||
|
||||
|
||||
def model(w, x):
|
||||
# @ to iloczyn wektorów/macierzy w PyTorchu
|
||||
return x @ w
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return (y_hat - y_exp)**2
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 5000
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
for line in sys.stdin:
|
||||
optimizer.zero_grad()
|
||||
|
||||
content, y_exp = process_line(line)
|
||||
|
||||
x = vectorize_text(content)
|
||||
|
||||
# wartość z predykcji
|
||||
y_hat = model(w, x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
closs += loss
|
||||
|
||||
# Optymalizator automagicznie zadba o aktualizację wag!
|
||||
optimizer.step()
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp.item(), " => ", y_hat.item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(w, "model.bin")
|
20
wyk/pytorch-regression/linear3-infer.py
Executable file
20
wyk/pytorch-regression/linear3-infer.py
Executable file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
|
||||
from analyzer import midpoint, vectorize_text
|
||||
import torch
|
||||
|
||||
model = torch.load('model.bin')
|
||||
|
||||
|
||||
for line in sys.stdin:
|
||||
line = line.strip('\n')
|
||||
content = line
|
||||
|
||||
x = vectorize_text(content)
|
||||
|
||||
y_hat = model(x)
|
||||
|
||||
# na wyjściu musimy mieć z powrotem rok
|
||||
print(max(1814.0, min(2013.999, y_hat.item() * 100.0 + midpoint)))
|
64
wyk/pytorch-regression/linear3.py
Executable file
64
wyk/pytorch-regression/linear3.py
Executable file
@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# To samo co linear0.py tylko z automatycznym różniczkowaniem
|
||||
|
||||
import sys
|
||||
import torch
|
||||
from torch import optim
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_text
|
||||
|
||||
from my_linear_regressor import MyLinearRegressor
|
||||
|
||||
regressor = MyLinearRegressor(vector_length)
|
||||
|
||||
# Tym razem użyjemy optymalizatora
|
||||
optimizer = optim.SGD(regressor.parameters(), lr=.0064)
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return (y_hat - y_exp)**2
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 5000
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
for line in sys.stdin:
|
||||
optimizer.zero_grad()
|
||||
|
||||
content, y_exp = process_line(line)
|
||||
|
||||
x = vectorize_text(content)
|
||||
|
||||
# wartość z predykcji
|
||||
y_hat = regressor(x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
closs += loss
|
||||
|
||||
# Optymalizator automagicznie zadba o aktualizację wag!
|
||||
optimizer.step()
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp.item(), " => ", y_hat.item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(regressor, "model.bin")
|
81
wyk/pytorch-regression/linear4-batches.py
Executable file
81
wyk/pytorch-regression/linear4-batches.py
Executable file
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Wprowadzamy minibatche
|
||||
|
||||
import sys
|
||||
import torch
|
||||
from torch import optim
|
||||
import itertools
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_batch
|
||||
|
||||
from my_linear_regressor import MyLinearRegressor
|
||||
|
||||
regressor = MyLinearRegressor(vector_length)
|
||||
|
||||
# Rozmiar minibatcha
|
||||
batch_size = 16
|
||||
|
||||
# Pomocnicza funkcja do batchowania
|
||||
def grouper(n, iterable):
|
||||
it = iter(iterable)
|
||||
while True:
|
||||
chunk = tuple(itertools.islice(it, n))
|
||||
if not chunk:
|
||||
return
|
||||
yield chunk
|
||||
|
||||
|
||||
# Tym razem użyjemy optymalizatora
|
||||
optimizer = optim.Adam(regressor.parameters())
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return torch.sum((y_hat - y_exp)**2) / batch_size
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 500
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
for batch in grouper(batch_size, sys.stdin):
|
||||
t = [process_line(line) for line in batch]
|
||||
contents = [entry[0] for entry in t]
|
||||
# y_exp będzie teraz wektorem!
|
||||
y_exp = torch.tensor([entry[1] for entry in t], dtype=torch.double)
|
||||
|
||||
optimizer.zero_grad()
|
||||
|
||||
x = vectorize_batch(contents)
|
||||
|
||||
# wartość z predykcji (też wektor!)
|
||||
y_hat = regressor(x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
closs += loss
|
||||
|
||||
# Optymalizator automagicznie zadba o aktualizację wag!
|
||||
optimizer.step()
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp[0].item(), " => ", y_hat[0].item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(regressor, "model.bin")
|
64
wyk/pytorch-regression/linear4.py
Executable file
64
wyk/pytorch-regression/linear4.py
Executable file
@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# To samo co linear0.py tylko z automatycznym różniczkowaniem
|
||||
|
||||
import sys
|
||||
import torch
|
||||
from torch import optim
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_text
|
||||
|
||||
from my_linear_regressor import MyLinearRegressor
|
||||
|
||||
regressor = MyLinearRegressor(vector_length)
|
||||
|
||||
# Tym razem użyjemy optymalizatora
|
||||
optimizer = optim.Adam(regressor.parameters())
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return (y_hat - y_exp)**2
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 5000
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
for line in sys.stdin:
|
||||
optimizer.zero_grad()
|
||||
|
||||
content, y_exp = process_line(line)
|
||||
|
||||
x = vectorize_text(content)
|
||||
|
||||
# wartość z predykcji
|
||||
y_hat = regressor(x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
closs += loss
|
||||
|
||||
# Optymalizator automagicznie zadba o aktualizację wag!
|
||||
optimizer.step()
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp.item(), " => ", y_hat.item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.double, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(regressor, "model.bin")
|
81
wyk/pytorch-regression/linear5.py
Executable file
81
wyk/pytorch-regression/linear5.py
Executable file
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Wprowadzamy minibatche
|
||||
|
||||
import sys
|
||||
import torch
|
||||
from torch import optim
|
||||
import itertools
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_batch
|
||||
|
||||
from my_linear_regressor2 import MyLinearRegressor2
|
||||
|
||||
# Rozmiar minibatcha
|
||||
batch_size = 16
|
||||
|
||||
regressor = MyLinearRegressor2(vector_length)
|
||||
|
||||
# Pomocnicza funkcja do batchowania
|
||||
def grouper(n, iterable):
|
||||
it = iter(iterable)
|
||||
while True:
|
||||
chunk = tuple(itertools.islice(it, n))
|
||||
if not chunk:
|
||||
return
|
||||
yield chunk
|
||||
|
||||
|
||||
# Tym razem użyjemy optymalizatora
|
||||
optimizer = optim.Adam(regressor.parameters())
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return torch.sum((y_hat - y_exp)**2) / batch_size
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 500
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.float, requires_grad=False)
|
||||
|
||||
for batch in grouper(batch_size, sys.stdin):
|
||||
t = [process_line(line) for line in batch]
|
||||
contents = [entry[0] for entry in t]
|
||||
# y_exp będzie teraz wektorem!
|
||||
y_exp = torch.tensor([entry[1] for entry in t], dtype=torch.float)
|
||||
|
||||
optimizer.zero_grad()
|
||||
|
||||
x = vectorize_batch(contents).float()
|
||||
|
||||
# wartość z predykcji (też wektor!)
|
||||
y_hat = regressor(x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
closs += loss
|
||||
|
||||
# Optymalizator automagicznie zadba o aktualizację wag!
|
||||
optimizer.step()
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp[0].item(), " => ", y_hat[0].item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.float, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(regressor, "model.bin")
|
81
wyk/pytorch-regression/linear6.py
Executable file
81
wyk/pytorch-regression/linear6.py
Executable file
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Wprowadzamy minibatche
|
||||
|
||||
import sys
|
||||
import torch
|
||||
from torch import optim
|
||||
import itertools
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer import vectorizer, vector_length, process_line, vectorize_batch
|
||||
|
||||
from my_neural_network import MyNeuralNetwork
|
||||
|
||||
# Rozmiar minibatcha
|
||||
batch_size = 16
|
||||
|
||||
regressor = MyNeuralNetwork(vector_length)
|
||||
|
||||
# Pomocnicza funkcja do batchowania
|
||||
def grouper(n, iterable):
|
||||
it = iter(iterable)
|
||||
while True:
|
||||
chunk = tuple(itertools.islice(it, n))
|
||||
if not chunk:
|
||||
return
|
||||
yield chunk
|
||||
|
||||
|
||||
# Tym razem użyjemy optymalizatora
|
||||
optimizer = optim.Adam(regressor.parameters())
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return torch.sum((y_hat - y_exp)**2) / batch_size
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 500
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.float, requires_grad=False)
|
||||
|
||||
for batch in grouper(batch_size, sys.stdin):
|
||||
t = [process_line(line) for line in batch]
|
||||
contents = [entry[0] for entry in t]
|
||||
# y_exp będzie teraz wektorem!
|
||||
y_exp = torch.tensor([entry[1] for entry in t], dtype=torch.float)
|
||||
|
||||
optimizer.zero_grad()
|
||||
|
||||
x = vectorize_batch(contents).float()
|
||||
|
||||
# wartość z predykcji (też wektor!)
|
||||
y_hat = regressor(x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
closs += loss
|
||||
|
||||
# Optymalizator automagicznie zadba o aktualizację wag!
|
||||
optimizer.step()
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp[0].item(), " => ", y_hat[0].item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.float, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(regressor, "model.bin")
|
81
wyk/pytorch-regression/logistic6.py
Executable file
81
wyk/pytorch-regression/logistic6.py
Executable file
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Wprowadzamy minibatche
|
||||
|
||||
import sys
|
||||
import torch
|
||||
from torch import optim
|
||||
import itertools
|
||||
|
||||
# Preprocessing i wektoryzację tekstów wydzialamy do osobnego modułu,
|
||||
# z którego będzie korzystał zarówno kod do uczenia, jak i predykcji.
|
||||
from analyzer_classification import vectorizer, vector_length, process_line, vectorize_batch
|
||||
|
||||
from my_neural_network import MyNeuralNetwork
|
||||
|
||||
# Rozmiar minibatcha
|
||||
batch_size = 16
|
||||
|
||||
regressor = MyNeuralNetwork(vector_length)
|
||||
|
||||
# Pomocnicza funkcja do batchowania
|
||||
def grouper(n, iterable):
|
||||
it = iter(iterable)
|
||||
while True:
|
||||
chunk = tuple(itertools.islice(it, n))
|
||||
if not chunk:
|
||||
return
|
||||
yield chunk
|
||||
|
||||
|
||||
# Tym razem użyjemy optymalizatora
|
||||
optimizer = optim.Adam(regressor.parameters())
|
||||
|
||||
|
||||
# Funkcja kosztu.
|
||||
def loss_fun(y_hat, y_exp):
|
||||
return torch.sum((y_hat - y_exp)**2) / batch_size
|
||||
|
||||
|
||||
# Co ile kroków będziemy wypisywali informacje o średniej funkcji kosztu.
|
||||
# To nie jest hiperparametr uczenia, nie ma to żadnego, ani pozytywnego, ani
|
||||
# negatywnego wpływu na uczenie.
|
||||
step = 500
|
||||
i = 1
|
||||
closs = torch.tensor(0.0, dtype=torch.float, requires_grad=False)
|
||||
|
||||
for batch in grouper(batch_size, sys.stdin):
|
||||
t = [process_line(line) for line in batch]
|
||||
contents = [entry[0] for entry in t]
|
||||
# y_exp będzie teraz wektorem!
|
||||
y_exp = torch.tensor([entry[1] for entry in t], dtype=torch.float)
|
||||
|
||||
optimizer.zero_grad()
|
||||
|
||||
x = vectorize_batch(contents).float()
|
||||
|
||||
# wartość z predykcji (też wektor!)
|
||||
y_hat = regressor(x)
|
||||
|
||||
# wyliczamy funkcję kosztu
|
||||
loss = loss_fun(y_hat, y_exp)
|
||||
|
||||
loss.backward()
|
||||
|
||||
with torch.no_grad():
|
||||
closs += loss
|
||||
|
||||
# Optymalizator automagicznie zadba o aktualizację wag!
|
||||
optimizer.step()
|
||||
|
||||
# za jakiś czas pokazujemy uśrednioną funkcję kosztu
|
||||
if i % step == 0:
|
||||
print("Sample item: ", y_exp[0].item(), " => ", y_hat[0].item(),
|
||||
" | Avg loss: ", (closs / step).item())
|
||||
closs = torch.tensor(0.0, dtype=torch.float, requires_grad=False)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# serializujemy nasz model
|
||||
torch.save(regressor, "model.bin")
|
12
wyk/pytorch-regression/my_linear_regressor.py
Normal file
12
wyk/pytorch-regression/my_linear_regressor.py
Normal file
@ -0,0 +1,12 @@
|
||||
import torch.nn as nn
|
||||
import torch
|
||||
|
||||
|
||||
class MyLinearRegressor(nn.Module):
|
||||
def __init__(self, vlen):
|
||||
super(MyLinearRegressor, self).__init__()
|
||||
self.register_parameter(name='w', param=torch.nn.Parameter(
|
||||
torch.zeros(vlen, dtype=torch.double, requires_grad=True)))
|
||||
|
||||
def forward(self, x):
|
||||
return x @ self.w
|
10
wyk/pytorch-regression/my_linear_regressor2.py
Normal file
10
wyk/pytorch-regression/my_linear_regressor2.py
Normal file
@ -0,0 +1,10 @@
|
||||
import torch.nn as nn
|
||||
|
||||
|
||||
class MyLinearRegressor2(nn.Module):
|
||||
def __init__(self, vlen):
|
||||
super(MyLinearRegressor2, self).__init__()
|
||||
self.w = nn.Linear(vlen, 1, bias=False)
|
||||
|
||||
def forward(self, x):
|
||||
return self.w(x).squeeze()
|
15
wyk/pytorch-regression/my_neural_network.py
Normal file
15
wyk/pytorch-regression/my_neural_network.py
Normal file
@ -0,0 +1,15 @@
|
||||
import torch.nn as nn
|
||||
import torch
|
||||
|
||||
|
||||
class MyNeuralNetwork(nn.Module):
|
||||
def __init__(self, vlen):
|
||||
super(MyNeuralNetwork, self).__init__()
|
||||
self.w1 = nn.Linear(vlen, 1)
|
||||
self.w2 = nn.Linear(vlen, 1)
|
||||
|
||||
self.u1 = torch.nn.Parameter(torch.rand(1, dtype=torch.float, requires_grad=True))
|
||||
self.u2 = torch.nn.Parameter(torch.rand(1, dtype=torch.float, requires_grad=True))
|
||||
|
||||
def forward(self, x):
|
||||
return self.u1 * torch.nn.functional.tanh(self.w1(x).squeeze()) + self.u2 * torch.nn.functional.tanh(self.w2(x).squeeze())
|
Loading…
Reference in New Issue
Block a user