2016-11-19 54 views
0

我正在開發一個項目,我試圖微調VGG-FACE模型的最後一層。 但每次當我嘗試做裝修階段我已經得到了同樣的錯誤:Keras:培訓錯誤。尺寸不是預期的

Traceback (most recent call last): 
    File "freeze_2.py", line 258, in <module> 
    model=entrenamos_modelo('vggface_weights_tensorflow.h5') 
    File "freeze_2.py", line 168, in entrenamos_modelo 
    model2.fit(train_data,label, nb_epoch=nb_epoch, batch_size=64) 

    File "/imatge/psereno/workspace/venv-tfg/local/lib/python2.7/site-packages/keras/engine/training.py", line 1057, in fit 
    batch_size=batch_size) 

    File "/imatge/psereno/workspace/venv-tfg/local/lib/python2.7/site-packages/keras/engine/training.py", line 984, in _standardize_user_data 
    exception_prefix='model input') 

    File "/imatge/psereno/workspace/venv-tfg/local/lib/python2.7/site-packages/keras/engine/training.py", line 111, in standardize_input_data 
    str(array.shape)) 

Exception: Error when checking model input: expected input_2 to have shape (None, 3, 224, 224) but got array with shape (1576, 4096, 1, 1) 

這裏是我使用的代碼:

from keras.models import Model 
from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dropout, Activation 
from keras.models import Sequential 
from keras.layers.core import Flatten, Dense, Dropout 
from keras.optimizers import SGD 
from keras.layers import merge 
from keras.models import Merge 
import cv2, numpy as np 
from PIL import Image 
from keras.preprocessing.image import ImageDataGenerator 

'''OJOOOOO: PARA QUE FUNCIONE BIEN: 
nano ~/.keras/keras.json 
{ 
"image_dim_ordering": "th", 
"epsilon": 1e-07, 
"floatx": "float32", 
"backend": "tensorflow" 
} 
''' 

def bottleneck(): 
    datagen = ImageDataGenerator(rescale=1.) 
    generator = datagen.flow_from_directory(train_data_dir, 
             target_size=(img_width, img_height), 
             batch_size=32, 
             class_mode=None, 
             shuffle=False) 

    pad1_1 = ZeroPadding2D(padding=(1, 1), name='in_train')(img) 
    conv1_1 = Convolution2D(64, 3, 3, activation='relu', name='conv1_1')(pad1_1) 
    pad1_2 = ZeroPadding2D(padding=(1, 1))(conv1_1) 
    conv1_2 = Convolution2D(64, 3, 3, activation='relu', name='conv1_2')(pad1_2) 
    pool1 = MaxPooling2D((2, 2), strides=(2, 2))(conv1_2) 

    pad2_1 = ZeroPadding2D((1, 1), trainable=False)(pool1) 
    conv2_1 = Convolution2D(128, 3, 3, activation='relu', name='conv2_1')(pad2_1) 
    pad2_2 = ZeroPadding2D((1, 1), trainable=False)(conv2_1) 
    conv2_2 = Convolution2D(128, 3, 3, activation='relu', name='conv2_2')(pad2_2) 
    pool2 = MaxPooling2D((2, 2), strides=(2, 2), trainable=False)(conv2_2) 

    pad3_1 = ZeroPadding2D((1, 1))(pool2) 
    conv3_1 = Convolution2D(256, 3, 3, activation='relu', name='conv3_1')(pad3_1) 
    pad3_2 = ZeroPadding2D((1, 1))(conv3_1) 
    conv3_2 = Convolution2D(256, 3, 3, activation='relu', name='conv3_2')(pad3_2) 
    pad3_3 = ZeroPadding2D((1, 1))(conv3_2) 
    conv3_3 = Convolution2D(256, 3, 3, activation='relu', name='conv3_3')(pad3_3) 
    pool3 = MaxPooling2D((2, 2), strides=(2, 2), trainable=False)(conv3_3) 

    pad4_1 = ZeroPadding2D((1, 1))(pool3) 
    conv4_1 = Convolution2D(512, 3, 3, activation='relu', name='conv4_1')(pad4_1) 
    pad4_2 = ZeroPadding2D((1, 1))(conv4_1) 
    conv4_2 = Convolution2D(512, 3, 3, activation='relu', name='conv4_2')(pad4_2) 
    pad4_3 = ZeroPadding2D((1, 1))(conv4_2) 
    conv4_3 = Convolution2D(512, 3, 3, activation='relu', name='conv4_3')(pad4_3) 
    pool4 = MaxPooling2D((2, 2), strides=(2, 2))(conv4_3) 

    pad5_1 = ZeroPadding2D((1, 1))(pool4) 
    conv5_1 = Convolution2D(512, 3, 3, activation='relu', name='conv5_1')(pad5_1) 
    pad5_2 = ZeroPadding2D((1, 1))(conv5_1) 
    conv5_2 = Convolution2D(512, 3, 3, activation='relu', name='conv5_2') (pad5_2) 
    pad5_3 = ZeroPadding2D((1, 1))(conv5_2) 
    conv5_3 = Convolution2D(512, 3, 3, activation='relu', name='conv5_3')(pad5_3) 
    pool5 = MaxPooling2D((2, 2), strides=(2, 2))(conv5_3) 
    fc6 = Convolution2D(4096, 7, 7, activation='relu', name='fc6')(pool5) 
    fc6_drop = Dropout(0.5)(fc6) 

    model = Model(input=img, output=fc6_drop) 
    bottleneck_features_train = model.predict_generator(generator, nb_train_samples) 
    np.save(open('features.npy', 'w'), bottleneck_features_train) 


