【问题标题】:Change input tensor shape for VGG16 application更改 VGG16 应用程序的输入张量形状
【发布时间】:2017-06-13 16:06:08
【问题描述】:

我想将形状为 (160,320,3) 的图像提供给

 VGG16(input_tensor=input_tensor, include_top=False)   

如何包含一个图层,将图像重塑为 VGG16 模型预期的形状,即 (224,224,3)?

【问题讨论】:

    标签: keras keras-layer


    【解决方案1】:

    您可以使用 Opencv 库的 resize() 函数。

     import cv2
        width = int(224)
        height = int(224)
        dim = (width, height)
        '''images contains original dimension image array'''
        resized_images=[]
        for i in range(0,images.shape[0]):
               resized = cv2.resize(images[i], dim, interpolation = cv2.INTER_AREA)
               resized_images.append(resized)
    

    【讨论】:

    • 这种方法人为地增加了计算成本,而对学习能力没有太多或任何好处。据我所知,插值像素不会增加任何值。
    【解决方案2】:

    你需要做两件事:

    1. 通过为图像宽度和高度定义“无”,显式声明输入形状具有可变大小的输入。
    2. 不要使用 flatten(),因为它依赖于固定的输入形状。取而代之的是使用 GlobalMaxPooling,它不仅会进行自适应池化,还会展平输入张量以供 FC 处理。

    我希望这会帮助你实现你想要的。

    【讨论】:

      【解决方案3】:

      VGG16 模型本身只是一组固定层序列和固定卷积核大小等的权重。这并不意味着这些卷积核不能应用于其他大小的图像。

      例如你的情况:

      from keras.models import Model
      from keras.layers import Dense,Flatten
      from keras.applications import vgg16
      from keras import backend as K
      
      model = vgg16.VGG16(weights='imagenet', include_top=False, input_shape=(160,320,3))
      model.summary(line_length=150)
      
      flatten = Flatten()
      new_layer2 = Dense(10, activation='softmax', name='my_dense_2')
      
      inp2 = model.input
      out2 = new_layer2(flatten(model.output))
      
      model2 = Model(inp2, out2)
      model2.summary(line_length=150)
      

      根据here,最小图像尺寸可以是48x48x3,高于此值即可。

      现在确实是在224,224,3 形状的图像上学习了原始权重,但过滤器权重对于使用新图像集的新任务来说是一个很好的起点。您确实需要重新训练网络,但网络会很快收敛。这是迁移学习的基础。

      【讨论】:

      猜你喜欢
      • 2018-12-20
      • 2021-02-16
      • 2023-03-22
      • 2020-02-05
      • 1970-01-01
      • 2019-11-30
      • 2022-01-16
      • 2018-05-12
      • 2018-10-30
      相关资源
      最近更新 更多