nn.Linear layer output nan on well formed input

On well formatted inputs (without nan) linear transformation is returning NaN:

vec_tensor = torch.from_numpy(vec)

# check if input is nan
if np.isnan(np.sum(vec_tensor.cpu().numpy())):
    print("some values from input are nan")    

x = vec_tensor[:,0:ZONE_SIZE*2]
x = x.view(-1, ZONE_SIZE * 2)

x_mean = torch.mean(x, dim=1).view(-1,1)
x_std = torch.std(x, dim=1).view(-1,1)
x = (x -x_mean) / x_std

o = net.linear1(x)
print (o)

And the result is:

tensor([[nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        ...,
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.]])

Repo with the faulty network params and vector is here: https://github.com/ssainz/pytorch_bug

Versions are:

backports-abc (0.5)
backports.functools-lru-cache (1.5)
backports.shutil-get-terminal-size (1.0.0)
bleach (2.1.3)
certifi (2018.4.16)
chardet (3.0.4)
configparser (3.5.0)
cycler (0.10.0)
decorator (4.3.0)
entrypoints (0.2.3)
enum34 (1.1.6)
functools32 (3.2.3.post2)
future (0.16.0)
futures (3.2.0)
gym (0.10.5)
html5lib (1.0.1)
idna (2.6)
ipykernel (4.8.2)
ipython (5.7.0)
ipython-genutils (0.2.0)
ipywidgets (7.2.1)
Jinja2 (2.10)
jsonschema (2.6.0)
jupyter (1.0.0)
jupyter-client (5.2.3)
jupyter-console (5.2.0)
jupyter-core (4.4.0)
kiwisolver (1.0.1)
MarkupSafe (1.0)
matplotlib (2.2.2)
mistune (0.8.3)
nbconvert (5.3.1)
nbformat (4.4.0)
networkx (1.11)
notebook (5.5.0)
numpy (1.14.4)
pandocfilters (1.4.2)
pathlib2 (2.3.2)
pexpect (4.6.0)
pickleshare (0.7.4)
Pillow (5.1.0)
pip (9.0.1)
prompt-toolkit (1.0.15)
ptyprocess (0.5.2)
pyglet (1.3.2)
Pygments (2.2.0)
pyparsing (2.2.0)
python-dateutil (2.7.3)
pytz (2018.4)
pyzmq (17.0.0)
qtconsole (4.3.1)
requests (2.18.4)
scandir (1.7)
scipy (1.1.0)
Send2Trash (1.5.0)
setuptools (28.8.0)
simplegeneric (0.8.1)
singledispatch (3.4.0.3)
six (1.11.0)
subprocess32 (3.5.2)
terminado (0.8.1)
testpath (0.3.1)
torch (0.4.0)
torchvision (0.2.1)
tornado (5.0.2)
traitlets (4.3.2)
urllib3 (1.22)
wcwidth (0.1.7)
webencodings (0.5.1)
wheel (0.29.0)
widgetsnbextension (3.2.1)

Been able to reproduce this in 3 different machines with cpu and gpu~

2 Likes

Hi,

Are you sure x_std is not 0 in your case? Could you print x juste before giving it to the linear layer?

Hi,

Good idea, I did not think that. After printing out I see no zeros ~

Here is the output of x_std:

