CNN предсказывает один и тот же класс для всех входных данных - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь воссоздать CNN в Керасе, чтобы классифицировать данные облака точек.CNN описан в этой статье.

Проектирование сети Image of

Это моя текущая реализация:

inputs = Input(shape=(None, 3))

x = Conv1D(filters=64, kernel_size=1, activation='relu')(inputs)
x = BatchNormalization()(x)
x = Conv1D(filters=64, kernel_size=1, activation='relu')(x)
x = BatchNormalization()(x)

y = Conv1D(filters=64, kernel_size=1, activation='relu')(x)
y = BatchNormalization()(y)
y = Conv1D(filters=128, kernel_size=1, activation='relu')(y)
y = BatchNormalization()(y)
y = Conv1D(filters=2048, kernel_size=1, activation='relu')(y)
y = MaxPooling1D(1)(y)

z = keras.layers.concatenate([x, y], axis=2)
z = Conv1D(filters=512, kernel_size=1, activation='relu')(z)
z = BatchNormalization()(z)
z = Conv1D(filters=512, kernel_size=1, activation='relu')(z)
z = BatchNormalization()(z)
z = Conv1D(filters=512, kernel_size=1, activation='relu')(z)
z = BatchNormalization()(z)
z = Dense(9, activation='softmax')(z)

model = Model(inputs=inputs, outputs=z)

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

Проблема в том, что сеть предсказывает один и тот же класс для всехвходные данные.Это может быть вызвано ошибкой в ​​моей реализации сети, переоснащением или недостаточным обучением.Может ли кто-нибудь заметить ошибку в моей реализации?

Yousefhussien, M., Kelbe, DJ, Ientilucci, EJ, & Salvaggio, C. (2017).Полностью сверточная сеть для семантической маркировки трехмерных облаков точек.Препринт arXiv arXiv: 1710.01408.

Ответы [ 3 ]

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

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

Кроме того, я не думаю, что

x = Conv1D(filters=64, kernel_size=1, activation='relu')(inputs)
x = BatchNormalization()(x)

- это то же самое, что

x = Conv1D(filters=64, kernel_size=1)(inputs)
x = BatchNormalization()(x)
x = ReLU(x)

, и я думаю, что вам нужно последнее.

Вам также стоит попробовать LeakyReLU , поскольку он обычно дает лучшие результаты, чем обычный ReLU.

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

Сеть исправлена, поскольку теперь она обеспечивает ожидаемые прогнозы.Спасибо за помощь!

На основании ответов я изменил следующие вещи:

  • Порядок активации и нормализации партии.
  • Последний слой изот плотного до сверточного слоя.

Я также добавил параметр training=True в слой нормализации партии

Код правильной реализации:

inputs = Input(shape=(None, 3))

x = Conv1D(filters=64, kernel_size=1, input_shape=(None, 4))(inputs)
x = BatchNormalization()(x, training=True)
x = Activation('relu')(x)
x = Conv1D(filters=64, kernel_size=1, use_bias=False)(x)
x = BatchNormalization()(x, training=True)
x = Activation('relu')(x)

y = Conv1D(filters=64, kernel_size=1)(x)
y = BatchNormalization()(y, training=True)
y = Activation('relu')(y)
y = Conv1D(filters=128, kernel_size=1)(y)
y = BatchNormalization()(y, training=True)
y = Activation('relu')(y)
y = Conv1D(filters=2048, kernel_size=1)(y)
y = BatchNormalization()(y, training=True)
y = Activation('relu')(y)
y = MaxPooling1D(1)(y)

z = keras.layers.concatenate([x, y], axis=2)
z = Conv1D(filters=512, kernel_size=1)(z)
z = BatchNormalization()(z, training=True)
z = Activation('relu')(z)
z = Conv1D(filters=512, kernel_size=1)(z)
z = BatchNormalization()(z, training=True)
z = Activation('relu')(z)
z = Conv1D(filters=512, kernel_size=1)(z)
z = BatchNormalization()(z, training=True)
z = Activation('relu')(z)
z = Conv1D(filters=2, kernel_size=1, activation='softmax')(z)

model = Model(inputs=inputs, outputs=z)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
0 голосов
/ 14 октября 2018

Один и тот же выходной класс обычно указывает на только что инициализированную сеть, что означает, что тренировочные веса не загружены.Произошло ли то же самое во время тренировок?Другой причиной может быть плохая предварительная обработка.Еще одна вещь, которую я заметил, заключается в том, что в статье говорится «1D-полностью сверточная сеть».Ваш плотный слой свернут в бумаге.

...