PyTorch 前向传播在相同样本上返回不同的 logits

考虑以下用于 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=Falsedownload=False,因为数据集已经下载且我不希望打乱顺序。我的问题是,如果我运行这段代码两次,会得到不同的 logits 值,我不明白为什么,因为其他一切似乎都没有变化。为了额外检查,我还将 X_batch 提取到一个 numpy 数组中,并验证这批样本与之前执行时完全相同。我使用 numpy.array_equal() 函数进行此检查。

我实在无法理解这里缺少了什么,除非是精度问题。


回答:

原因是每次运行这段代码时,你都会调用

network = LeNet()

结果网络的权重会进行不同的随机初始化。如果你在执行此操作前设置随机种子,例如这样:

torch.manual_seed(42)network = LeNet()

那么在使用相同数据作为输入时,你应该会在第一次前向传播中得到相同的结果。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注