<h2>How can I fight overfitting?</h2>

<ul>
<li>Get more data (or data augmentation)</li>
<li>Dropout (see <a href="https://arxiv.org/abs/1207.0580" rel="noreferrer">paper</a>, <a href="https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf" rel="noreferrer">explanation</a>, <a href="https://datascience.stackexchange.com/q/16045/8820">dropout for cnns</a>)</li>
<li>DropConnect</li>
<li>Regularization (see <a href="https://arxiv.org/pdf/1707.09725.pdf#page=134" rel="noreferrer">my masters thesis</a>, page 85 for examples)</li>
<li>Feature scale clipping</li>
<li>Global average pooling</li>
<li>Make network smaller</li>
<li>Early stopping</li>
</ul>

<h2>How can I improve my CNN?</h2>

<blockquote>
  <p>Thoma, Martin. "<a href="https://arxiv.org/pdf/1707.09725.pdf" rel="noreferrer">Analysis and Optimization of Convolutional Neural Network Architectures</a>." arXiv preprint arXiv:1707.09725 (2017).</p>
</blockquote>

<p>See chapter 2.5 for analysis techniques. As written in the beginning of that chapter, you can usually do the following:</p>

<ul>
<li>(I1) Change the problem definition (e.g., the classes which are to be distinguished)</li>
<li>(I2) Get more training data</li>
<li>(I3) Clean the training data</li>
<li>(I4) Change the preprocessing (see Appendix B.1)</li>
<li>(I5) Augment the training data set (see Appendix B.2)</li>
<li>(I6) Change the training setup (see Appendices B.3 to B.5)</li>
<li>(I7) Change the model (see Appendices B.6 and B.7)</li>
</ul>

<h2>Misc</h2>

<blockquote>
  <p>The CNN has to classify 27 different labels, so unsurprisingly, a major problem has been addressing overfitting.</p>
</blockquote>

<p>I don't understand how this is connected. You can have hundreds of labels without a problem of overfitting.</p>
Prevention of overfitting in convolutional layers of a CNN
<p>I'm using TensorFlow to train a Convolutional Neural Network (CNN) for a sign language application.  The CNN has to classify 27 different labels, so unsurprisingly, a major problem has been addressing overfitting.  I've taken several steps to accomplish this:</p>

<ol>
<li>I've collected a large amount of high-quality training data (over 5000 samples per label).</li>
<li>I've built a reasonably sophisticated pre-processing stage to help maximize invariance to things like lighting conditions.</li>
<li>I'm using dropout on the fully-connected layers.</li>
<li>I'm applying L2 regularization to the fully-connected parameters.</li>
<li>I've done extensive hyper-parameter optimization (to the extent possible given HW and time limitations) to identify the simplest model that can achieve close to 0% loss on training data.</li>
</ol>

<p>Unfortunately, even after all these steps, I'm finding that I can't achieve much better that about 3% test error.  (It's not terrible, but for the application to be viable, I'll need to improve that substantially.)</p>

<p>I suspect that the source of the overfitting lies in the convolutional layers since I'm not taking any explicit steps there to regularize (besides keeping the layers as small as possible).  But based on examples provided with TensorFlow, it doesn't appear that regularization or dropout is typically applied to convolutional layers.</p>

<p>The only approach I've found online that explicitly deals with prevention of overfitting in convolutional layers is a fairly new approach called <a href="http://www.matthewzeiler.com/pubs/iclr2013/iclr2013.pdf" rel="noreferrer">Stochastic Pooling</a>.  Unfortunately, it appears that there is no implementation for this in TensorFlow, at least not yet.</p>

<p>So in short, is there a recommended approach to prevent overfitting in convolutional layers that can be achieved in TensorFlow?  Or will it be necessary to create a custom pooling operator to support the Stochastic Pooling approach?</p>

<p>Thanks for any guidance!</p>