piEsposito / blitz-bayesian-deep-learning

A simple and extensible library to create Bayesian Neural Network layers on PyTorch.
GNU General Public License v3.0
918 stars 107 forks source link

Bayesian GRU #87

Open Anusha851 opened 3 years ago

Anusha851 commented 3 years ago

I get the following error for Bayesian GRU implementation.


ValueError Traceback (most recent call last)

in 9 labels=labels.to(device), 10 criterion=criterion, ---> 11 sample_nbr=3) 12 loss.backward() 13 optimizer.step() /opt/conda/lib/python3.7/site-packages/blitz/utils/variational_estimator.py in sample_elbo(self, inputs, labels, criterion, sample_nbr, complexity_cost_weight) 63 loss = 0 64 for _ in range(sample_nbr): ---> 65 outputs = self(inputs) 66 loss += criterion(outputs, labels) 67 loss += self.nn_kl_divergence() * complexity_cost_weight /opt/conda/lib/python3.7/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs) 725 result = self._slow_forward(*input, **kwargs) 726 else: --> 727 result = self.forward(*input, **kwargs) 728 for hook in itertools.chain( 729 _global_forward_hooks.values(), in forward(self, encodings, hidden_states, sharpen_loss) 17 18 #pass the inputs to the model ---> 19 x,t = self.bGRU1(encodings,hidden_states = None, sharpen_loss = None) 20 x,t = self.bGRU2(x,t) 21 return x /opt/conda/lib/python3.7/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs) 725 result = self._slow_forward(*input, **kwargs) 726 else: --> 727 result = self.forward(*input, **kwargs) 728 for hook in itertools.chain( 729 _global_forward_hooks.values(), /opt/conda/lib/python3.7/site-packages/blitz/modules/gru_bayesian_layer.py in forward(self, x, hidden_states, sharpen_loss) 221 sharpen_loss = None 222 --> 223 return self.forward_(x, hidden_states, sharpen_loss) 224 /opt/conda/lib/python3.7/site-packages/blitz/modules/gru_bayesian_layer.py in forward_(self, x, hidden_states, sharpen_loss) 135 136 #Assumes x is of shape (batch, sequence, feature) --> 137 bs, seq_sz, _ = x.size() 138 hidden_seq = [] 139 ValueError: not enough values to unpack (expected 3, got 2) For this line of code: for i, (datapoints, labels) in enumerate(train_dataloader): optimizer.zero_grad() loss = gru.sample_elbo(inputs=datapoints.to(device), labels=labels.to(device), criterion=criterion, sample_nbr=3) My datapoints have shape torch.Size([4, 768]). How am I expected to reshape it? Please advise. Thanks.
donhauser commented 3 years ago

You can add a new axis by using None as selector for your tensor/array.

Like this you can "prepend" an extra dimension to 2-D data in numpy and torch:

# datapoints have shape [4, 768]
datapoints = datapoints[None, :, :]
# datapoints now have shape [1, 4, 768]

By swapping None with :, you could also reshape to [4, 1, 768] or [4, 768, 1]. If you need to swap 4 and 768 for whatever reason, have a look at .transpose()

Source: https://sparrow.dev/adding-a-dimension-to-a-tensor-in-pytorch/

Anusha851 commented 3 years ago

Thank you.