Прежде всего:
Невозможно определить хорошую топологию сети только по количеству входов и выходов. Это критически зависит от количества обучающих примеров и сложности классификации, которую вы пытаетесь выучить. [1]
И Йошуа Бенжио предложил очень простое правило:
Просто продолжайте добавлять слои, пока ошибка теста больше не улучшится. [2]
Более того:
Более ранние функции ConvNet содержат более общие функции (например, детекторы контуров или детекторы цветных пятен), которые должны быть полезны для многих задач, но более поздние слои ConvNet постепенно становятся более специфичными для деталей классов, содержащихся в исходном наборе данных. [ 3]
Например, в методе обучения детекторам признаков:
Первый уровень изучает детекторы краев, а последующие уровни изучают более сложные элементы, а уровни более высокого уровня кодируют более абстрактные элементы. [4]
Поэтому рекомендуется использовать два плотных слоя, а не один слой.
В заключение:
Оригинальная статья о Dropout предоставляет ряд полезных эвристик, которые следует учитывать при использовании Dropout на практике. Одним из них является:
использование выпадающих на входящих (видимых), а также скрытых юнитов. Применение отсева на каждом уровне сети показало хорошие результаты. [5]
в CNN обычно слой Dropout применяется после каждого слоя пула, а также после вашего плотного слоя. Хороший учебник здесь [6]
Ссылки:
[1] https://www.cs.cmu.edu/Groups/AI/util/html/faqs/ai/neural/faq.html
[2] Бенджо, Йошуа. «Практические рекомендации по градиентному обучению глубоких архитектур». Нейронные сети: хитрости торговли. Springer Berlin Heidelberg, 2012. 437-478.
[3] http://cs231n.github.io/transfer-learning/
[4] http://learning.eng.cam.ac.uk/pub/Public/Turner/Teaching/ml-lecture-3-slides.pdf
[5] https://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/
[6] https://cambridgespark.com/content/tutorials/convolutional-neural-networks-with-keras/index.html