65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
|
#!/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")
|