我在GPU GTX 1080ti中使用pytorch构建了一个简单的网络,并在开始时启动了网络权重,并随机启动了输入张量。然后我计算了10次网络输出,但每个输出都有一点差异(在此阶段,所有权重和输入都是固定的,我将它们打印出来以进行检查。)。如下所示:
我不知道为什么会发生?是因为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中所做的一样,它将管理管道,并且在我更改网络结构后无需担心某些参数。如果我想以张量流样式构建网络该怎么办?感谢您的任何建议:)