Наилучшие параметры конфигурации для модели классификации изображений CNN в CNTK - PullRequest
0 голосов
/ 12 октября 2018

У меня есть набор данных, состоящий из 2 изображений для наблюдения.Изображения имеют форму (1, 128, 118), они представляют собой изображения в градациях серого, и для этой задачи существует 11 классов.Что лучше всего использовать с CNN с такими данными?Как я могу оптимально определить, например, количество слоев моего CNN, заполнение или нет, форму шага, сколько слоев пула я должен использовать?Лучшее максимальное объединение или среднее объединение?

Это фактическая конфигурация моей модели:

def create_model(features):
    with C.layers.default_options(init=C.glorot_uniform(), activation=C.ops.relu, pad= True):
            h = features

            h = C.layers.Convolution2D(filter_shape = (5,5),
                                       num_filters=8, strides = (2,2),
                                       pad=True, name = 'first_conv')(h)

            h = C.layers.AveragePooling(filter_shape = (5,5), strides=(2,2))(h)

            h = C.layers.Convolution2D(filter_shape = (5,5), num_filters=16, pad = True)(h)

            h = C.layers.AveragePooling(filter_shape = (5,5), strides=(2,2))(h) 

            h = C.layers.Convolution2D(filter_shape = (5,5), num_filters=32, pad = True)(h)

            h = C.layers.AveragePooling(filter_shape = (5,5), strides=(2,2))(h) 

            h = C.layers.Dense(96)(h) 

            h = C.layers.Dropout(dropout_rate=0.5)(h)

            r = C.layers.Dense(num_output_classes, activation=  None, name='classify')(h)

            return r

z = create_model(x)
# Print the output shapes / parameters of different components
print("Output Shape of the first convolution layer:", z.first_conv.shape)
print("Bias value of the last dense layer:", z.classify.b.value)

Я немного экспериментировал и настраивал конфигурацию, изменяя значения параметров, добавляя и удаляя слои, но мой CNN, кажется, нечтобы учиться на моих данных, он сходится к определенной точке в лучшем случае, а затем ударяет в стену, и ошибка перестает уменьшаться.

Я обнаружил, что learning_rate и num_minibatches_to_trainпараметры важны.Я на самом деле установил learning_rate = 0.2 и num_minibatches_to_train = 128 Я также использую sgd в качестве ученика.Вот пример моих последних результатов:

Minibatch: 0, Loss: 2.4097, Error: 95.31%
Minibatch: 100, Loss: 2.3449, Error: 95.31%
Minibatch: 200, Loss: 2.3751, Error: 90.62%
Minibatch: 300, Loss: 2.2813, Error: 78.12%
Minibatch: 400, Loss: 2.3478, Error: 84.38%
Minibatch: 500, Loss: 2.3086, Error: 87.50%
Minibatch: 600, Loss: 2.2518, Error: 84.38%
Minibatch: 700, Loss: 2.2797, Error: 82.81%
Minibatch: 800, Loss: 2.3234, Error: 84.38%
Minibatch: 900, Loss: 2.2542, Error: 81.25%
Minibatch: 1000, Loss: 2.2579, Error: 85.94%
Minibatch: 1100, Loss: 2.3469, Error: 85.94%
Minibatch: 1200, Loss: 2.3334, Error: 84.38%
Minibatch: 1300, Loss: 2.3143, Error: 85.94%
Minibatch: 1400, Loss: 2.2934, Error: 92.19%
Minibatch: 1500, Loss: 2.3875, Error: 85.94%
Minibatch: 1600, Loss: 2.2926, Error: 90.62%
Minibatch: 1700, Loss: 2.3220, Error: 87.50%
Minibatch: 1800, Loss: 2.2693, Error: 87.50%
Minibatch: 1900, Loss: 2.2864, Error: 84.38%
Minibatch: 2000, Loss: 2.2678, Error: 79.69%
Minibatch: 2100, Loss: 2.3221, Error: 92.19%
Minibatch: 2200, Loss: 2.2033, Error: 87.50%
Minibatch: 2300, Loss: 2.2493, Error: 87.50%
Minibatch: 2400, Loss: 2.4446, Error: 87.50%
Minibatch: 2500, Loss: 2.2676, Error: 85.94%
Minibatch: 2600, Loss: 2.3562, Error: 85.94%
Minibatch: 2700, Loss: 2.3290, Error: 82.81%
Minibatch: 2800, Loss: 2.3767, Error: 87.50%
Minibatch: 2900, Loss: 2.2684, Error: 76.56%
Minibatch: 3000, Loss: 2.3365, Error: 90.62%
Minibatch: 3100, Loss: 2.3369, Error: 90.62%

Есть предложения по улучшению моих результатов?Я открыт для любых подсказок / исследований.

Заранее благодарен

1 Ответ

0 голосов
/ 12 октября 2018

В любом случае, чтобы ответить на вопрос, обычно, когда вы только начинаете, я рекомендую, чтобы для conv layer значение вашего filter_shape было равно (3, 3), а значение шага должно быть равно 1.

Для объединения слоев придерживайтесьmaxpooling, пока вы не станете лучше с глубоким обучением.Для слоя maxpooling, filter_shape = (2, 2) и stride = (2,2)

Обычно у вас есть 2-3 слоя конв, за которыми следует один слой maxpooling, повторяя эту последовательность, пока вы не уменьшите размеры до чего-тос ним легко работать.

Для ученика вы должны использовать Адама.Требует минимальной настройки.Вы можете использовать скорость обучения 1e-3 или 1e-4 для начала.Вы можете установить импульс равным 0,9.

Для размера мини-пакета, для начала установите значение 16 или 32.

Кроме того, когда вы впервые пытаетесь заставить модель сходиться, выполнитеэто без отсева.Выпадение препятствует сближению.Как только вы убедитесь, что модель работает, добавьте выпадающий список для регуляризации.

...