考虑以下用于 MNIST 的 LeNet 模型
现在,我使用这个模型对一批样本进行单步前向传播,如下所示
network=LeNet()optimizer = torch.optim.SGD(self.network.parameters(), lr=0.001, momentum=0.9)device = torch.device("cpu")network.to(device)network.train()optimizer.zero_grad()# X_batch= ... 从 train_loader 中提取的一批 50 个样本,定义如下:# torch.manual_seed(42)# training_set = datasets.MNIST('./mnist_data', train=True, download=False, # transform=transforms.Compose([# transforms.ToTensor(),# transforms.Normalize((0.1307,), (0.3081,))]))# train_loader = torch.utils.data.DataLoader(training_set, # batch_size=50, # shuffle=False)logits = network(X_batch)
请注意,加载器中设置了 shuffle=False
和 download=False
,因为数据集已经下载且我不希望打乱顺序。我的问题是,如果我运行这段代码两次,会得到不同的 logits
值,我不明白为什么,因为其他一切似乎都没有变化。为了额外检查,我还将 X_batch
提取到一个 numpy
数组中,并验证这批样本与之前执行时完全相同。我使用 numpy.array_equal()
函数进行此检查。
我实在无法理解这里缺少了什么,除非是精度问题。
回答:
原因是每次运行这段代码时,你都会调用
network = LeNet()
结果网络的权重会进行不同的随机初始化。如果你在执行此操作前设置随机种子,例如这样:
torch.manual_seed(42)network = LeNet()
那么在使用相同数据作为输入时,你应该会在第一次前向传播中得到相同的结果。