Mar*_*tin 13 python machine-learning neural-network deep-learning pytorch
我很不确定这是否正确。我真的很难找到很多关于如何参数化神经网络的好例子。
你如何看待这两个班级的辍学方式。首先,我正在编写原始类:
class NeuralNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes, p = dropout):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = F.relu(self.fc1(x))
out = F.relu(self.fc2(out))
out = self.fc3(out)
return out
Run Code Online (Sandbox Code Playgroud)
然后在这里,我发现了两种不同的写东西的方式,我不知道如何区分。第一个使用:
self.drop_layer = nn.Dropout(p=p)
Run Code Online (Sandbox Code Playgroud)
而第二个:
self.dropout = nn.Dropout(p)
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
class NeuralNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes, p = dropout):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, num_classes)
self.drop_layer = nn.Dropout(p=p)
def forward(self, x):
out = F.relu(self.fc1(x))
out = F.relu(self.fc2(out))
out = self.fc3(out)
return out
class NeuralNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes, p = dropout):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, num_classes)
self.dropout = nn.Dropout(p)
def forward(self, x):
out = F.relu(self.fc1(x))
out = F.relu(self.fc2(out))
out = self.fc3(out)
return out
Run Code Online (Sandbox Code Playgroud)
这是否可行,如果不是如何改进它,它是否给了我我期望的结果,这意味着创建一个神经网络,我可以在其中删除一些神经元。重要的细节,我只想dropout第二层神经网络,其余不涉及!
Nic*_*ais 14
您提供的两个示例完全相同。self.drop_layer = nn.Dropout(p=p)
并且self.dropout = nn.Dropout(p)
只是因为作者将层分配给不同的变量名称而有所不同。dropout 层通常在.__init__()
方法中定义,并在 中调用.forward()
。像这样:
class NeuralNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes, p = dropout):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, num_classes)
self.dropout = nn.Dropout(p)
def forward(self, x):
out = F.relu(self.fc1(x))
out = F.relu(self.fc2(out))
out = self.dropout(self.fc3(out))
return out
Run Code Online (Sandbox Code Playgroud)
您可以进行以下测试:
import torch
import torch.nn as nn
m = nn.Dropout(p=0.5)
input = torch.randn(20, 16)
print(torch.sum(torch.nonzero(input)))
print(torch.sum(torch.nonzero(m(input))))
Run Code Online (Sandbox Code Playgroud)
tensor(5440) # sum of nonzero values
tensor(2656) # sum on nonzero values after dropout
Run Code Online (Sandbox Code Playgroud)
让我们想象一下:
import torch
import torch.nn as nn
input = torch.randn(5, 5)
print(input)
Run Code Online (Sandbox Code Playgroud)
tensor([[ 1.1404, 0.2102, -0.1237, 0.4240, 0.0174],
[-2.0872, 1.2790, 0.7804, -0.0962, -0.9730],
[ 0.4788, -1.3408, 0.0483, 2.4125, -1.2463],
[ 1.5761, 0.3592, 0.2302, 1.3980, 0.0154],
[-0.4308, 0.2484, 0.8584, 0.1689, -1.3607]])
Run Code Online (Sandbox Code Playgroud)
现在,让我们应用 dropout:
m = nn.Dropout(p=0.5)
output = m(input)
print(output)
Run Code Online (Sandbox Code Playgroud)
tensor([[ 0.0000, 0.0000, -0.0000, 0.8481, 0.0000],
[-0.0000, 0.0000, 1.5608, -0.0000, -1.9459],
[ 0.0000, -0.0000, 0.0000, 0.0000, -0.0000],
[ 0.0000, 0.7184, 0.4604, 2.7959, 0.0308],
[-0.0000, 0.0000, 0.0000, 0.0000, -0.0000]])
Run Code Online (Sandbox Code Playgroud)
大约一半的神经元已经变为零,因为我们有可能p=0.5
将神经元设置为零!