Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keras 更改VGG16应用程序的输入张量形状_Keras_Keras Layer - Fatal编程技术网

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

Keras 更改VGG16应用程序的输入张量形状,keras,keras-layer,Keras,Keras Layer,我想将形状(160320,3)的图像馈送到 我怎样才能包括一个将图像重塑为VGG16模型所期望的形状的层,即(224,3)?VGG16模型本身只是固定层序列和固定卷积内核大小等的一组权重。这并不意味着这些卷积内核不能应用于其他大小的图像 例如,在您的案例中: from keras.models import Model from keras.layers import Dense,Flatten from keras.applications import vgg16 from keras im

我想将形状(160320,3)的图像馈送到


我怎样才能包括一个将图像重塑为VGG16模型所期望的形状的层,即(224,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)
根据最小图像大小可以是
48x48x3
以上任何值都可以


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

您需要做两件事:

  • 通过为图像宽度和高度定义None,显式声明输入形状具有可变大小的输入
  • 不要使用flatte(),因为它依赖于固定的输入形状。相反,使用GlobalMapooling,它不仅可以进行自适应池,还可以使FC处理的输入张量平坦化
  • 我希望这将帮助您实现您想要的。

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

    这种方法人为地增加了计算成本,但对学习能力没有太多或任何好处。据我所知,插值像素不会增加任何值。
     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)