Python 参数的负数

Python 参数的负数,python,tensorflow,keras,conv-neural-network,Python,Tensorflow,Keras,Conv Neural Network,我正试图用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

我正试图用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

是的,当然,您的
密集
层有一个大小为
55296 x 72534
的权重矩阵,其中包含4010840064个数字,即401000000个参数

在Keras代码的某个地方,参数的数量被存储为int32,这意味着它可以存储的数量是有限制的,即
2^32-1=2147483647
,现在您可以看到,您的40.1亿个参数大于
2^32-1
,因此该数字溢出到整数的负端


我建议不要制作一个参数如此之多的模型,没有大量的RAM,你无论如何都无法训练它。

问题在于你在CPU中运行代码,keras tensorflow或theano的后端可以正常工作。我能够在谷歌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来训练如此庞大的网络


希望这有帮助

如果你的原始输入阵列(你的图像)是什么尺寸?你在CPU中运行吗?原始输入阵列是(157x462x13)我在CPU中运行。GPU内存不足,无法执行。更多CONV和更多池,直到您的图像大小足够小,可以用少于55k的功能展平。它们可能只会减少网络。这个尺寸很不寻常。谢谢你们,伙计们,谢谢你们的支持。我现在明白问题所在了。