2016-11-19 5 views
0

Ich entwickle ein Projekt, in dem ich versuche, die letzte Schicht eines VGG-FACE Modells zu verfeinern. Aber jedes Mal, wenn ich versuche die passende Bühne zu tun, habe ich den gleichen Fehler habe:Keras: Fehler beim Training. Dimension ist nicht, was erwartet wird

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) 

Hier ist der Code, ich verwende:

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

Die ‚vggface_weights_tensorflow.h5‘ ist eine Umwandlung von den Modellgewichten in Theano zu Tensorflow. Ich habe das folgende Skript verwendet, um die Gewichte zu konvertieren:

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

Der Original-Skripte ist von hier:

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

Wenn jemand weiß, wie das Problem zu lösen, werde ich immer dankbar sein.

+0

Wenn ich die Fit-Linie kommentieren, gibt es keinen Fehler..so ich habe angenommen, dass der Fehler da ist. Ich benutze Keras (1.1.1) + Theano (0.9.0.dev4) + Tensorflow (0.10.0rc0) – Patrisr

+0

Der Eingang des Modells ist 'img' mit der Größe' (None, 3, 224, 224) ' , aber du versuchst es mit 'train_data' der Größe' (1576, 4096, 1, 1) 'zu kombinieren. – sygi

+0

Weißt du was // wo ich den Code ändern muss? Ich bin wirklich neu in Keras :( Vielen Dank für Ihre Antwort – Patrisr

Antwort

0

Haben Sie die Größe aller Ihrer Bilder so geändert, dass sie 224 mal 224 sind?

Der Fehler sieht so aus, als erwarte das Modell eine Liste von Bildern beliebiger Größe mit 3 Kanälen (RGB), 224 Breite und 224 Höhe. Es sieht mehr wie die Eingabe Ihrer Daten aus als alles andere mit Keras/dem Code. Versuchen Sie sicherzustellen, dass Ihr Verzeichnis und Ihre Daten so eingerichtet sind, wie es das Modell erwartet.

Verwandte Themen