VGG16在R与Python中输入形状不匹配,如何解决?
问题:Keras Python项目迁移R语言时VGG16输入形状不匹配
问题描述
将基于Keras的Python项目迁移到R语言时,遇到输入形状不匹配问题:R中VGG16模型的输入形状为(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)
使用aperm转换维度的代码:
test = aperm(reshaped_img, c(1,4,2,3))
报错:
Error: Default MaxPoolingOp only supports NHWC on device type CPU
指定input_shape参数(失败)
加载模型时使用input_shape参数,因形状不匹配导致模型无法加载。
代码及模型结构
R代码
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 _________________________________________________________________
内容的提问来源于stack exchange,提问作者TheArmbreaker
相关产品推荐
相关产品推荐

