Python 为什么torch.nn.Sigmoid()的行为与torch.Sigmoid不同?

Python 为什么torch.nn.Sigmoid()的行为与torch.Sigmoid不同?,python,python-3.x,pytorch,reinforcement-learning,Python,Python 3.x,Pytorch,Reinforcement Learning,我正在使用神经网络构建一个RL代理来近似模型的Q值。 我的第一个实现是这样的: self.l1 = nn.Linear(model.state_dim, 128) self.l2 = nn.Linear(128, 256) self.l3 = nn.Linear(256, 256) self.l4 = nn.Linear(256, model.action_dim) def forward(self, x): x = self.l1(x) x = torch.sigmoid

我正在使用神经网络构建一个RL代理来近似模型的Q值。 我的第一个实现是这样的:

self.l1 = nn.Linear(model.state_dim, 128)
self.l2 = nn.Linear(128, 256)
self.l3 = nn.Linear(256, 256)
self.l4 = nn.Linear(256, model.action_dim)

def forward(self, x):
     x = self.l1(x)
     x = torch.sigmoid(x)
     x = self.l2(x)
     x = torch.sigmoid(x)
     x = self.l3(x)
     x = torch.sigmoid(x)
     return self.l4(x)
我在一系列的训练中得到了一些类似的输出:

这个输出很有意义,Q值应该是负数,因为从模型输出的奖励在[-无穷大,0]范围内

然后我查看了pytorch的文档,发现了一个更干净的网络实现:

self.fc = nn.Sequential(
            nn.Linear(model.state_dim, 128),
            nn.Sigmoid(),
            nn.Linear(128, 256),
            nn.Sigmoid(),
            nn.Linear(256, 256),
            nn.Sigmoid(),
            nn.Linear(256, model.action_dim)
        )

def forward(self, x):
     return self.fc(x)


这个输出没有意义,因为Q值应该是负数,如果它像我配置的顺序模型一样,它不能在输出层产生任何负数,但对我来说,配置是完全相同的。我读到nn.Sequential实现的GPU功能更强,但我不想为了额外的性能而牺牲模型的准确性。为什么这两个实现的行为如此不同?

您使用的是什么版本的pytorch?Torch.nn.functional.sigmoid从1.0.0开始就不推荐使用,因此您应该会收到一条警告。@EdekiOkoh您好,我正在使用pytorch 1.3.0,我收到了警告,但是我更改了它,我现在使用的是Torch.sigmoid而不是Torch.nn.functional.sigmoid(不推荐使用的一个).您是否对这两种模式进行了同等的种子设定,并确保环境奖励也是可复制的?如果是这样的话,试着将GPU设置为确定性模式,尽管它不会有太大的区别。除此之外,它们应该产生非常相似的结果,这不太可能是由于
torch.nn.Sequential
.Hi@SzymonMaszke,模型是完全相同的,唯一改变的是上面显示的前向部分。模型奖励在这两种情况下使用相同的逻辑,Q值的差异在不同的运行中一致显示。强化了已经提出的观点。您是否使用相同的精确权重初始化了两个网络(使用种子)?初始化可以带来巨大的不同。您使用的是什么版本的pytorch?Torch.nn.functional.sigmoid从1.0.0开始就不推荐使用,因此您应该会收到一条警告。@EdekiOkoh您好,我正在使用pytorch 1.3.0,我收到了警告,但是我更改了它,我现在使用的是Torch.sigmoid而不是Torch.nn.functional.sigmoid(不推荐使用的一个).您是否对这两种模式进行了同等的种子设定,并确保环境奖励也是可复制的?如果是这样的话,试着将GPU设置为确定性模式,尽管它不会有太大的区别。除此之外,它们应该产生非常相似的结果,这不太可能是由于
torch.nn.Sequential
.Hi@SzymonMaszke,模型是完全相同的,唯一改变的是上面显示的前向部分。模型奖励在这两种情况下使用相同的逻辑,Q值的差异在不同的运行中一致显示。强化了已经提出的观点。您是否使用相同的精确权重初始化了两个网络(使用种子)?初始化可以带来巨大的不同。