2016-04-11 41 views
4

VGG-16 Net'i keras ile kullanıyorum. Bu, bu ağın ince ayar yapmak için nasıl kullanılacağıdır ve bu ağ için 224 * 224 olan görüntü boyutunu kullanmalı mıyım? detailVgg16_weights.h5 yüklendiğimde vgg-net nasıl kullanılır?

Bu ağı kullanırken 1000 dersi kullanmalıyım? Ben 1000 sınıfları kullanmak istemiyorsanız, bu hatayı

Exception: Layer shape (4096L, 10L) not compatible with weight shape (4096, 1000).

yardım isteyin neden, teşekkür ederim!

cevap

5

Bir göz atmak isterseniz, ayrıntılı bir yanıtı in this issue gönderdim. Aşağıdaki kod parçasında son tabakanın boyutu ile size yardımcı olacaktır: Eğer özellik çıkarma katmanlarının eğitim ve sadece ince ayar geçen tamamen bağlanmış tabakalar donabilir

from keras.models import Sequential, Graph 
from keras.layers import Convolution2D, ZeroPadding2D, MaxPooling2D 
import keras.backend as K 

img_width, img_height = 128, 128 

# build the VGG16 network with our input_img as input 
first_layer = ZeroPadding2D((1, 1), input_shape=(3, img_width, img_height)) 

model = Sequential() 
model.add(first_layer) 
model.add(Convolution2D(64, 3, 3, activation='relu', name='conv1_1')) 
model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(64, 3, 3, activation='relu', name='conv1_2')) 
model.add(MaxPooling2D((2, 2), strides=(2, 2))) 

model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(128, 3, 3, activation='relu', name='conv2_1')) 
model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(128, 3, 3, activation='relu', name='conv2_2')) 
model.add(MaxPooling2D((2, 2), strides=(2, 2))) 

model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(256, 3, 3, activation='relu', name='conv3_1')) 
model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(256, 3, 3, activation='relu', name='conv3_2')) 
model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(256, 3, 3, activation='relu', name='conv3_3')) 
model.add(MaxPooling2D((2, 2), strides=(2, 2))) 

model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv4_1')) 
model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv4_2')) 
model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv4_3')) 
model.add(MaxPooling2D((2, 2), strides=(2, 2))) 

model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv5_1')) 
model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv5_2')) 
model.add(ZeroPadding2D((1, 1))) 
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv5_3')) 
model.add(MaxPooling2D((2, 2), strides=(2, 2))) 

# get the symbolic outputs of each "key" layer (we gave them unique names). 
layer_dict = dict([(layer.name, layer) for layer in model.layers]) 

# load the weights 

import h5py 

weights_path = 'vgg16_weights.h5' 

f = h5py.File(weights_path) 
for k in range(f.attrs['nb_layers']): 
    if k >= len(model.layers): 
     # we don't look at the last (fully-connected) layers in the savefile 
     break 
    g = f['layer_{}'.format(k)] 
    weights = [g['param_{}'.format(p)] for p in range(g.attrs['nb_params'])] 
    model.layers[k].set_weights(weights) 
f.close() 
print('Model loaded.') 

# Here is what you want: 

graph_m = Graph() 
graph_m.add_input('my_inp', input_shape=(3, img_width, img_height)) 
graph_m.add_node(model, name='your_model', input='my_inp') 
graph_m.add_node(Flatten(), name='Flatten', input='your_model') 
graph_m.add_node(Dense(4096, activation='relu'), name='Dense1',  input='Flatten') 
graph_m.add_node(Dropout(0.5), name='Dropout1', input='Dense1') 
graph_m.add_node(Dense(4096, activation='relu'), name='Dense2', input='Dropout1') 
graph_m.add_node(Dropout(0.5), name='Dropout2', input='Dense2') 
graph_m.add_node(Dense(10, activation='softmax'), name='Final', input='Dropout2') 
graph_m.add_output(name='out1', input='Final') 
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 
graph_m.compile(optimizer=sgd, loss={'out1': 'categorical_crossentropy'}) 

Not. doc'dan, bir katmanın eğitimini dondurmak için trainable = False eklemeniz yeterlidir. Ör dondurulur:

... 
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv5_1', trainable=False)) 
... 

Ör eğitilebilir: Eğer özellik hakkında bilmiyorsanız bir şey olur, böylece

... 
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv5_1',  trainable=True)) 
... 

trainable varsayılan olarak True olduğunu ...

+0

Teşekkür çok !! Your Kodunda, sadece sınıflarımın numarası için son katmanı ayarlaman gerektiği anlamına mı geliyor? ve eğitilebilir ayarladığım tüm katmanlar = False, h5 dosyasındaki ağırlık varsayılanı güncellenemiyor demektir? – sky

+0

Tam olarak, ve ağınız sorununuzu çözmek için çok daha hızlı olacaktır. –

+0

Grafik modeli yerine ikinci bir sıralı model kullanabileceğinizi unutmayın. –