Commit
·
eaedbc1
1
Parent(s):
fadaa8f
feature: add new net model with one hidden layer
Browse filesA new sequential neural network model is added
with a single hidden layer. Linear activations are used.
- agent/backend/models.py +16 -1
- agent/backend/utils.py +5 -1
- agent/dashboard/training.py +3 -2
agent/backend/models.py
CHANGED
|
@@ -11,7 +11,22 @@ class Perceptron(nn.Module):
|
|
| 11 |
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
| 12 |
out = self.layer(x)
|
| 13 |
return out
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
class PolicyGradientNetwork(nn.Module):
|
| 17 |
def __init__(self, num_inputs, num_actions, hidden_size):
|
|
|
|
| 11 |
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
| 12 |
out = self.layer(x)
|
| 13 |
return out
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
class NetSingleHiddenLayer(nn.Module):
|
| 17 |
+
def __init__(self, in_features: int, out_features: int, hidden_size):
|
| 18 |
+
super().__init__()
|
| 19 |
+
self.in_features = in_features
|
| 20 |
+
self.out_features = out_features
|
| 21 |
+
self.hidden_size = hidden_size
|
| 22 |
+
self.layer1 = nn.Sequential(nn.Linear(in_features=self.in_features,out_features=self.hidden_size))
|
| 23 |
+
self.layer2 = nn.Sequential(nn.Linear(in_features=self.hidden_size,out_features=self.out_features))
|
| 24 |
+
|
| 25 |
+
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
| 26 |
+
out = self.layer1(x)
|
| 27 |
+
out = self.layer2(out)
|
| 28 |
+
return out
|
| 29 |
+
|
| 30 |
|
| 31 |
class PolicyGradientNetwork(nn.Module):
|
| 32 |
def __init__(self, num_inputs, num_actions, hidden_size):
|
agent/backend/utils.py
CHANGED
|
@@ -8,7 +8,7 @@ import itertools
|
|
| 8 |
import solara
|
| 9 |
|
| 10 |
from .data import ExplorationDataset
|
| 11 |
-
from .models import Perceptron
|
| 12 |
from .loss import loss_mape
|
| 13 |
|
| 14 |
def predict_dict(model, ds, inputs: Dict[str, Union[List[int], List[float]]]):
|
|
@@ -67,6 +67,10 @@ def train(ds: ExplorationDataset, model_name, trn_ratio,
|
|
| 67 |
df = ds.df
|
| 68 |
if model_name == "Perceptron":
|
| 69 |
model = Perceptron(in_features=len(input_cols), out_features=len(output_cols))
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
if loss_name == "mape":
|
| 71 |
loss_fn = loss_mape
|
| 72 |
|
|
|
|
| 8 |
import solara
|
| 9 |
|
| 10 |
from .data import ExplorationDataset
|
| 11 |
+
from .models import Perceptron, NetSingleHiddenLayer
|
| 12 |
from .loss import loss_mape
|
| 13 |
|
| 14 |
def predict_dict(model, ds, inputs: Dict[str, Union[List[int], List[float]]]):
|
|
|
|
| 67 |
df = ds.df
|
| 68 |
if model_name == "Perceptron":
|
| 69 |
model = Perceptron(in_features=len(input_cols), out_features=len(output_cols))
|
| 70 |
+
elif model_name == "NetSingleHiddenLayer":
|
| 71 |
+
# TODO: make hidden_size adjustable in ui
|
| 72 |
+
model = NetSingleHiddenLayer(in_features=len(input_cols), out_features=len(output_cols), hidden_size=10)
|
| 73 |
+
|
| 74 |
if loss_name == "mape":
|
| 75 |
loss_fn = loss_mape
|
| 76 |
|
agent/dashboard/training.py
CHANGED
|
@@ -83,13 +83,14 @@ def ExecutePanel(df):
|
|
| 83 |
max_epoch = local_state.value['max_epoch'].value
|
| 84 |
loss_name = local_state.value['loss_name'].value
|
| 85 |
seed = local_state.value['seed'].value
|
|
|
|
| 86 |
|
| 87 |
epoch_list = []
|
| 88 |
trn_loss_list = []
|
| 89 |
val_loss_list = []
|
| 90 |
ds = ExplorationDataset(dff, input_cols, output_cols)
|
| 91 |
local_state.value['ds'].set(ds)
|
| 92 |
-
for epoch, trn_loss, val_loss, model in train(ds,
|
| 93 |
batch_size_trn, batch_size_val, optimizer_name, learning_rate,
|
| 94 |
max_epoch, loss_name, seed):
|
| 95 |
epoch_list.append(epoch)
|
|
@@ -125,7 +126,7 @@ def ParameterSelection(df):
|
|
| 125 |
value=local_state.value['optimizer_name'].value,
|
| 126 |
on_value=local_state.value['optimizer_name'].set)
|
| 127 |
|
| 128 |
-
solara.Select(label="Model", values=["Perceptron"],
|
| 129 |
value=local_state.value['model_name'].value,
|
| 130 |
on_value=local_state.value['model_name'].set)
|
| 131 |
|
|
|
|
| 83 |
max_epoch = local_state.value['max_epoch'].value
|
| 84 |
loss_name = local_state.value['loss_name'].value
|
| 85 |
seed = local_state.value['seed'].value
|
| 86 |
+
model_name = local_state.value['model_name'].value
|
| 87 |
|
| 88 |
epoch_list = []
|
| 89 |
trn_loss_list = []
|
| 90 |
val_loss_list = []
|
| 91 |
ds = ExplorationDataset(dff, input_cols, output_cols)
|
| 92 |
local_state.value['ds'].set(ds)
|
| 93 |
+
for epoch, trn_loss, val_loss, model in train(ds, model_name, trn_ratio,
|
| 94 |
batch_size_trn, batch_size_val, optimizer_name, learning_rate,
|
| 95 |
max_epoch, loss_name, seed):
|
| 96 |
epoch_list.append(epoch)
|
|
|
|
| 126 |
value=local_state.value['optimizer_name'].value,
|
| 127 |
on_value=local_state.value['optimizer_name'].set)
|
| 128 |
|
| 129 |
+
solara.Select(label="Model", values=["Perceptron","NetSingleHiddenLayer"],
|
| 130 |
value=local_state.value['model_name'].value,
|
| 131 |
on_value=local_state.value['model_name'].set)
|
| 132 |
|