Чи є загальні вказівки щодо того, де розмістити шари, що випадають в нейронну мережу?
Чи є загальні вказівки щодо того, де розмістити шари, що випадають в нейронну мережу?
Відповіді:
У оригінальній статті, що пропонував шари випадання, від Hinton (2012) , випадання (з р = 0,5) було використано на кожному з повністю пов'язаних (щільних) шарів до виходу; його не застосовували на згорткових шарах. Це стало найбільш часто використовуваною конфігурацією.
Більш недавні дослідження показали деяку цінність у застосуванні відсіву також на згорткових шарах, хоча на значно нижчих рівнях: p = 0,1 або 0,2. Випадання використовувалося після функції активації кожного згорткового шару: CONV-> RELU-> DROP.
relu
активацією, що супроводжується максимумом шару об'єднання, чи повинен (2D) випадаючий шар переходити відразу після згортання, або після шару максимального об'єднання, або обох, чи це не має значення?
RELU
кожного шару CONV. Я не вірю, що вони досліджували ефект додавання відсіву після максимального об'єднання шарів.
Перед кожною лінійною проекцією. Зверніться до Srivastava та ін. (2014) .
В оригінальному папері запропоновані шари випадання, які використовувались на кожному повністю з'єднаному (щільному) шарі перед виходом; його не застосовували на згорткових шарах.
Ми не повинні використовувати шар випадання після згорткового шару, оскільки ми пересуваємо фільтр по ширині та висоті вхідного зображення, ми створюємо двовимірну карту активації, яка дає відповіді цього фільтра у кожному просторовому положенні. Так як шар випадає нейтралізує (робить його нульовим) випадкові нейрони, є шанси втратити дуже важливу особливість у зображенні в нашому тренувальному процесі.
Якщо я не помиляюся, ви можете додати його після нелінійності кожної комірки:
layer_1 = (1/(1+np.exp(-(np.dot(X,synapse_0)))))
if(do_dropout):
layer_1 *= np.random.binomial([np.ones((len(X),hidden_dim))],1-dropout_percent)[0] * (1.0/(1-dropout_percent))
Перший рядок - це функція активації, а останній - додавання випадаючого результату. Будь ласка, зверніться до цього блогу . Сподіваюся, це допомагає.
Або ви можете розмістити його на вкладці входу, як у цьому фрагменті:
class BahdanauAttnDecoderRNN(nn.Module):
def __init__(self, hidden_size, output_size, n_layers=1, dropout_p=0.1):
super(AttnDecoderRNN, self).__init__()
# Define parameters
self.hidden_size = hidden_size
self.output_size = output_size
self.n_layers = n_layers
self.dropout_p = dropout_p
self.max_length = max_length
# Define layers
self.embedding = nn.Embedding(output_size, hidden_size)
self.dropout = nn.Dropout(dropout_p)
self.attn = GeneralAttn(hidden_size)
self.gru = nn.GRU(hidden_size * 2, hidden_size, n_layers, dropout=dropout_p)
self.out = nn.Linear(hidden_size, output_size)
def forward(self, word_input, last_hidden, encoder_outputs):
# Note that we will only be running forward for a single decoder time step, but will use all encoder outputs
# Get the embedding of the current input word (last output word)
word_embedded = self.embedding(word_input).view(1, 1, -1) # S=1 x B x N
word_embedded = self.dropout(word_embedded)
# Calculate attention weights and apply to encoder outputs
attn_weights = self.attn(last_hidden[-1], encoder_outputs)
context = attn_weights.bmm(encoder_outputs.transpose(0, 1)) # B x 1 x N
# Combine embedded input word and attended context, run through RNN
rnn_input = torch.cat((word_embedded, context), 2)
output, hidden = self.gru(rnn_input, last_hidden)
# Final output layer
output = output.squeeze(0) # B x N
output = F.log_softmax(self.out(torch.cat((output, context), 1)))
# Return final output, hidden state, and attention weights (for visualization)
return output, hidden, attn_weights
Джерело: https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb
Технічно ви можете додати шар відсіву в кінці блоку, наприклад, після згортання або після кодування RNN.