更改VGG16应用程序的输入张量形状

时间:2017-01-27 21:10:48

标签: keras keras-layer

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

 VGG16(input_tensor=input_tensor, include_top=False)   

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

3 个答案:

答案 0 :(得分:12)

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形状图像上学习的,但过滤器权重对于具有新图像集的新任务来说是非常好的起点。您确实需要重新训练网络,但网络会很快收敛。这是转学的基础。

答案 1 :(得分:0)

您需要做两件事:

  1. 通过为图像宽度和高度定义“无”,明确声明输入形状具有可变大小的输入。
  2. Donot使用flatten(),因为它依赖于固定的输入形状。而是使用GlobalMaxPooling,它不仅可以进行自适应池化,还可以平滑FC的输入张量。
  3. 我希望这能帮助你实现你的目标。

答案 2 :(得分:0)

您可以使用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)