CNN Отрицательное количество параметров - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь построить модель CNN с керасом. Когда я добавляю два блока Conv3D и MaxPooling, все нормально. Однако после добавления третьего блока (как показано в коде) количество обучаемых параметров приобретает отрицательное значение. Есть идеи, как это может произойти?

model = keras.models.Sequential()

# # # First Block
model.add(Conv2D(filters=16, kernel_size=(5, 5), padding='valid', input_shape=(157, 462, 14), activation = 'tanh' ))
model.add(MaxPooling2D( (2,2) ))

# # # Second Block     
model.add(Conv2D(filters=32, kernel_size=(5, 5), padding='valid', activation = 'tanh'))
model.add(MaxPooling2D( (2, 2) ))

# # # Third Block   
model.add(Conv2D(filters=64, kernel_size=(5, 5), padding='valid', activation = 'tanh'))
model.add(MaxPooling2D( (2, 2) ))

model.add(Flatten())
model.add(Dense(157 * 462))
model.compile(loss='mean_squared_error',
              optimizer=keras.optimizers.Adamax(),
               metrics=['mean_absolute_error'])

print(model.summary())

Результат этого кода следующий:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 153, 458, 16)      5616      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 76, 229, 16)       0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 72, 225, 32)       12832     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 36, 112, 32)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 32, 108, 64)       51264     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 16, 54, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 55296)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 72534)             -284054698
=================================================================
Total params: -283,984,986
Trainable params: -283,984,986
Non-trainable params: 0
_________________________________________________________________
None

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Да, конечно, ваш слой Dense имеет весовую матрицу размера 55296 x 72534, которая содержит 4010840064 числа, то есть 4010 миллионов параметров.

Где-то в коде Keras число параметров равнохранится как int32, и это означает, что есть предел для того, какие числа он может хранить, а именно 2^32 - 1 = 2147483647, и теперь вы можете видеть, что ваши 4010 миллионов параметров больше, чем 2^32 - 1, так что число переходит в отрицательную сторонуцелое число.

Я бы порекомендовал не делать модель с таким большим количеством параметров, вы не смогли бы тренировать ее в любом случае без огромного объема ОЗУ.

0 голосов
/ 05 июля 2019

Проблема в том, что вы запускаете свой код в CPU, из-за чего серверная часть keras tenorflow или theano могут работать правильно. Мне удалось отлично запустить ваш код с помощью графического процессора в Google Colab, и это то, что я получил

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 153, 458, 16)      5616      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 76, 229, 16)       0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 72, 225, 32)       12832     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 36, 112, 32)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 32, 108, 64)       51264     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 16, 54, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 55296)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 72534)             4010912598
=================================================================
Total params: 4,010,982,310
Trainable params: 4,010,982,310
Non-trainable params: 0

Я рекомендую вам использовать GPU для обучения такой огромной сети.

Надеюсь, это поможет!

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