Переоснащение, перетренированность или неправильная архитектура - PullRequest
0 голосов
/ 20 января 2019

У меня есть 6 * 32 массива, скажем, технологических данных, которые выглядят как «лучи», соединяют локальные максимумы некоторых или всех шести рядов и идут под некоторым углом вверх ногами:

1:     100 (102) 97  98 127 120 121
2:      88  87  (91) 90  88  88  88
3:     101 100  101 100 101 100 100
4:      99  97   97  98 (99) 98  97
5: ...
6: ...

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

model = keras.Sequential([
    keras.layers.BatchNormalization(input_shape=( 6, 32, 1)),

    keras.layers.Conv2D(filters=32, kernel_size=2, activation='tanh', padding="same"),
    keras.layers.Conv2D(filters=32, kernel_size=2, activation='tanh', padding="same"),
    keras.layers.MaxPooling2D(2),
    keras.layers.Conv2D(filters=16, kernel_size=3, activation='tanh', padding="same"),
    keras.layers.Conv2D(filters=16, kernel_size=3, activation='tanh', padding="same"),
    keras.layers.MaxPooling2D(2),
    keras.layers.Conv2D(filters=8, kernel_size=4, activation='tanh', padding="same"),
    keras.layers.Conv2D(filters=8, kernel_size=4, activation='tanh', padding="same"),

    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(8096, activation=tf.nn.tanh),
    keras.layers.Dropout(0.6),
    keras.layers.Dense(8096, activation=tf.nn.relu),
    keras.layers.Dropout(0.6),

    keras.layers.Dense(1, activation=tf.nn.sigmoid)
    ])

Компиляция:

model.compile(optimizer=keras.optimizers.RMSprop(), 
          loss='binary_crossentropy',
          metrics=['accuracy'])

Тренировка:

model.fit(train_data, train_labels, epochs=200, batch_size=128)

На тренировке он теряет ~ 0.1667 точность ~ 0.9480 При тестовой точноститолько 61%.

1 Ответ

0 голосов
/ 20 января 2019

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

Прежде всего (и, как правило, вы всегда должны это делать), добавьтерегуляризация размера весов путем добавления к каждому из следующих аргументов следующего аргумента:

kernel_regularizer=keras.regularizers.l2(w_reg)

Таким образом, каждый из ваших слоев должен выглядеть следующим образом:

keras.layers.Conv2D(filters=32,
                    kernel_size=2,
                    activation='tanh',
                    padding="same",
                    kernel_regularizer=keras.regularizers.l2(w_reg))

ДополнительноНаблюдения:

Я думаю, что ваша модель слишком широка для размера вашего ввода , поэтому ей очень легко запомнить тренировочные данные и наряд.Вы используете плотные слои с 8096 нейронами для ввода 192 переменных и одного выхода.На мой взгляд, это излишнее , и вы должны уменьшить размер до нескольких сотен нейронов.Если я ошибаюсь, вы увидите, что ваша точность обучения не достигает более 90-х, и вы всегда можете добавить обратно нейроны.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...