两者的相同之处:
nn.Xxx
和nn.functional.xxx
的实际功能是相同的,即nn.Conv2d
和nn.functional.conv2d
都是进行卷积,nn.Dropout
和nn.functional.dropout
都是进行dropout,。。。。。;- 运行效率也是近乎相同。
nn.functional.xxx
是函数接口,而nn.Xxx
是nn.functional.xxx
的类封装,并且nn.Xxx
都继承于一个共同祖先nn.Module
。这一点导致nn.Xxx
除了具有nn.functional.xxx
功能之外,内部附带了nn.Module
相关的属性和方法,例如train(), eval(),load_state_dict, state_dict
等。
两者的差别之处:
- 两者的调用方式不同。
nn.Xxx
需要先实例化并传入参数,然后以函数调用的方式调用实例化的对象并传入输入数据。
inputs = torch.rand(64, 3, 244, 244)
conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1)
out = conv(inp