2016-06-01 17 views
5

Poiché la parola "livello" spesso indica cose diverse quando applicate a un livello convoluzionale (alcune trattano tutto attraverso il raggruppamento come un singolo livello, altre trattano convoluzione, non linearità e raggruppamento come "strati" separati; see fig 9.7) non è chiaro dove posso applicare l'abbandono in uno strato convoluzionale.Dove dovrei applicare il dropout a un livello convoluzionale?

L'interruzione si verifica tra non linearità e raggruppamento?


Ad esempio, in tensorflow sarebbe qualcosa di simile:

kernel_logits = tf.nn.conv2d(input_tensor, ...) + biases 
activations = tf.nn.relu(kernel_logits) 
kept_activations = tf.nn.dropout(activations, keep_prob) 
output = pool_fn(kept_activations, ...) 
+0

[Un altro esempio] (http://danielnouri.org/notes/2014/12/17/using-convolutional- neural-nets-to-detect-facial-keypoints-tutorial/# dropout) suggerisce l'applicazione del dropout dopo il pooling. – orome

+0

Ho fatto esperimenti con l'utilizzo del dropout invece del downsampling medio su un'area 2x2 per le immagini. La mia teoria era che invece di eseguire il downsampling di ciascuna area dell'immagine 2x2, se invece fosse stato utilizzato il dropout per realizzare in modo efficace molte immagini leggermente diverse, avrei effettivamente più campioni di allenamento ed essere in grado di allenarmi a lungo e ottenere risultati migliori. Dopo aver provato diverse configurazioni e lunghe sessioni di allenamento, l'abbandono come mezzo per trasformare il downsampling nella generazione di contenuti si è rivelato inefficace. Aggiornamento – Wontonimo

+0

, l'utilizzo di 3x3 fa davvero una grande differenza. Usare il dropout su un downsampo 3x3 invece di fare solo una media per un downsample 3x3 fa una differenza significativa. Su MNIST, questo si traduce in un 92,5% corretto utilizzando il dropout su downsample 3x3 per convendere, quindi maxpool vs 84,2% corretto usando la media su downsample 3x3 per convendere poi maxpool. – Wontonimo

risposta

2

Probabilmente si potrebbe provare ad applicare abbandono in luoghi diversi, ma in termini di prevenzione overfitting non è sicuro che stai andando a vedere molto di un problema prima della messa in comune. Quello che ho visto per la CNN è che tensorflow.nn.dropout ottiene applicata dopo la non linearità e messa in comune:

# Create a convolution + maxpool layer for each filter size 
    pooled_outputs = [] 
    for i, filter_size in enumerate(filters): 
     with tf.name_scope("conv-maxpool-%s" % filter_size): 
      # Convolution Layer 
      filter_shape = [filter_size, embedding_size, 1, num_filters] 
      W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W") 
      b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b") 
      conv = tf.nn.conv2d(
       self.embedded_chars_expanded, 
       W, 
       strides=[1, 1, 1, 1], 
       padding="VALID", 
       name="conv") 
      # Apply nonlinearity 
      h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu") 
      # Maxpooling over the outputs 
      pooled = tf.nn.max_pool(
       h, 
       ksize=[1, sequence_length - filter_size + 1, 1, 1], 
       strides=[1, 1, 1, 1], 
       padding='VALID', 
       name="pool") 
      pooled_outputs.append(pooled) 



    # Combine all the pooled features 
    num_filters_total = num_filters * len(filters) 
    self.h_pool = tf.concat(3, pooled_outputs) 
    self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total]) 

    # Add dropout 
    with tf.name_scope("dropout"): 
     self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob) 
+0

Re: "in termini di prevenzione del sovradattamento non è sicuro che vedrete gran parte di un problema prima della messa in comune": non penso che sia per evitare il sovrasfruttamento a livello convoluzionale; è per [introdurre rumore negli strati successivi] (https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf) (ultimo paragrafo prima della sezione 6.1.3). – orome

Problemi correlati