2017-04-30 25 views
0

Ich versuche, das VGG16-Modell für ein Dataset mit verschiedenen Klassen anzupassen. Nach this example, habe ich versucht, es so zu tun:Fehler "Modellobjekt hat kein Attribut 'get_shape'" - Feineinstellung von Keras-Modell

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) 

Aber ich habe Probleme mit neuen Schichten auf das Modell. Im Anschluss an die Linie model = pretrained.output, ich habe jede der folgenden Zeilen versucht (einen nach dem anderen):

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) 

Für die ersten beiden Zeilen, die ich versuchte, bekam ich den Fehler

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

Als ich jeden versuchte von den letzten drei Zeilen, jedes Mal, wenn ich einen Fehler bezüglich der Größe der Ebene, z die Linie model = Convolution2D(32, 3, 3)(model) gab mir:

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

Wie behebe ich diese Fehler? Und ganz allgemein: Woher weiß ich, welche Arten von Layern ich an ein Faltungsmodell anhängen kann?

Antwort

0

Nachdem Sie diese Schicht hinzugefügt haben:

model = Flatten()(pretrained) 

Ihr Modell „flach“ geworden und hat eine Dimension [None, X] erworben - wo X die Gesamtzahl der Neuronen, die pretrained.output in der vorherigen Schicht enthalten sind.

Aus diesem Grund können Sie Convolution- und Pooling-Layer natürlich nicht anwenden, nur weil die Form Ihres Modells nicht "quadratisch" ist (wie zB (None,3,28,20)). Damit alles gut funktioniert, müssen Sie die Ausgabedimension pretrained.output bestimmen und dann ohne die Ebene Flatten() die Operationen Convolution oder Pooling mit den erforderlichen Kernel-Größen anwenden und so weiter.

Verwandte Themen