2017-07-28 16 views
3

Als Kontext bin ich relativ neu in der Welt des maschinellen Lernens und ich versuche ein Projekt mit dem Ziel, Spiele in einem NBA-Spiel zu klassifizieren. Meine Eingaben sind eine Folge von 40 Bildern von jedem Spiel in einem NBA-Spiel und meine Bezeichnungen sind 11 umfassende Klassifizierungen für ein gegebenes Spiel.Brauche ich vortrainierte Gewichte für Keras VGG16?

Der Plan ist, jede Folge von Frames zu nehmen und jeden Frame in ein CNN zu übergeben, um eine Reihe von Features zu extrahieren. Dann würde jede Abfolge von Merkmalen von einem gegebenen Video auf eine RNN übertragen werden.

Ich verwende derzeit Keras für die meisten meiner Implementierung und ich wählte ein VGG16-Modell für meine CNN. Hier ist ein Teil des entsprechenden Codes unter:

video = keras.Input(shape = (None, 255, 255, 3), name = 'video') 
cnn = keras.applications.VGG16(include_top=False, weights = None, input_shape= 
(255,255,3), pooling = 'avg', classes=11) 
cnn.trainable = True 

Meine Frage ist - wäre es immer noch von Vorteil für mich sein, um die Gewichte der VGG16 ConvNet initialisieren zu ‚IMAGEnet‘, wenn mein Ziel Videoclips von NBA-Spiele zu klassifizieren ist ? Wenn ja warum? Wenn nicht, wie kann ich das VGG16 ConvNet trainieren, um meine eigenen Gewichte zu bekommen, und wie kann ich sie in diese Funktion einfügen? Ich hatte wenig Glück, Tutorials zu finden, bei denen jemand seine eigenen Gewichte bei der Verwendung des VGG16-Modells mit einschloss.

Ich entschuldige mich, wenn meine Fragen naiv erscheinen, aber ich würde wirklich jede Hilfe bei der Klärung zu schätzen wissen.

+0

Betrachten Besuch [Data Wissenschaft SE] (https://datascience.stackexchange.com) oder [Quer Validated] (https://stats.stackexchange.com) für Fragen speziell zum maschinellen Lernen. –

Antwort

5

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) 
Verwandte Themen