我正在尝试为具有不同类的数据集微调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)
如何解决这些错误?更一般地说,我怎么知道哪些类型的层可以附加到卷积模型?
答案 0 :(得分:0)
添加此图层后:
model = Flatten()(pretrained)
您的模型已变得“平坦”并获得了维度[None, X]
- 其中X
是上一层pretrained.output
中包含的神经元总数。
这就是为什么显然在此之后,你不能仅因为模型的形状不是“方形”(例如(None,3,28,20)
)而应用卷积和合并图层。为了使一切运行良好,您需要确定pretrained.output
的输出维度,然后在没有Flatten()
图层的情况下,应用卷积或池的操作以及必要大小的内核等。< / p>