# What is new in pytorch

## PyTorch 0.4 version

Certainly the biggest update of Pytorch 0.4 version was when:

`torch.Tensor`

become `torch.autograd.Variable`

This is a class capable of tracking history and behaves like the old Variable class. This means we don’t need Variable wrapping anymore in our code.

Note in this code how we used in place function `requires_grad_()`

to set the tensor gradient tracker

```
import torch
tensor = torch.zeros(3, 4, requires_grad=False)
print(tensor.requires_grad)
#False
tensor.requires_grad_()
print(tensor.requires_grad)
#True
```

Note: `requires_grad`

Tensor attribute is the central flag for autograd.
(Autograd is automatic backpropagation system in PyTorch)

What about the .data?
The `.data`

attribute of the tensor would return the Tensor but with no autograd tracking capabilities as demonstrated in the next example.

```
data = tensor.data #new tensor but no autograd
print(data.requires_grad)
#False
```

From the perspective of backpropagation the `data`

tensor is “dead”. Anything that will happen on a `tensor`

from the previous example will not reflect on a `data`

tensor.

## PyTorch 1.0.0 version

Imagine this simple program written in Python

```
import torch
model = torch.nn.Linear(5, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
prediction = model.forward(torch.randn(3, 5))
loss = torch.nn.functional.mse_loss(prediction, torch.ones(3, 1))
loss.backward()
optimizer.step()
```

Now, it is possible to write the same in C++

```
#include <torch/torch.h>
torch::nn::Linear model(5, 1);
torch::optim::SGD optimizer(model->parameters(), /*lr=*/0.1);
torch::Tensor prediction = model->forward(torch::randn({3, 5}));
auto loss = torch::mse_loss(prediction, torch::ones({3, 1}));
loss.backward();
optimizer.step();
```

Check doc for more details.

–

Next, TorchHub is already trained repo of models.
TorchHub supports publishing trained models and weights) to a GitHub.
To do that we use `hubconf.py`

file.

Users can later load the trained models using the `torch.hub.load API`

.

–

You can create empty tensor (no elements inside) with custom shape and dtype:

```
tensor([], size=(0, 2, 4, 0), dtype=torch.float64)
```

Before, tensors with no elements were limted with shape (0,)

– Note: For more details on PyTorch version 1.0.0 check this.