如何使用预训练模型但没有权重的模型架构

问题描述

我想使用resnet模型架构,并希望更改最后几层;如何仅使用Tensorflow中的模型动物园中的模型架构?

解决方法

要使用ResNet模型,您可以从tensorflow.keras.applications中选择少数几个,包括ResNet50ResNet101ResNet152。然后,如果要进行转移学习,则需要更改一些默认参数。对于您的问题,您需要将weights参数设置为等于None。否则,将提供'imagenet'权重。另外,您需要将include_top设置为False,因为问题的类别数量可能与ImageNet不同。最后,您将需要在input_shape中提供数据的形状。看起来像这样。

base = tf.keras.applications.ResNet50(include_top=False,weights=None,input_shape=shape)

要获取模型摘要,您可以

base.summary()

要添加自己的头像,可以使用功能性API。您将需要添加一个Input图层和一个自己的Dense图层,以与您的任务相对应。这可能是

input = tf.keras.layers.Input(shape=shape)
base = base(input)
out = tf.keras.layers.Dense(num_classes,activation='softmax')(base)

最后,您可以构建模型

model = tf.keras.models.Model(input,out)

Model构造函数带有2个参数。第一个是模型的输入,第二个是输出。请注意,调用model.summary()将把ResNet基础显示为单独的层。要查看ResNet基础的所有层,可以执行model.layers[1].summary(),也可以修改有关如何构建模型的代码。第二种方式是

out = tf.keras.layers.Dense(num_classes,activation='softmax')(base.output)
model = tf.keras.models.Model(base.input,out)

现在您可以仅使用model.summary()来查看所有图层。