来自“深度强化学习:动手实践”的Pytorch问题

时间:2019-10-01 23:48:55

标签: pytorch

我正在阅读Maxim Lapan的《深度学习动手》。我在第2章中遇到了这段代码,但我不太明白。谁能解释为什么print(out)的输出给出三个参数而不是我们输入的单个float张量。而且,为什么这里需要超函数?最后,正向接受的x参数是什么?谢谢。

class OurModule(nn.Module):
    def __init__(self, num_inputs, num_classes, dropout_prob=0.3):  #init 
        super(OurModule, self).__init__() #Call OurModule and pass the net instance (Why is this necessary?) 
        self.pipe = nn.Sequential( #net.pipe is the nn object now
            nn.Linear(num_inputs, 5),
            nn.ReLU(),
            nn.Linear(5, 20),
            nn.ReLU(),
            nn.Linear(20, num_classes),
            nn.Dropout(p=dropout_prob),
            nn.Softmax(dim=1)
        )

    def forward(self, x): #override the default forward method by passing it our net instance and (return the nn object?). x is the tensor? This is called when 'net' receives a param?
        return self.pipe(x)

if __name__ == "__main__":
    net = OurModule(num_inputs=2, num_classes=3)
    print(net)
    v = torch.FloatTensor([[2, 3]])
    out = net(v)
    print(out) #[2,3] put through the forward method of the nn? Why did we get a third param for the output?
    print("Cuda's availability is %s" % torch.cuda.is_available()) #find if gpu is available
    if torch.cuda.is_available():
        print("Data from cuda: %s" % out.to('cuda'))

OurModule.__mro__

2 个答案:

答案 0 :(得分:3)

OurModule定义了一个PyTorch nn.Module,它接受​​2输入(num_inputs)并产生3输出(num_classes)。

它包括:

  1. 接受Linear输入并产生2输出的5
  2. 一个ReLU
  3. 接受Linear输入并产生5输出的20
  4. 一个ReLU
  5. 接受Linear输入并产生203)输出的num_classes
  6. Dropout
  7. Softmax

您创建由v个输入组成的2,并在调用forward()时将其通过此网络的net(v)方法传递。然后,运行此网络(3输出)的结果存储在out中。

在您的示例中,x取值为vtorch.FloatTensor([[2, 3]])

答案 1 :(得分:2)

尽管@JoshVarty提供了一个很好的答案,但我想补充一点。

  

为什么这里需要超级功能

OurModule继承了nn.Module。超级功能意味着您要使用父级的nn.Module函数,即init。您可以参考source code来查看父类在init函数中的确切作用。