错误"模型对象没有属性' get_shape'" - 微调Keras模型

时间:2017-04-30 20:31:55

标签: tensorflow keras convolution

我正在尝试为具有不同类的数据集微调VGG16模型。在this example之后,我尝试这样做:

from keras.applications.vgg16 import VGG16
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K

pretrained = VGG16(include_top=False, weights='imagenet')
model = pretrained.output

# Add new layers here

model = Model(inputs=pretrained.input, outputs=model)

但是,我在向模型中添加新图层时遇到了问题。在model = pretrained.output行之后,我尝试了以下每一行(一次一行):

model = Flatten()(pretrained)

model = MaxPooling2D((2,2), strides=(2,2))(pretrained)

model = Dense(1024, activation='relu')(model)

model = Convolution2D(32, 3, 3)(model)  

model = GlobalAveragePooling2D()(x)

对于我试过的前两行,我收到了错误

AttributeError: 'Model' object has no attribute 'get_shape'    

当我尝试最后三行中的每一行时,每次出现与图层大小相关的错误时,例如model = Convolution2D(32, 3, 3)(model)行给了我:

Error when checking target: expected conv2d_1 to have 4 dimensions, but got array with shape (38, 100) 

如何解决这些错误?更一般地说,我怎么知道哪些类型的层可以附加到卷积模型?

1 个答案:

答案 0 :(得分:0)

添加此图层后:

model = Flatten()(pretrained)

您的模型已变得“平坦”并获得了维度[None, X] - 其中X是上一层pretrained.output中包含的神经元总数。

这就是为什么显然在此之后,你不能仅因为模型的形状不是“方形”(例如(None,3,28,20))而应用卷积和合并图层。为了使一切运行良好,您需要确定pretrained.output的输出维度,然后在没有Flatten()图层的情况下,应用卷积或池的操作以及必要大小的内核等。< / p>