[英]CNN Negative Number of Parameters
我正在尝试使用keras构建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
是的,当然,您的Dense
图层的权重矩阵大小为55296 x 72534
,其中包含4010840064数字,即401,000万个参数。
在Keras代码中的某个地方,参数数量存储为int32,这意味着它可以存储的数量是有限制的,即2^32 - 1 = 2147483647
,现在您可以看到,您的401,000万个参数更大大于2^32 - 1
,因此数字溢出到整数的负数侧。
我建议您不要建立具有如此大量参数的模型,否则,如果没有大量的RAM,您将无法进行训练。
问题是因为您正在CPU中运行代码,因此keras tensorflow或theano的后端可以正常工作。 我能够在Google colab中使用GPU完美地运行您的代码,这就是我得到的
_________________________________________________________________
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来训练如此庞大的网络。
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.