【问题标题】:Fine tuning resnet unfrozen layers in keras微调 keras 中的 resnet 解冻层
【发布时间】:2021-06-08 14:32:31
【问题描述】:

我正在使用 resnet 来训练我的数据。我已经冻结了大部分层,只对最后 4 层进行了训练。我想更改最后四层维度,使其与我的输入维度和通道匹配。因为我是新手,所以我不知道该怎么做。我尝试谷歌搜索但找不到解决方案

base_model = tf.keras.applications.ResNet50(
    include_top=False,
    weights="imagenet",
    input_tensor=3,
    input_shape=(150,150),
    pooling=None,  
)
for layer in base_model.layers[:46]:
    layer.trainable = False

【问题讨论】:

  • 你的意思是最后一层的维度应该和你的输入维度匹配??
  • 我的意思是我的输入图像的维度与图像 resnet 的训练维度不同。而且我只使用最后几层。所以这些层的维度也不同还是我错了?。
  • 您无需担心,只需加载预训练的权重,解冻最后四层,然后使用您的自定义输入训练/微调模型。
  • 神经网络只能使用与训练时相同的输入大小,因此您必须在将图像作为输入输入神经网络进行预测之前对图像进行预处理。您可以使用tf.keras.applications.resnet.preprocess_input here 对图像进行预处理,然后将其用作网络的输入。

标签: python tensorflow keras resnet


【解决方案1】:

如果你想改变最后一层的架构,你应该得到所需中间层的输出并将它连接到你的。

我假设你想在第 46 层之后更改架构。

首先定义预训练模型:

base_model = tf.keras.applications.ResNet50(
    include_top=False,
    weights="imagenet",
    input_shape=(150,150,3), 
)
for layer in base_model.layers[:46]:
    layer.trainable = False

然后,获取您想要的中间层的名称(在本例中为第 46 层):

print(base_model.layers[46].name)

对我来说,输出是conv3_block1_3_conv

然后得到这个层的输出,连接到你自己的层:

last_layer = base_model.get_layer('conv3_block1_3_conv') #get the layer
last_output = last_layer.output                          #get the layer output
x = tf.keras.layers.Flatten()(last_output)               #flatten the output
x = tf.keras.layers.Dense(1024, activation='relu')(x)    #add your own layers
x = tf.keras.layers.Dense(1, activation='sigmoid')(x)    #add your own output
model = tf.keras.Model(base_model.input, x)              #create the new model

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多