with tutorial learning example espaƱol dense and neural-network theano deep-learning conv-neural-network keras

neural-network - learning - tensorflow tutorial



Cambiando la clasificaciĆ³n de AlexNet pre-entrenamiento en Keras (1)

Estoy usando un AlexNet con pesos pretratados (heuritech / convnets-keras) para un problema de clasificación con 8 clases en lugar de 1000. Después de inicializar la red con Model(input=..,output=..) y cargar los pesos iniciales, I soltar las dos últimas capas, Dense (1000) y Activation (softmax), y agregar mis propias dos capas: Dense (8) y Activation (softmax). Pero luego, después de correr, recibo un error

Error when checking model target: expected softmax to have shape (None, 1000) but got array with shape (32, 8)

El 32 es el tamaño del lote del generador, supongo, pero no entiendo por qué el softmax aún espera 1000 dimensiones de la capa anterior.

¿Alguien me puede ayudar? Creo que tiene algo que ver con el parámetro de salida del Modelo, pero esto es solo una adivinanza semi-salvaje después de probar y buscar en Google. ¡Gracias!

Código:

import ... pp = os.path.dirname(os.path.abspath(__file__)) ##### Define Model ##### inputs = Input(shape=(3,227,227)) conv_1 = Convolution2D(96, 11, 11,subsample=(4,4),activation=''relu'', name=''conv_1'')(inputs) ... ... ... dense_1 = MaxPooling2D((3, 3), strides=(2,2),name="convpool_5")(conv_5) dense_1 = Flatten(name="flatten")(dense_1) dense_1 = Dense(4096, activation=''relu'',name=''dense_1'')(dense_1) dense_2 = Dropout(0.5)(dense_1) dense_2 = Dense(4096, activation=''relu'',name=''dense_2'')(dense_2) dense_3 = Dropout(0.5)(dense_2) dense_3 = Dense(1000,name=''dense_3'')(dense_3) prediction = Activation("softmax",name="softmax")(dense_3) model = Model(input=inputs, output=prediction) for layer in model.layers[:27]: print layer.name layer.trainable = False model.load_weights(pp+"/weights/alexnet_weights.h5") print model.output_shape print model.layers[-1] model.layers.pop() print model.output_shape model.layers.pop() print model.layers[-1] print model.output_shape model.layers.append(Dense(8, activation=''softmax'',name=''dense_4'')) print model.layers[-1] ##### Get Data ##### train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( pp+''/dataset/training'', target_size=(227,227), class_mode=''categorical'') validation_generator = test_datagen.flow_from_directory( pp+''/dataset/test'', target_size=(227,227), class_mode=''categorical'') ##### Compile and Fit #### sgd = SGD(lr=1e-4, decay=1e-6, momentum=0.9, nesterov=True) model.compile(optimizer=sgd, loss=''mse'') model.fit_generator( train_generator, samples_per_epoch=500, nb_epoch=5, validation_data=validation_generator, nb_val_samples=150) model.save_weights(''first_try.h5'')


Ok, parece que no puedo simplemente cambiar la definición de la red, porque incluso después de abrir / colocar nuevas capas, nada parece cambiar. Entonces hice esto:

1) Load the default AlexNet 2) Load the pre-trained weights 3) Pop the 2 top layers 4) Add two new top layers 5) Save the weights 6) Change Network definition to use the two new layers 7) Load the new AlexNet with the saved weights 8) Profit!

Aunque me gustaría saber cómo cambiar una red cargada definida por la API funcional.