Keras 修改ResNet50输出层以进行回归

Keras 修改ResNet50输出层以进行回归,keras,keras-layer,resnet,Keras,Keras Layer,Resnet,我正在尝试为回归问题创建一个ResNet50模型,其输出值范围为-1到1 我省略了classes参数,在预处理步骤中,我将图像的大小调整为224,3 我尝试使用 def create_resnet(load_pretrained=False): if load_pretrained: weights = 'imagenet' else: weights = None # Get base model base_model = ResNet50(wei

我正在尝试为回归问题创建一个ResNet50模型,其输出值范围为-1到1

我省略了classes参数,在预处理步骤中,我将图像的大小调整为224,3

我尝试使用

def create_resnet(load_pretrained=False):
  if load_pretrained:
        weights = 'imagenet'
  else:
      weights = None

  # Get base model
  base_model = ResNet50(weights=weights)

  optimizer = Adam(lr=1e-3)
  base_model.compile(loss='mse', optimizer=optimizer)

  return base_model
然后创建模型,打印摘要并使用fit_生成器进行培训

   history = model.fit_generator(batch_generator(X_train, y_train, 100, 1),
                                  steps_per_epoch=300, 
                                  epochs=10,
                                  validation_data=batch_generator(X_valid, y_valid, 100, 0),
                                  validation_steps=200,
                                  verbose=1,
                                  shuffle = 1)
我得到一个错误,虽然它说

ValueError: Error when checking target: expected fc1000 to have shape (1000,) but got array with shape (1,)
查看模型摘要,这是有意义的,因为最终致密层的输出形状为(无,1000)

但我不知道如何修改模型。我已经阅读了Keras文档并查看了几个示例,但我看到的几乎都是针对分类模型的


如何修改模型,使其正确格式化以进行回归?

您的代码抛出了错误,因为您使用的是原始完全连接的顶层,该顶层经过培训,可将图像分类为1000个类中的一个。要使网络正常工作,您需要用自己的顶层替换该顶层,该顶层的形状应与数据集和任务兼容

下面是一个小片段,我使用它创建了一个ImageNet预训练模型,用于使用Keras进行回归任务(面部地标预测):

NUM_OF_LANDMARKS=136
def创建_模型(输入_形状,top='flatte'):
如果顶部不在(‘展平’、‘平均’、‘最大’):
raise VALUERROR('意外的顶层类型:%s'%top]
#将基础模型与新“头”连接
瓶颈层={
“展平”:展平(),
“avg”:GlobalAvgPooling2D(),
“max”:GlobalMapooling2D()
}[顶部]
基本=接收resnetv2(输入形状=输入形状,
include_top=False,
权重(='imagenet')
x=瓶颈层(基本输出)
x=密集(地标数量,激活='线性')(x)
模型=模型(输入=基本输入,输出=x)
回归模型
在您的情况下,我想您只需要将
InceptionResNetV2
替换为
ResNet50
。基本上,您正在创建一个没有顶层的预训练模型:

base=ResNet50(input\u shape=input\u shape,include\u top=False)
然后将自定义图层附着到其上:

x=flatte()(base.output)
x=密集(地标数量,激活='sigmoid')(x)
模型=模型(输入=基本输入,输出=x)
就这样

您还可以从Keras存储库中进行检查,该存储库显示如何在内部构造
ResNet50
。我相信它会给你一些关于图层和替换的见解


另外,如果我们讨论微调预先训练好的ImageNet模型,我想说回归和分类任务没有那么大的不同。任务的类型主要取决于您的损失函数和顶层的激活函数。否则,您仍然有一个具有
N
输出的完全连接层,但它们的解释方式不同

fc1000 (Dense)                  (None, 1000)         2049000     avg_pool[0][0]