2016-11-19 53 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 /代码的任何输入。试着确保你的目录和数据按照模型的设定进行设置?