简体   繁体   English

VGG19 Conv4-1层的Keras输出尺寸与模型输出不匹配

[英]Keras Output Dimensions of VGG19 Conv4-1 Layer doesn't match up with model output

import numpy as np
from PIL import Image
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input

To create the VGG19 model I use: 要创建VGG19模型,我使用:

img = Input(shape=(256,256,3))
vgg = VGG19(weights="imagenet")
vgg.outputs = [vgg.get_layer('block4_conv1').output]
model = Model(inputs=img, outputs=vgg(img))

Then in the model.summary() I see that: 然后在model.summary()我看到:

block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160

My expected dimensions are (28,28,512) . 我的预期尺寸是(28,28,512)

To load the image into the network I use: 要将图像加载到网络中,我使用:

img = image.load_img("./path-to-image.jpeg", target_size=(256, 256))
img = preprocess_input(np.array(img))

However, when I put my image through the model, my output dimension is (1, 32, 32, 512) and it makes no sense as to why this happens! 但是,当我将图像放入模型时,我的输出尺寸为(1, 32, 32, 512) ,为什么会发生这种情况毫无意义!

To get output dimensions I run: 为了获得输出尺寸我运行:

img_out = \
    model.predict(
        np.expand_dims(img, 0), 
        batch_size=1
    )

img_out.shape
>>> (1, 32, 32, 512) != (28,28,512)

VGG19 takes input (224, 224, 3) by default. VGG19默认输入(224,224,3)。 If you apply 3 max-pooling layers to it, you will get (28,28, num_kernels). 如果你应用3个最大池层,你将获得(28,28,num_kernels)。

But, your input is (256, 256, 3). 但是,您的输入是(256,256,3)。 So, if you apply 3 max-pooling layers to this, you will end up getting (32, 32, num_kernels). 因此,如果您对此应用3个最大池池,您将最终得到(32,32,num_kernels)。

After 1st max-pool layer - (128, 128, num_kernels) 在第一个最大池层之后 - (128,128,num_kernels)
After 2nd max-pool layer - (64, 64, num_kernels) 在第二个最大池层之后 - (64,64,num_kernels)
After 3rd max-pool layer - (32, 32, num_kernels) 在第3个最大池层之后 - (32,32,num_kernels)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM