如何在 PyTorch 中进行完全连接的批处理规范?
Posted
技术标签:
【中文标题】如何在 PyTorch 中进行完全连接的批处理规范?【英文标题】:How to do fully connected batch norm in PyTorch? 【发布时间】:2018-04-22 05:07:01 【问题描述】:torch.nn
有类 BatchNorm1d
、BatchNorm2d
、BatchNorm3d
,但它没有完全连接的 BatchNorm 类?在 PyTorch 中执行正常 Batch Norm 的标准方法是什么?
【问题讨论】:
是什么让你认为这些层没有完全连接? 【参考方案1】:好的。我想到了。 BatchNorm1d
也可以处理 Rank-2 张量,因此可以将 BatchNorm1d
用于正常的全连接情况。
例如:
import torch.nn as nn
class Policy(nn.Module):
def __init__(self, num_inputs, action_space, hidden_size1=256, hidden_size2=128):
super(Policy, self).__init__()
self.action_space = action_space
num_outputs = action_space
self.linear1 = nn.Linear(num_inputs, hidden_size1)
self.linear2 = nn.Linear(hidden_size1, hidden_size2)
self.linear3 = nn.Linear(hidden_size2, num_outputs)
self.bn1 = nn.BatchNorm1d(hidden_size1)
self.bn2 = nn.BatchNorm1d(hidden_size2)
def forward(self, inputs):
x = inputs
x = self.bn1(F.relu(self.linear1(x)))
x = self.bn2(F.relu(self.linear2(x)))
out = self.linear3(x)
return out
【讨论】:
这可能与机器学习无关,但超级调用不应该像super(Policy, self).__init__()
而不是super(Policy2, self).__init__()
吗?在 Python3 中,它甚至可以简化为 super().__init__()
。【参考方案2】:
BatchNorm1d 通常在 ReLU 之前,bias 是多余的,所以
import torch.nn as nn
class Policy(nn.Module):
def __init__(self, num_inputs, action_space, hidden_size1=256, hidden_size2=128):
super(Policy2, self).__init__()
self.action_space = action_space
num_outputs = action_space
self.linear1 = nn.Linear(num_inputs, hidden_size1, bias=False)
self.linear2 = nn.Linear(hidden_size1, hidden_size2, bias=False)
self.linear3 = nn.Linear(hidden_size2, num_outputs)
self.bn1 = nn.BatchNorm1d(hidden_size1)
self.bn2 = nn.BatchNorm1d(hidden_size2)
def forward(self, inputs):
x = inputs
x = F.relu(self.bn1(self.linear1(x)))
x = F.relu(self.bn2(self.linear2(x)))
out = self.linear3(x)
return out
【讨论】:
以上是关于如何在 PyTorch 中进行完全连接的批处理规范?的主要内容,如果未能解决你的问题,请参考以下文章
PyTorch 使用 nn.Transformer 和 TorchText 进行序列到序列的建模