Посмотрев на вывод model.summary()
, вы узнаете, что вызывает эту проблему (т. Е. Какие слои имеют слишком много параметров):
Layer (type) Output Shape Param #
=================================================================
conv2d_189 (Conv2D) (None, 328, 328, 16) 448
_________________________________________________________________
activation_189 (Activation) (None, 328, 328, 16) 0
_________________________________________________________________
conv2d_190 (Conv2D) (None, 326, 326, 16) 2320
_________________________________________________________________
activation_190 (Activation) (None, 326, 326, 16) 0
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 163, 163, 16) 0
_________________________________________________________________
dropout_3 (Dropout) (None, 163, 163, 16) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 425104) 0
_________________________________________________________________
dense_5 (Dense) (None, 128) 54413440
_________________________________________________________________
activation_191 (Activation) (None, 128) 0
_________________________________________________________________
dropout_4 (Dropout) (None, 128) 0
_________________________________________________________________
dense_6 (Dense) (None, 17) 2193
_________________________________________________________________
activation_192 (Activation) (None, 17) 0
=================================================================
Total params: 54,418,401
Trainable params: 54,418,401
Non-trainable params: 0
_________________________________________________________________
Как видите, с момента вывода *Слой 1005 * настолько велик, что слой Dense
будет иметь слишком много параметров: 425104 * 128 + 128 = 54413440
, то есть 54 миллиона параметров только для одного слоя (а это почти 99% всех параметров в модели).Итак, как уменьшить это число?Вам нужно уменьшить выходной размер слоев свертки, используя аргумент stride
(который я не рекомендую) или объединяя слои (желательно после каждого слоя свертки).Давайте добавим еще два пула слоев и еще один слой конвоя (я даже увеличил количество фильтров в слоях конвоя, поскольку мы углубляемся, так как это обычно полезно):
# 1st conv + pooling layer:
model.add(Convolution2D(
nb_filters, (nb_conv, nb_conv),
padding="valid",
input_shape=(img_rows, img_cols, 3),
data_format='channels_last', ))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool), data_format="channels_last"))
# 2nd conv + pooling layer:
model.add(Convolution2D(nb_filters*2, (nb_conv, nb_conv), data_format='channels_last'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool), data_format="channels_last"))
# 3rd conv + pooling layer:
model.add(Convolution2D(nb_filters*2, (nb_conv, nb_conv), data_format='channels_last'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool), data_format="channels_last"))
# the rest is the same...
Вывод сводной модели:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_197 (Conv2D) (None, 328, 328, 16) 448
_________________________________________________________________
activation_203 (Activation) (None, 328, 328, 16) 0
_________________________________________________________________
max_pooling2d_16 (MaxPooling (None, 164, 164, 16) 0
_________________________________________________________________
conv2d_198 (Conv2D) (None, 162, 162, 32) 4640
_________________________________________________________________
activation_204 (Activation) (None, 162, 162, 32) 0
_________________________________________________________________
max_pooling2d_17 (MaxPooling (None, 81, 81, 32) 0
_________________________________________________________________
conv2d_199 (Conv2D) (None, 79, 79, 32) 9248
_________________________________________________________________
activation_205 (Activation) (None, 79, 79, 32) 0
_________________________________________________________________
max_pooling2d_18 (MaxPooling (None, 39, 39, 32) 0
_________________________________________________________________
dropout_9 (Dropout) (None, 39, 39, 32) 0
_________________________________________________________________
flatten_4 (Flatten) (None, 48672) 0
_________________________________________________________________
dense_11 (Dense) (None, 128) 6230144
_________________________________________________________________
activation_206 (Activation) (None, 128) 0
_________________________________________________________________
dropout_10 (Dropout) (None, 128) 0
_________________________________________________________________
dense_12 (Dense) (None, 17) 2193
_________________________________________________________________
activation_207 (Activation) (None, 17) 0
=================================================================
Total params: 6,246,673
Trainable params: 6,246,673
Non-trainable params: 0
_________________________________________________________________
Как видите, теперь он имеет менее 6,5 миллионов параметров, что составляет почти одну девятую часть количества параметров в предыдущей модели.Вы даже можете добавить еще один слой пула, чтобы еще больше сократить количество параметров.Однако имейте в виду, что по мере того, как ваша модель становится глубже (т. Е. Имеет все больше и больше слоев), вам, возможно, придется позаботиться о таких проблемах, как исчезающий градиент и перенастройка .