Hello, I’m a real beginner in PyTorch, specially LSTM model, so thank you for indulgence.
I’m trying to understand how it works based on the handmade model. It actually involves predicting the share price of two companies A and B whose past prices are as follows.
inputs = torch.tensor([[0.0, 0.25, 0.50, 1.0], [1.0, 0.25, 0.50, 1.0]])
Here is code for LSTM model.
std = torch.tensor(1.0)
predic_a = []
predic_b = []```
```class lstmbyhand():
def __init__(self):
#super().__init__()
# Creation de deux tenseurs initialisé à 0 et à 1
mean = torch.tensor(0.0)
std = torch.tensor(1.0)
# Init of weights and biases
self.layer_1_w1 = nn.Parameter(torch.normal(mean, std), requires_grad=True)
self.layer_1_w2 = nn.Parameter(torch.normal(mean, std), requires_grad=True)
self.layer_1_b1 = nn.Parameter(torch.tensor(0.0), requires_grad=True)
self.layer_2_w1 = nn.Parameter(torch.normal(mean, std), requires_grad=True)
self.layer_2_w2 = nn.Parameter(torch.normal(mean, std), requires_grad=True)
self.layer_2_b1 = nn.Parameter(torch.tensor(0.0), requires_grad=True)
self.layer_3_w1 = nn.Parameter(torch.normal(mean, std), requires_grad=True)
self.layer_3_w2 = nn.Parameter(torch.normal(mean, std), requires_grad=True)
self.layer_3_b1 = nn.Parameter(torch.tensor(0.0), requires_grad=True)
self.layer_4_w1 = nn.Parameter(torch.normal(mean, std), requires_grad=True)
self.layer_4_w2 = nn.Parameter(torch.normal(mean, std), requires_grad=True)
self.layer_4_b1 = nn.Parameter(torch.tensor(0.0), requires_grad=True)
# Define components of lstm_unit block
def lstm_unit(self, short_term_memory, long_term_memory, input):
layer_1_output = torch.sigmoid((short_term_memory * self.layer_1_w1) +
(input * self.layer_1_w2) +
self.layer_1_b1)
layer_2_output = torch.sigmoid((short_term_memory * self.layer_2_w1) +
(input * self.layer_2_w2) +
self.layer_2_b1)
layer_3_output = torch.tanh((short_term_memory * self.layer_3_w1) +
(input * self.layer_3_w2) +
self.layer_3_b1)
layer_4_output = torch.sigmoid((short_term_memory * self.layer_4_w1) +
(input * self.layer_4_w2) +
self.layer_4_b1)
# Calculation of long term memory and short term memory
percent_LT_toremember = long_term_memory * layer_1_output
updated_LT = layer_2_output * layer_3_output + percent_LT_toremember
potential_ST_toremember = layer_4_output
LT_to_add = torch.tanh(potentiel_LT_to_add)
updated_ST = potential_ST_toremember * LT_to_add
return [updated_LT, updated_ST]
def forward_pass(self, input):
long_term_memory = 0
short_term_memory = 0
day1 = input[0]
day2 = input[1]
day3 = input[2]
day4 = input[3]
updated_LT, updated_ST = self.lstm_unit(long_term_memory, short_term_memory, day1)
updated_LT, updated_ST = self.lstm_unit(long_term_memory, short_term_memory, day2)
updated_LT, updated_ST = self.lstm_unit(long_term_memory, short_term_memory, day3)
updated_LT, updated_ST = self.lstm_unit(long_term_memory, short_term_memory, day4)
return updated_ST
def optimizer(self):
return optim.Adam(self.parameters())
def loss_fn(self):
return torch.nn.MSELoss()
def training(self, dataloader):
for i, (data, label) in enumerate(dataloader):
output = self.forward_pass(data)
print('output: {}'.format(output))
loss = loss_fn (output, label)
print('loss: {}'.format(loss))
if label == 0:
predic_a.append(output)
else:
predict_b.append(output)
return loss, predic_a, predic_b
Then create instance.
model = lstmbyhand()
And training the model.
labels = torch.tensor([0.0, 1.0])
dataset = TensorDataset(inputs, labels)
dataloader = DataLoader(dataset)
n_epochs = 200
for epoch in range(n_epochs):
model(data)
Error message.
Cell In[220], line 8
6 n_epochs = 200
7 for epoch in range(n_epochs):
----> 8 model(data)
TypeError: 'lstmbyhand' object is not callable```
I would like to understand what I'm missing here, Thank you for your lights !