我在keras wit tensorflow后端有一个工作的python代码 . 我正在利用VGG16的转学习 . 一切都很好 .
我想使用mxnet后端,但有一些问题:
from keras.preprocessing.image import ImageDataGenerator
from keras import applications
from helper import target_size, batch_size
from math import ceil
import numpy as np
datagen = ImageDataGenerator(rescale=1./255)
加载vgg16模型,不包括顶部完全连接的图层
model = applications.VGG16(include_top=False, weights='imagenet' , input_shape=(224, 224 , 3))
上面的代码(形状(224,224,3))给出:
ValueError:输入必须有3个通道;得到input_shape =(224,224,3)
如果我使用:形状(3,224,24)
'重新定义变量%s'%self.name AssertionError:重新定义变量block1_conv1 / kernel1
如何在工作代码中正确使用mxnet而不是tensorflow后端?
谢谢
注意:keras.json:
{
"epsilon": 1e-07,
"floatx": "float32",
"image_data_format": "channels_first",
"backend": "mxnet"
}
编辑1:
当我从tensorflow将后端更改为mxnet时,keras是否需要为mxnet重新下载vgg16模型?
1 回答
解:
将data_format设置为'channels_last' .
细节:
VGG16 imagenet权重采用'channels_last'格式 . 您应该将keras配置设置为'channels_last'以使其与MXNet后端一起使用 .
我们有一个Github问题,并致力于允许MXNet后端在不同的data_format中加载其他后端训练的权重 . 即,假设你有一个TF后端训练的模型,该模型是用channels_last格式训练的 . 如果您尝试在MXNet后端加载此数据并将data_format设置为'channels_first',则不会发生从channels_last到channels_first的自动转换 .
发行原因:
当使用channels_last格式调用图层以加速时,MXNet后端会转换Conv图层输入和内核 . 并且,这将导致未经过转置的预训练的其他后端模型权重问题 . 我们正在努力修复它并启用该功能 .