修改 resnet 模型中的图层

Posted

技术标签:

【中文标题】修改 resnet 模型中的图层【英文标题】:Modify layers in resnet model 【发布时间】:2018-10-12 15:29:31 【问题描述】:

我正在尝试为图像分类问题训练 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】:

快速解答(似乎比在模型中添加功能更好)

使用此处描述的预处理功能: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)

【讨论】:

以上是关于修改 resnet 模型中的图层的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 中,如何获取与模型中包含的“模型”对象关联的图层名称?

什么是层模型?

是否可以保存经过训练的图层以在 Keras 上使用图层?

Pytorch修改ResNet模型全连接层进行直接训练

QGIS里的编程模型

CSS层模型