Do I need a preliminary weight for the Keras VGG16?

As a context, I'm relatively new to the world of machine learning, and I'm trying to create a project to classify games in an NBA game. My inputs are a sequence of 40 frames from each game in an NBA game, and my shortcuts are 11 comprehensive classifications for this play.

The plan is to take each frame sequence and transfer each frame to CNN to retrieve a set of functions. Then, each sequence of features from this video will be transmitted to the RNN.

I am currently using Keras for most of my implementation, and I decided to use the VGG16 model for my CNN. Here are some of the relevant code below:

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

My question is: would it still be useful for me to initialize the VGG16 ConvNet scales for “imagenet” if my goal is to classify video clips of NBA games? If so, why? If not, how can I train VGG16 ConvNet to get my own set of weights, and then how can I insert them into this function? I was not lucky to find any tutorials in which someone included their own set of weights when using the VGG16 model.

I apologize if my questions seem naive, but I would really appreciate any help in resolving it.

+4
source share
1 answer

VGG16 ? ! . , , ImageNet, :

  • ImageNet - , . VGG16 3-4 . ( , GPU , NVIDIA GeForce Titan X), .

  • ImageNet . . , , ImageNet NBA.

VGG16. VGG16 , ( , , ):

  • , , ..
  • , , ..

, , . 5- ? ? , VGG? . , ; - SO .


VGG Keras

-:

  • , Keras
  • VGG
  • VGG

ImageNet, VGG-16 VGG-19, Keras. VGG-16. Keras Applications.

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()

, VGG

, (160, 160, 3) VGG, block2_pool.

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'])

, VGG16, block1_conv1 block2_conv2 , . , , . , :

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)
+6

Source: https://habr.com/ru/post/1682539/


All Articles