VGG16 - R和Python的形状不同.如何处理呢?



我正在尝试将带有Keras的Python项目翻译为r。然而,我偶然发现了一个奇怪的形状问题。下面你可以看到VGG16模型,R为(None,3,224,224), Python为(None, 224,224,3)。我能做些什么呢?

我试图简单地将尺寸切换到R形状,但这给出了MaxPooling

的错误ShapeError

ValueError: Input 0 of layer "vgg16" is incompatible with the layer: expected shape=(None, 3, 224, 224), found shape=(None, 224, 224, 3)

尝试(不工作,因为MaxPoolingShape NHWC)

test = aperm(reshaped_img, c(1,4,2,3))
--> "Error: Default MaxPoolingOp only supports NHWC on device type CPU"

Input_shape (not worked)

在加载模型时使用input_shape参数会阻止模型加载,因为形状不匹配。文档

<<p>R代码/strong>
model <- application_vgg16(weights="imagenet", include_top=TRUE)
summary(model)

给我:

Model: "vgg16"
________________________________________________________________________________
Layer (type)                       Output Shape                    Param #     
================================================================================
input_3 (InputLayer)               [(None, 3, 224, 224)]           0           
block1_conv1 (Conv2D)              (None, 64, 224, 224)            1792        
block1_conv2 (Conv2D)              (None, 64, 224, 224)            36928       
block1_pool (MaxPooling2D)         (None, 64, 112, 112)            0           
block2_conv1 (Conv2D)              (None, 128, 112, 112)           73856       
block2_conv2 (Conv2D)              (None, 128, 112, 112)           147584      
block2_pool (MaxPooling2D)         (None, 128, 56, 56)             0           
block3_conv1 (Conv2D)              (None, 256, 56, 56)             295168      
block3_conv2 (Conv2D)              (None, 256, 56, 56)             590080      
block3_conv3 (Conv2D)              (None, 256, 56, 56)             590080      
block3_pool (MaxPooling2D)         (None, 256, 28, 28)             0           
block4_conv1 (Conv2D)              (None, 512, 28, 28)             1180160     
block4_conv2 (Conv2D)              (None, 512, 28, 28)             2359808     
block4_conv3 (Conv2D)              (None, 512, 28, 28)             2359808     
block4_pool (MaxPooling2D)         (None, 512, 14, 14)             0           
block5_conv1 (Conv2D)              (None, 512, 14, 14)             2359808     
block5_conv2 (Conv2D)              (None, 512, 14, 14)             2359808     
block5_conv3 (Conv2D)              (None, 512, 14, 14)             2359808     
block5_pool (MaxPooling2D)         (None, 512, 7, 7)               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
________________________________________________________________________________
Python


model = VGG16()
model = Model(inputs=model.inputs, outputs=model.output)

给我:

Model: "model_1"
_________________________________________________________________
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
_________________________________________________________________

我仍然不知道这些洗牌的输入层是如何存在的。然而,我发现在我的本地机器上没有发生这种情况。打乱层发生在Amazon SageMaker Notebook实例上。

我在这里张贴了截图:

Stackoverflow在Imagenet Layer上的例子

最新更新