def entrenamos_modelo(weights_path=None): 

    train_data = np.load(open('features.npy')) 
    print(train_data.shape) 

    train_labels = np.array(
    [0] * (nb_train_samples/8) + [1] * (nb_train_samples/8) + [2] * (nb_train_samples/8) + [3] * (
     nb_train_samples/8) + [4] * (nb_train_samples/8) + [5] * (nb_train_samples/8) + [6] * (
     nb_train_samples/8) + [7] * (nb_train_samples/8)) 

    lbl1 = np.array([[1, 0, 0, 0, 0, 0, 0, 0], ] * 197) 
    lbl2 = np.array([[0, 1, 0, 0, 0, 0, 0, 0], ] * 197) 
    lbl3 = np.array([[0, 0, 1, 0, 0, 0, 0, 0], ] * 197) 
    lbl4 = np.array([[0, 0, 0, 1, 0, 0, 0, 0], ] * 197) 
    lbl5 = np.array([[0, 0, 0, 0, 1, 0, 0, 0], ] * 197) 
    lbl6 = np.array([[0, 0, 0, 0, 0, 1, 0, 0], ] * 197) 
    lbl7 = np.array([[0, 0, 0, 0, 0, 0, 1, 0], ] * 197) 
    lbl8 = np.array([[0, 0, 0, 0, 0, 0, 0, 1], ] * 197) 
    label = np.concatenate([lbl1, lbl2, lbl3, lbl4, lbl5, lbl6, lbl7, lbl8]) 
    '''train_labels --> loss='sparse_categorical_crossentropy' 
     labels --> loss='categorical_crossentropy' 
    ''' 

    #MODEL VGG (the old model) 
    pad1_1 = ZeroPadding2D(padding=(1, 1), trainable=False, input_shape=(4096, 1, 1), name='in_train')(img) 
    conv1_1 = Convolution2D(64, 3, 3, activation='relu', name='conv1_1', trainable=False)(pad1_1) 
    pad1_2 = ZeroPadding2D(padding=(1, 1), trainable=False)(conv1_1) 
    conv1_2 = Convolution2D(64, 3, 3, activation='relu', name='conv1_2', trainable=False)(pad1_2) 
    pool1 = MaxPooling2D((2, 2), strides=(2, 2), trainable=False)(conv1_2) 

    pad2_1 = ZeroPadding2D((1, 1), trainable=False)(pool1) 
    conv2_1 = Convolution2D(128, 3, 3, activation='relu', name='conv2_1', trainable=False)(pad2_1) 
    pad2_2 = ZeroPadding2D((1, 1), trainable=False)(conv2_1) 
    conv2_2 = Convolution2D(128, 3, 3, activation='relu', name='conv2_2', trainable=False)(pad2_2) 
    pool2 = MaxPooling2D((2, 2), strides=(2, 2), trainable=False)(conv2_2) 

    pad3_1 = ZeroPadding2D((1, 1), trainable=False)(pool2) 
    conv3_1 = Convolution2D(256, 3, 3, activation='relu', name='conv3_1', trainable=False)(pad3_1) 
    pad3_2 = ZeroPadding2D((1, 1), trainable=False)(conv3_1) 
    conv3_2 = Convolution2D(256, 3, 3, activation='relu', name='conv3_2', trainable=False)(pad3_2) 
    pad3_3 = ZeroPadding2D((1, 1), trainable=False)(conv3_2) 
    conv3_3 = Convolution2D(256, 3, 3, activation='relu', name='conv3_3', trainable=False)(pad3_3) 
    pool3 = MaxPooling2D((2, 2), strides=(2, 2), trainable=False)(conv3_3) 

    pad4_1 = ZeroPadding2D((1, 1), trainable=False)(pool3) 
    conv4_1 = Convolution2D(512, 3, 3, activation='relu', name='conv4_1', trainable=False)(pad4_1) 
    pad4_2 = ZeroPadding2D((1, 1), trainable=False)(conv4_1) 
    conv4_2 = Convolution2D(512, 3, 3, activation='relu', name='conv4_2', trainable=False)(pad4_2) 
    pad4_3 = ZeroPadding2D((1, 1), trainable=False)(conv4_2) 
    conv4_3 = Convolution2D(512, 3, 3, activation='relu', name='conv4_3', trainable=False)(pad4_3) 
    pool4 = MaxPooling2D((2, 2), strides=(2, 2) , trainable=False)(conv4_3) 

    pad5_1 = ZeroPadding2D((1, 1) , trainable=False)(pool4) 
    conv5_1 = Convolution2D(512, 3, 3, activation='relu', name='conv5_1', trainable=False)(pad5_1) 
    pad5_2 = ZeroPadding2D((1, 1), trainable=False)(conv5_1) 
    conv5_2 = Convolution2D(512, 3, 3, activation='relu', name='conv5_2', trainable=False)(pad5_2) 
    pad5_3 = ZeroPadding2D((1, 1), trainable=False)(conv5_2) 
    conv5_3 = Convolution2D(512, 3, 3, activation='relu', name='conv5_3', trainable=False)(pad5_3) 
    pool5 = MaxPooling2D((2, 2), strides=(2, 2), trainable=False)(conv5_3) 

    fc6 = Convolution2D(4096, 7, 7, activation='relu', name='fc6', trainable=False)(pool5) 
    fc6_drop = Dropout(0.5)(fc6) 

    #We TRAIN this layer 
    fc7 = Convolution2D(4096, 1, 1, activation='relu', name='fc7', trainable=False)(fc6_drop) 
    fc7_drop = Dropout(0.5)(fc7) 
    fc8 = Convolution2D(2622, 1, 1, name='fc8', trainable=False)(fc7_drop) 
    flat = Flatten()(fc8) 
    out = Activation('softmax')(flat) 
    model = Model(input=img, output=out) 

    #We load the weight of the old model so when we construct ours we dont have to retrain all of it. 
    if weights_path: 
     model.load_weights(weights_path) 

    # We construct our new model: first 14 layers of the old + two new ones. The new FC has to be trained and the Softmax layer too. 
    fc7_n = Convolution2D(4096, 1, 1, activation='relu', name='fc7_n', trainable=True, input_shape=train_data.shape[1:])(fc6_drop) 
    fc7_drop_n = Dropout(0.5)(fc7_n) 
    fc8_n = Convolution2D(8, 1, 1, name='fc8_n', trainable=False)(fc7_drop_n) 
    flat_n = Flatten(name='flat_n')(fc8_n) 
    out_n = Activation('softmax')(flat_n) 
    model2 = Model(input=img, output=out_n) 
    #model2.summary() 


    sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 
    model2.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy']) 

    '''train_labels --> loss='sparse_categorical_crossentropy' 
     labels --> loss='categorical_crossentropy' 
    ''' 

    model2.fit(train_data,label, nb_epoch=nb_epoch, batch_size=64) 
    print('Model Trained') 

    #We save the weights so we can load them in our model 
    model2.save_weights(pesos_entrenados) # always save your weights after training or during training 

    #We have two options: 1) Return the model here or in the vgg_trained_model Function 
    return model2 



