#!/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")