Потери Keras не меняются - проверка активации и открытых тем - PullRequest
0 голосов
/ 08 февраля 2019

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

### Define architecture.
model.add(Conv2D(32, 4, strides=(11,11),padding="same",input_shape=(200,200,3), activation="relu"))

model.add(Dropout(0.2))

model.add(BatchNormalization())

model.add(Conv2D(64, 4, strides=(9,9),padding="same", activation="relu"))

model.add(Dropout(0.2))

model.add(BatchNormalization())

model.add(Conv2D(128, 4, strides=(5,5),padding="same", activation="relu"))

model.add(Dropout(0.2))

model.add(BatchNormalization())

model.add(GlobalMaxPooling2D())

model.add(Dense(128, activation="relu"))

model.add(Dense(y_test.shape[1], activation="sigmoid"))

model.summary()

sgd = optimizers.SGD(lr=0.1,) #0.1
model.compile(loss='categorical_crossentropy', optimizer='sgd', 
              metrics=['accuracy'])


model1 = model.fit(x_train, y_train,batch_size=32, epochs=10, verbose=1)

Epoch 1/10
420/420 [==============================] - 5s 11ms/step - loss: 1.4598 - acc: 0.2381

Epoch 2/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4679 - acc: 0.2333

Epoch 3/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4335 - acc: 0.2667

Epoch 4/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4198 - acc: 0.2310

Epoch 5/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4038 - acc: 0.2524

Epoch 6/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4343 - acc: 0.2643

Epoch 7/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4281 - acc: 0.2786

Epoch 8/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4097 - acc: 0.2333

Epoch 9/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4071 - acc: 0.2714

Epoch 10/10
420/420 [==============================] - 1s 3ms/step - loss: 1.4135 - acc: 0.2476


Что-то не так с моей моделью?Я попытался изменить lr, размер картинок, попытался упростить модель, изменил размер ядра, позволил ему работать на большее количество эпох (до 60) и напечатал прогноз для x_test.Прогноз казался неверным, а также:

error = model.predict(x_test)

print(error)

[[0.49998534 0.49998534 0.4999715  0.50000155]

 [0.49998188 0.49998283 0.49997032 0.5000029 ]

 [0.49998188 0.4999858  0.49998164 0.5000036 ]

 [0.4999795  0.49998736 0.4999841  0.5000008 ]

 [0.49998784 0.49997187 0.49996948 0.5000013 ]

 [0.49997532 0.49997967 0.49997616 0.50000024]

Любая помощь очень ценится!Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Пожалуйста, попробуйте следующую настройку:

  • Уменьшите шаг до 1 * 1 или 2 * 2 или максимум 3 * 3
  • Удалите выпадения между сверточными слоями, используйтевыпадение только перед плотными слоями, если необходимо
  • Попробуйте добавить объединяющие слои, предпочтительно с шагами 2 * 2 и размером ядра 2 * 2 после сверточных слоев.
  • Измените оптимизацию на adam / nadam
  • Используйте softmax вместо сигмоида
  • Увеличьте количество эпох, слишком мало 10.

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

0 голосов
/ 08 февраля 2019

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

ваш model.summary() показывает проблему:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 19, 19, 32)        1568      
_________________________________________________________________
dropout_1 (Dropout)          (None, 19, 19, 32)        0         
_________________________________________________________________
batch_normalization_1 (Batch (None, 19, 19, 32)        128       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 3, 3, 64)          32832     
_________________________________________________________________
dropout_2 (Dropout)          (None, 3, 3, 64)          0         
_________________________________________________________________
batch_normalization_2 (Batch (None, 3, 3, 64)          256       
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 1, 1, 128)         131200    
_________________________________________________________________
dropout_3 (Dropout)          (None, 1, 1, 128)         0         
_________________________________________________________________
batch_normalization_3 (Batch (None, 1, 1, 128)         512       
_________________________________________________________________
global_max_pooling2d_1 (Glob (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               16512     
_________________________________________________________________
dense_2 (Dense)              (None, 4)                 516       
=================================================================
Total params: 183,524
Trainable params: 183,076
Non-trainable params: 448

то, что вы видите, - это мгновенное уменьшение размера тензора с 200 на исходном изображении до 19 после первой свертки и до 3 после второй.мы ожидаем гораздо более постепенного уменьшения размера, чтобы реально использовать преимущество сверточных слоев.

, если вы сохраните свой код как есть и измените все шаги на (2, 2), вы получите гораздо большеразумная структура:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 100, 100, 32)      1568      
_________________________________________________________________
dropout_1 (Dropout)          (None, 100, 100, 32)      0         
_________________________________________________________________
batch_normalization_1 (Batch (None, 100, 100, 32)      128       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 50, 50, 64)        32832     
_________________________________________________________________
dropout_2 (Dropout)          (None, 50, 50, 64)        0         
_________________________________________________________________
batch_normalization_2 (Batch (None, 50, 50, 64)        256       
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 25, 25, 128)       131200    
_________________________________________________________________
dropout_3 (Dropout)          (None, 25, 25, 128)       0         
_________________________________________________________________
batch_normalization_3 (Batch (None, 25, 25, 128)       512       
_________________________________________________________________
global_max_pooling2d_1 (Glob (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               16512     
_________________________________________________________________
dense_2 (Dense)              (None, 4)                 516       
=================================================================
Total params: 183,524
Trainable params: 183,076
Non-trainable params: 448
_________________________________________________________________
0 голосов
/ 08 февраля 2019

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

  • Поскольку вы используете категорическую кроссентропию, вы можете попробовать «softmax» в качестве функции активации вместо «sigmoid» впоследний слой.
  • Вы должны уменьшить скорость обучения.(С новыми настройками, предложенными здесь)
  • Вы можете попробовать использовать другой оптимизатор, такой как 'adam' вместо 'sgd'.
  • Вы можете удалить выпадающие и пакетные слои нормализации и добавлять их только еслиони необходимы.
  • Увеличьте размер ядра [2x2] вместо 1. Возможно, измените размер ядра с 4 на (3x3).Также уменьшите размер шагов, возможно, вы можете начать с (1,1).Использование ядра с размером 4 на изображении с размером [200x200] с шагами (11,11) почти равно обучению «ничему».

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

...