修改resnet模型中的图层

时间:2018-05-02 13:37:09

标签: keras resnet

我正在尝试训练resnet50模型用于图像分类问题。在我对数据集进行训练之前,我已经加载了预训练的'imagenet'权重。我想在输入层和第一个卷积层之间插入一个图层(平均减法图层)。

model = ResNet50(weights='imagenet')
def mean_subtract(img):
    img = T.set_subtensor(img[:,0,:,:],img[:,0,:,:] - 123.68)
    img = T.set_subtensor(img[:,1,:,:],img[:,1,:,:] - 116.779)
    img = T.set_subtensor(img[:,2,:,:],img[:,2,:,:] - 103.939)

    return img / 255.0

我想在输入图层旁边插入inputs = Lambda(mean_subtract, name='mean_subtraction')(inputs)并将其连接到resnet模型的第一个卷积层,而不会丢失保存的权重。

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:1)

快速回答(似乎比将功能添加到模型更好)

使用此处所述的预处理功能:preprocessing images generated using keras function ImageDataGenerator() to train resnet50 model

答案很长

由于您的功能不会改变形状,您可以将其放在外部模型中而无需更改Resnet模型(更改模型可能不那么简单,如果需要,我总是尝试使用其他模型的零件安装新模型)。

resnet_model = ResNet50(weights='imagenet')

inputs = Input((None,None,3)) 
    #it seems you're using (3,None,None) instead.    
    #choose based on your "data_format", which by default is channels_last 

outputs = Lambda(mean_subtract,output_shape=not_necessary_with_tensorflow)(inputs)
outputs = resnet_model(outputs)

model = Model(inputs, outputs)