Python 试图重建VGG16的参数太多
所以我尝试使用VGG16架构和imagenet权重在keras中进行一些迁移学习。我想对最后两层进行随机权重和偏差训练,所以我使用Python 试图重建VGG16的参数太多,python,keras,computer-vision,conv-neural-network,Python,Keras,Computer Vision,Conv Neural Network,所以我尝试使用VGG16架构和imagenet权重在keras中进行一些迁移学习。我想对最后两层进行随机权重和偏差训练,所以我使用model.pop()来消除它们,并手动添加最后两层。调用model.summary()时,除了最后一块卷积层(我添加的)中的参数数量从230万个增加到5100万个之外,它看起来完全一样。我不确定是什么导致了参数的大幅增加?有人能给我解释一下吗?这会导致我的计算机在运行时耗尽资源(我假设ram,因为我只有16GB)。下面是我用来构建模型的代码 def build_mo
model.pop()
来消除它们,并手动添加最后两层。调用model.summary()
时,除了最后一块卷积层(我添加的)中的参数数量从230万个增加到5100万个之外,它看起来完全一样。我不确定是什么导致了参数的大幅增加?有人能给我解释一下吗?这会导致我的计算机在运行时耗尽资源(我假设ram,因为我只有16GB)。下面是我用来构建模型的代码
def build_model():
model = VGG16(weights='imagenet',include_top=True)
model.input
model.summary()
for l in model.layers:
l.trainable =False
model.layers.pop()
model.layers.pop()
model.layers.pop()
model.layers.pop()
model.layers.pop()
model.layers.pop()
model.layers.pop()
model.layers.pop()
orig = model.input
new_model = Conv2D(512,(14,14),activation='relu',padding='same',name='conv1')(model.get_layer('block4_pool').output)
new_model = Conv2D(512,(14,14),activation='relu',padding='same',name='conv2')(new_model)
new_model =Conv2D(512,(14,14),activation='relu',padding='same',name='conv3')(new_model)
new_model =MaxPooling2D((2,2),name='pool')(new_model)
new_model =Flatten(name='flatten')(new_model)
new_model =Dense(4096,activation='relu',name='fc1')(new_model)
new_model =Dense(1024,activation='relu',name='fc2')(new_model)
new_model =Dense(512,activation='relu',name='fc3')(new_model)
new_model =Dense(2,activation='softmax',name='output')(new_model)
model = Model(orig,new_model)
model.summary()
return model
我当时很忙,忘了把model.summary()
的输出放进去。
这是原始VGG16的摘要:
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) (None, 224, 224, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
_________________________________________________________________
block2_conv1 (Conv2D) (None, 112, 112, 128) 73856
_________________________________________________________________
block2_conv2 (Conv2D) (None, 112, 112, 128) 147584
_________________________________________________________________
block2_pool (MaxPooling2D) (None, 56, 56, 128) 0
_________________________________________________________________
block3_conv1 (Conv2D) (None, 56, 56, 256) 295168
_________________________________________________________________
block3_conv2 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
block3_conv3 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
block3_pool (MaxPooling2D) (None, 28, 28, 256) 0
_________________________________________________________________
block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160
_________________________________________________________________
block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (None, 14, 14, 512) 0
_________________________________________________________________
block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 7, 7, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
fc1 (Dense) (None, 4096) 102764544
_________________________________________________________________
fc2 (Dense) (None, 4096) 16781312
_________________________________________________________________
predictions (Dense) (None, 1000) 4097000
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
_________________________________________________________________
This is the output for the modified network:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) (None, 224, 224, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
_________________________________________________________________
block2_conv1 (Conv2D) (None, 112, 112, 128) 73856
_________________________________________________________________
block2_conv2 (Conv2D) (None, 112, 112, 128) 147584
_________________________________________________________________
block2_pool (MaxPooling2D) (None, 56, 56, 128) 0
_________________________________________________________________
block3_conv1 (Conv2D) (None, 56, 56, 256) 295168
_________________________________________________________________
block3_conv2 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
block3_conv3 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
block3_pool (MaxPooling2D) (None, 28, 28, 256) 0
_________________________________________________________________
block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160
_________________________________________________________________
block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (None, 14, 14, 512) 0
_________________________________________________________________
conv1 (Conv2D) (None, 14, 14, 512) 51380736
_________________________________________________________________
conv2 (Conv2D) (None, 14, 14, 512) 51380736
_________________________________________________________________
conv3 (Conv2D) (None, 14, 14, 512) 51380736
_________________________________________________________________
pool (MaxPooling2D) (None, 7, 7, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
fc1 (Dense) (None, 4096) 102764544
_________________________________________________________________
fc2 (Dense) (None, 1024) 4195328
_________________________________________________________________
fc3 (Dense) (None, 512) 524800
_________________________________________________________________
output (Dense) (None, 2) 1026
=================================================================
Total params: 269,263,170
Trainable params: 261,627,906
Non-trainable params: 7,635,264
_________________________________________________________________
model.summary()将准确地告诉您每个层有多少个参数,这就是您问题的答案。我刚刚添加了model.summary()的输出。我不确定是什么原因导致Conv2D参数从VGG16模型增加到最后3个Conv2D层(我与Keras一起添加的那些层)。除了参数的数量外,总结看起来是一样的。VGG使用3x3过滤器,而您的过滤器是14x14。啊,非常感谢