在pytorch中,CUDA中的相同计算输出有所不同吗?

时间:2018-07-19 13:03:30

标签: pytorch

我在GPU GTX 1080ti中使用pytorch构建了一个简单的网络,并在开始时启动了网络权重,并随机启动了输入张量。然后我计算了10次网络输出,但每个输出都有一点差异(在此阶段,所有权重和输入都是固定的,我将它们打印出来以进行检查。)。如下所示:

enter image description here

我不知道为什么会发生?是因为GPU的浮点精度吗?感谢您的任何建议:)


摘要

最后,我弄清楚发生了什么,代码如下:

import torch
import torch.nn as nn
import numpy as np
import torch.nn.functional as F
# import torch.utils.data.dataloader as dataloader

class Net(nn.Module):
  def __init__(self):
    super().__init__()
    params = [
      [3,16],
      [16,32],
      [32,32],
    ]
    self.model_list = nn.ModuleList()
    for each in params:
      self.model_list.append(
        nn.Conv2d(in_channels=each[0],
                  out_channels=each[1],
                  kernel_size=(3,3),
                  stride=(1,1))
      )
    self.pool = nn.MaxPool2d(stride=3, kernel_size=(3,3))
    # self.fcn = nn.Linear(in_features=3200, out_features=10).cuda()
  def forward(self, inputv):
    tmp = inputv
    for each in self.model_list:
      tmp = each(tmp)
    for each in range(2):
      tmp = self.pool(tmp)
    tmp = tmp.view(tmp.shape[0], -1)
    fcn = nn.Linear(in_features=tmp.shape[1], out_features=10).cuda()
    # build a new layer here will initiate the weight every time i call forward, which make everything mess.
    tmp = fcn(tmp)
    print(tmp.shape)
    return tmp.mean()

model = Net().cuda()
inputv = np.ones(shape=(32,3,100,100))
inputv = inputv.astype(np.float32)
inputv = torch.tensor(inputv).cuda()

model.eval()
for each in range(10):
  n = model(inputv)
  print(n)

问题是我在fcn中建立了一个新层forward,每次调用它时都会启动权重。一旦在 init 中构建了该层,所有问题就解决了。但是,为什么我要在前面构建一些层是合理的。有时需要一些参数来进行动态计算,而不是手动指定,例如fcn input_dimension。就像我在TensorFlow中所做的一样,它将管理管道,并且在我更改网络结构后无需担心某些参数。如果我想以张量流样式构建网络该怎么办?感谢您的任何建议:)

0 个答案:

没有答案