if __name__ == "__main__": 
    im = Image.open('A.J._Buckley.jpg') 
    im = im.resize((224, 224)) 
    im = np.array(im).astype(np.float32) 
    im = im.transpose((2, 0, 1)) 
    im = np.expand_dims(im, axis=0) 

    # For the training stage 
    img_width, img_height = 224, 224 
    img = Input(shape=(3, img_height, img_width)) 
    train_data_dir = 'merge/train' 
    pesos_entrenados='Modelo_Reentrenado.h5' 
    # validation_data_dir = 'data/validation' 
    nb_train_samples = 1576 # 197 per class and we have 8 classes (8 emotions) 
    nb_validation_samples = 0 
    nb_epoch = 20 


    # Stages to construct the model 
    bottleneck() #Reduce the computational cost 
    model=entrenamos_modelo('vggface_weights_tensorflow.h5') #Construction of the model 

    #model.summary() 

    out = model.predict(im) 
    print(out[0][0]) 

的「vggface_weights_tensorflow.h5」是一個轉換從theano的模型權重到tensorflow。我用下面的腳本的權重轉換:

model = Model(input=img, output=out) 
weights_path = 'vgg-face-keras.h5' 
model.load_weights(weights_path) 
ops = [] 

for layer in model.layers: 
    if layer.__class__.__name__ in ['Convolution1D', 'Convolution2D', 'Convolution3D', 'AtrousConvolution2D']: 
     original_w = K.get_value(layer.W) 
     converted_w = convert_kernel(original_w) 
     ops.append(tf.assign(layer.W, converted_w).op) 
K.get_session().run(ops) 
model.save_weights('vggface_weights_tensorflow.h5') 

原始腳本是從這裏:

https://gist.github.com/EncodeTS/6bbe8cb8bebad7a672f0d872561782d9

如果有人知道如何解決這個問題,我將永遠感激。

+0

如果我評論適合線沒有錯誤..所以我認爲錯誤在那裏。 我使用的是Keras(1.1.1)+ Theano(0.9.0.dev4)+ Tensorflow(0.10.0rc0) – Patrisr

+0

該模型的輸入是'img',其大小爲'(None,3,224,224)' ,但是你可以用'(1576,4096,1,1)'''train_data'來適應它。 – sygi

+0

你知道//我需要在代碼中改變什麼嗎?我真的很新奇:( 謝謝你的回答 – Patrisr

回答

0

您是否調整過所有圖像的大小,使其爲224 224?

錯誤看起來像模型期望的任何大小的圖像列表,3通道(RGB),224寬和224高度。它看起來更像是你的數據輸入,而不是Keras /代碼的任何輸入。試着確保你的目錄和數據按照模型的設定進行設置?