【问题标题】:Keras use part of pretrained models (ResNet 18)Keras 使用部分预训练模型 (ResNet 18)
【发布时间】:2020-09-03 10:04:23
【问题描述】:

我正在使用来自here 的预训练 ResNet18 我想使用第[4]层到[-4]层的部分模型

我尝试使用想要的图层创建一个新模型,例如

res_net = ResNet18((224, 224, 3), weights='imagenet')

model = Model(res_net.layers[4].input, res_net.layers[-4].output)

但是这个错误显示

ValueError: Graph disconnected: cannot get value for tensor Tensor("data_5:0", shape=(None, 224, 224, 3), dtype=float32) at layer “bn_data”。访问以下先前层没有问题: []

也试试这个

res_net = ResNet18((224, 224, 3), weights='imagenet', include_top=False)

x = Input(shape=(192, 640, 6))

conv1 = layers.Conv2D(64, kernel_size=7, strides=2, padding='same', input_shape=(192, 640, 6),name='conv1')(x)

l = res_net.layers[4](conv1) 
for i in range(5, len(res_net.layers[:-4])):
    l = res_net.layers[i](l)

model = Model(inputs=x,outputs=l)
model.summary()

但是这个错误显示

ValueError:应在输入列表上调用合并层。

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    你可能想用

    model = Model(res_net.layers[4].input, res_net.layers[0:-4].output)
    

    另外值得注意的是,不鼓励上述做法。从您的代码来看,我猜您正试图从 resnet18 的最后第四层获取输出。为此,首先定义一个 resnet50 模型,然后创建一个新模型,其输入从 resnet50 模型的输入tapped,输出从 resnet50 的 14 日开始tapped

    from tensorflow.keras.applications.ResNet50 import ResNet50
    from tensorflow.keras.models import Model
    
    base_model = ResNet50(weights='imagenet', include_top=True)
    ResNet14 = Model(inputs = base_model.input,outputs = base_model.get_layer('conv2_block1_0_conv').output)
    

    如果您不确定 resnet50 中所有层的名称或 Keras 中任何预构建模型的名称,您可以使用:

    for layer in base_model.layers:
         print(layer.name)
    

    要获取第 14 层的名称,您可以使用 print(base_model.layers[13].name)

    快乐编码

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 2017-09-22
      • 2021-06-09
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多