tensor([[  92.6681],
        [ 404.6292],
        [ 404.8976],
        [ 250.7227],
        [ 250.4256],
        [ 404.3423],
        [ 405.0550],
        [ 251.0206],
        [  92.5387],
        [  93.0143],
        [ 250.8486],
        [ 250.7405],
        [ 251.2732],
        [ 251.1312],
        [ 405.1576],
        [ 251.5628],
        [ 405.3494],
        [ 251.1480],
        [ 251.1116],
        [ 250.7486],
        [  92.4530],
        [ 404.8680],
        [ 405.2231],
        [ 404.7466],
        [ 251.1800],
        [ 251.3008],
        [ 404.9897],
        [  92.7674],
        [ 251.1480],
        [ 250.7218],
        [ 250.3925],
        [ 251.2240],
        [ 250.2169],
        [ 404.4504],
        [ 250.0995],
        [ 251.2035],
        [  92.9458],
        [ 249.7354],
        [ 404.9981],
        [ 404.6703],
        [ 251.3260],
        [ 405.0110],
        [ 250.1668],
        [ 404.6394],
        [ 250.3278],
        [ 251.0508],
        [ 251.0729],
        [ 250.6330],
        [ 405.1168],
        [ 250.6799],
        [  92.4707],
        [ 251.1223],
        [ 250.9282],
        [  92.1929],
        [ 251.3193],
        [  92.0439],
        [ 251.4816],
        [ 250.2316],
        [ 251.3165],
        [ 405.0492],
        [ 250.7802],
        [ 250.8962],
        [ 404.7462],
        [ 404.8201],
        [ 251.0861],
        [ 251.0475],
        [ 250.3490],
        [ 404.3512],
        [ 251.4652],
        [ 250.8202],
        [ 404.1475],
        [ 250.6063],
        [ 405.0731],
        [ 250.9353],
        [ 250.2173],
        [ 250.8657],
        [ 251.2978],
        [ 249.7068],
        [ 250.8334],
        [ 250.7502],
        [ 249.7354],
        [ 250.4344],
        [ 251.0381],
        [ 250.4152],
        [ 250.4865],
        [ 404.9912],
        [ 250.6725],
        [ 250.4263],
        [ 251.4652],
        [  92.8861],
        [ 250.4647],
        [ 250.7429],
        [ 250.6835],
        [ 250.9700],
        [ 404.8431],
        [ 250.6500],
        [ 250.9970],
        [ 250.8521],
        [ 405.1579],
        [ 404.6438],
        [ 250.6725],
        [ 250.1192],
        [ 250.4342],
        [ 404.7541],
        [ 404.9801],
        [ 404.9246],
        [ 251.1625],
        [  93.1926],
        [ 404.9897],
        [ 404.6542],
        [ 405.0998],
        [ 250.4555],
        [ 250.5661],
        [ 250.4902],
        [ 251.4263],
        [ 250.8609],
        [ 251.2598],
        [ 404.7595],
        [ 405.3346],
        [ 249.7911],
        [ 250.8093],
        [ 250.1427],
        [  92.8163],
        [ 250.6440],
        [ 250.3875],
        [ 250.8757],
        [ 251.1032],
        [ 404.8384]])
tensor([[nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        ...,
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.]])

Could you print(x) and print(net.linear1.weight) and print(net.linear1.bias) ?

1 Like

Actually, below code still gets NaN, even when there is no division by anything:

vec_tensor = torch.from_numpy(vec)

# check if input is nan
if np.isnan(np.sum(vec_tensor.cpu().numpy())):
    print("some values from input are nan")    

x = vec_tensor[:,0:ZONE_SIZE*2]
x = x.view(-1, ZONE_SIZE * 2)

#x_mean = torch.mean(x, dim=1).view(-1,1)
#x_std = torch.std(x, dim=1).view(-1,1)
#print x_std

#x = (x -x_mean) / x_std

o = net.linear1(x)
print (o)

Ah, I see, the weights, bias are all NaN. Nevermind then :smiley: . Thanks for checking this. I will go back and check why the network got into this state:

tensor([[  247.8170,   197.7785,    71.3301,  ...,     6.6686,
             3.2949,     5.3569],
        [ 1083.3394,   876.2274,   329.9731,  ...,     4.0454,
             4.5783,     2.2610],
        [ 1083.3394,   877.2274,   331.9731,  ...,     4.0422,
             1.6040,     3.9885],
        ...,
        [  673.0513,   545.6301,   208.7934,  ...,     4.0422,
             1.6040,     3.9885],
        [  673.0513,   545.6301,   210.7934,  ...,     2.9903,
             3.0112,     2.0683],
        [ 1083.3394,   879.2274,   331.9731,  ...,     5.1492,
             3.8545,     3.5510]])
Parameter containing:
tensor([[nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        ...,
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.],
        [nan., nan., nan.,  ..., nan., nan., nan.]])
Parameter containing:
tensor([nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.,
        nan., nan., nan., nan., nan., nan., nan., nan., nan., nan.])
1 Like

What did you end up changing? Why does the layer init with nan values??

1 Like

Ok, my problem was that my input was not so well-formed. I had an extremely large float, e.g. -7.4e+168. This caused the linear layer to overflow and return nans.

4 Likes