我有以下问题,我正在尝试为此问题编写自己的代码 . 我知道有一种称为随机计算图的东西,http://pytorch.org/docs/master/distributions.html对此有用 . 但是,我 Ant 要为类似的东西编写我自己的代码 .

模型本身是随机的,即说是否使用层,取决于取决于数据点的一些随机变量 . 这种随机计算图的最简单示例是使用层的概率不依赖于数据点 . 我坚持用单个隐藏层解释最简单的情况 .
假设原始计算图如下(X是输入特征,而softmax用于预测)原始:X - > Relu(Linear())---> Softmax()现在说我使用随机变量Y假设值为0或1.仅当Y = 1时才使用Relu(Linear())层 . 如果Y = 0,我输出't use the Relu(Linear). Thus, (say Z is middle layer')X ---> Z = Relu(线性(X))仅如果Y = 1,否则如果Y = 0:Z = X ---> SoftMax() . 因此,请注意精确的计算图取决于数据点 . 我希望通过计算图表(每个数据点不同)进行反向传播 . 我有以下两个问题:

  • 用于实现上述想法,我可以通过定义自己的类来执行以下操作 .
class Myclass:
  def init():
   self.linear = Linear
   self.relu = Relu
   self.softmax = Softmax
   self.prob = p
 def forward(self,x):
  sample = np.random.binomial(1,p)
  if sample == 1:
    out = self.softmax(self.linear(x))
  else:
    out = self.softmax(x)
  return out

让我们说我称我的模型为模型 . 然后,我可以简单地使用PyTorch网站中显示的优化函数:http://pytorch.org/tutorials/beginner/pytorch_with_examples.html?例如,我可以使用以下方法进行培训吗?

criterion = torch.nnCrossEntropy()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4, momentum=0.9)
for t in range(500):
    # Forward pass: Compute predicted y by passing x to the model
    y_pred = model(x)
    # Compute and print loss
    loss = criterion(y_pred, y)
    # Zero gradients, perform a backward pass, and update the weights.
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
  • 我显然想要使用大批量,比如说256.现在,当我使用上面的方法时,PyTorch会自动为批次中的不同数据点创建不同的计算图,然后以不同的方式计算梯度对于不同的数据点?谢谢