Czy istnieją jakieś ogólne wytyczne dotyczące miejsca umieszczania warstw odpadających w sieci neuronowej?
Czy istnieją jakieś ogólne wytyczne dotyczące miejsca umieszczania warstw odpadających w sieci neuronowej?
Odpowiedzi:
W oryginalnym artykule, w którym zaproponowano warstwy zrywające, autorstwa Hintona (2012) , zrzucono (przy p = 0,5) na każdej z w pełni połączonych (gęstych) warstw przed wydrukiem; nie zastosowano go na warstwach splotowych. Ta stała się najczęściej używaną konfiguracją.
Nowsze badania wykazały pewną wartość w stosowaniu rezygnacji również z warstw splotowych, chociaż na znacznie niższych poziomach: p = 0,1 lub 0,2. Usunięcie zastosowano po funkcji aktywacji każdej warstwy splotowej: CONV-> RELU-> DROP.
relu
aktywacją, po której następuje warstwa maksimum puli, czy warstwa odpadająca (2D) powinna iść natychmiast po splotie, czy po warstwie maksimum puli, czy też obie, czy to nie ma znaczenia?
RELU
każdej warstwie CONV. Nie sądzę, aby zbadali wpływ dodania porzucania po maksymalnych warstwach pulowania.
Przed każdą projekcją liniową. Patrz Srivastava i in. (2014) .
W oryginalnym papierze zaproponowano warstwy odpadające, które zastosowano na każdej z w pełni połączonych (gęstych) warstw przed wydrukiem; nie zastosowano go na warstwach splotowych.
Nie wolno nam używać warstwy odpadającej po warstwie splotowej, ponieważ przesuwając filtr na szerokość i wysokość obrazu wejściowego, tworzymy dwuwymiarową mapę aktywacji, która daje odpowiedzi tego filtra w każdej pozycji przestrzennej. Tak więc, gdy warstwa odpadowa neutralizuje (zeruje) losowe neurony, istnieje szansa na utratę bardzo ważnej cechy na obrazie w naszym procesie treningowym.
Jeśli się nie mylę, możesz dodać to po nieliniowości każdej komórki:
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))
Pierwszy wiersz to funkcja aktywacji, a ostatni to dodanie wyniku do wyniku. Proszę odnieść się do tego bloga . Mam nadzieję że to pomoże.
Możesz też umieścić go na stronie wejściowej, tak jak w tym fragmencie:
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
Źródło: https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb
Technicznie możesz dodać warstwę usuwaną na końcu bloku, na przykład po splotie lub po kodowaniu RNN.