Sollten Sie VGG16 für Ihre spezifische Aufgabe umschulen? Absolut nicht! Die Umschulung eines so großen Netzwerks ist schwierig und erfordert viel Intuition und Wissen beim Training tiefer Netzwerke. Lassen Sie uns analysieren, warum Sie die Gewichte verwenden können, vortrainiert auf IMAGEnet, für Ihre Aufgabe:
IMAGEnet ist eine riesige Datenmenge, von Millionen von Bildern enthalten. VGG16 selbst wurde in 3-4 Tagen auf einer leistungsfähigen GPU trainiert. Auf CPU (vorausgesetzt, Sie haben keine GPU, die so leistungsfähig wie NVIDIA GeForce Titan X ist) würde Wochen dauern.
ImageNet enthält Bilder aus realen Szenen. NBA-Spiele können auch als reale Szenen betrachtet werden. Es ist also sehr wahrscheinlich, dass Vorkenntnisse in ImageNet-Funktionen auch für NBA-Spiele verwendet werden können.
Eigentlich müssen Sie nicht alle Faltungsschichten des vortrainierten VGG16 verwenden. Schauen wir uns die visualization of internal VGG16 layers einen Blick und sehen, was sie detect (von this article genommen, das Bild zu groß ist, so dass ich nur einen Link für Kompaktheit):
- Die ersten und zweiten Faltungsblöcke betrachtet die Low- Level-Funktionen, wie beispielsweise Ecken, Kanten etc.
- der dritten und vierten Faltungsblöcke an Oberflächenmerkmalen sieht, Kurven, Kreisen usw.
- Die fünfte Schicht auf hohem Niveau, sieht kennzeichnet
so können Sie entscheiden, welche Art von Funktionen von Vorteil sein wird für Ihre spezifische Aufgabe. Brauchen Sie High-Level-Funktionen im 5. Block? Oder möchten Sie Mid-Level-Funktionen des 3. Blocks verwenden? Vielleicht möchten Sie ein weiteres neuronales Netzwerk über die unteren Schichten von VGG stapeln? Sehen Sie sich für weitere Anleitungen das folgende Tutorial an, das ich geschrieben habe; Es war einmal auf SO-Dokumentation.
Übertragung Lernen und Feinabstimmung mit VGG und Keras
In diesem Beispiel werden drei kurze und umfassende Unter Beispiele werden vorgestellt:
- Ladungsgewichte von verfügbaren vortrainiert Modellen enthalten mit Keras Bibliothek
- ein weiteres Netzwerk für die Ausbildung an der Spitze aller Schichten von VGG Stapel
- Einsetzen einer Schicht in der Mitte der anderen Schichten
- Tipps und allgemeine Regel-of-Daumen für die Feinabstimmung und die Übertragung mit VGG
Lernen
Laden vortrainiert Gewichte
Pre- trainiert auf IMAGEnet Modelle, einschließlich VGG-16 und VGG-19, sind in Keras. Hier und nachher wird in diesem Beispiel VGG-16 verwendet. Für weitere Informationen besuchen Sie bitte Keras Applications documentation.
from keras import applications
# This will load the whole VGG16 network, including the top Dense layers.
# Note: by specifying the shape of top layers, input tensor shape is forced
# to be (224, 224, 3), therefore you can use it only on 224x224 images.
vgg_model = applications.VGG16(weights='imagenet', include_top=True)
# If you are only interested in convolution filters. Note that by not
# specifying the shape of top layers, the input tensor shape is (None, None, 3),
# so you can use them for any size of images.
vgg_model = applications.VGG16(weights='imagenet', include_top=False)
# If you want to specify input tensor
from keras.layers import Input
input_tensor = Input(shape=(160, 160, 3))
vgg_model = applications.VGG16(weights='imagenet',
include_top=False,
input_tensor=input_tensor)
# To see the models' architecture and layer names, run the following
vgg_model.summary()
Erstellen Sie ein neues Netzwerk mit unteren Schichten von VGG genommen
dass für Bilder mit der Größe für einige spezifische Aufgabe Angenommen (160, 160, 3)
Sie vortrainiert unteren Schichten von VGG verwenden möchten, bis mit dem Namen block2_pool
zu schichten.
vgg_model = applications.VGG16(weights='imagenet',
include_top=False,
input_shape=(160, 160, 3))
# Creating dictionary that maps layer names to the layers
layer_dict = dict([(layer.name, layer) for layer in vgg_model.layers])
# Getting output tensor of the last VGG layer that we want to include
x = layer_dict['block2_pool'].output
# Stacking a new simple convolutional network on top of it
x = Conv2D(filters=64, kernel_size=(3, 3), activation='relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(10, activation='softmax')(x)
# Creating new model. Please note that this is NOT a Sequential() model.
from keras.models import Model
custom_model = Model(input=vgg_model.input, output=x)
# Make sure that the pre-trained bottom layers are not trainable
for layer in custom_model.layers[:7]:
layer.trainable = False
# Do not forget to compile it
custom_model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
mehr Schichten entfernen und einen neuen in der Mitte
einfügen Angenommen, Sie VGG16 beschleunigen müssen von block1_conv1
und block2_conv2
mit einer einzigen Faltungsschicht, so ersetzen, dass die Vortrainierte Gewichte werden gespeichert. Die Idee besteht darin, das gesamte Netzwerk in separate Schichten zu zerlegen und dann wieder zusammenzusetzen. Hier ist der Code speziell für Ihre Aufgabe:
vgg_model = applications.VGG16(include_top=True, weights='imagenet')
# Disassemble layers
layers = [l for l in vgg_model.layers]
# Defining new convolutional layer.
# Important: the number of filters should be the same!
# Note: the receiptive field of two 3x3 convolutions is 5x5.
new_conv = Conv2D(filters=64,
kernel_size=(5, 5),
name='new_conv',
padding='same')(layers[0].output)
# Now stack everything back
# Note: If you are going to fine tune the model, do not forget to
# mark other layers as un-trainable
x = new_conv
for i in range(3, len(layers)):
layers[i].trainable = False
x = layers[i](x)
# Final touch
result_model = Model(input=layer[0].input, output=x)
Betrachten Besuch [Data Wissenschaft SE] (https://datascience.stackexchange.com) oder [Quer Validated] (https://stats.stackexchange.com) für Fragen speziell zum maschinellen Lernen. –