我尝试使用微调方法重新训练模型。为了进行健全性检查,我首先冻结了所有层,然后尝试重新训练。我期望模型不会发生变化;然而,我惊讶地看到了以下结果:
Epoch 1/5016/16 [==============================] - 25s - loss: 4.0006 - acc: 0.5000 - val_loss: 1.3748e-04 - val_acc: 1.0000Epoch 2/5016/16 [==============================] - 24s - loss: 3.8861 - acc: 0.5000 - val_loss: 1.7333e-04 - val_acc: 1.0000Epoch 3/5016/16 [==============================] - 25s - loss: 3.9560 - acc: 0.5000 - val_loss: 3.0870e-04 - val_acc: 1.0000Epoch 4/5016/16 [==============================] - 26s - loss: 3.9730 - acc: 0.5000 - val_loss: 7.5931e-04 - val_acc: 1.0000Epoch 5/5016/16 [==============================] - 26s - loss: 3.7195 - acc: 0.5000 - val_loss: 0.0021 - val_acc: 1.0000Epoch 6/5016/16 [==============================] - 25s - loss: 3.9514 - acc: 0.5000 - val_loss: 0.0058 - val_acc: 1.0000Epoch 7/5016/16 [==============================] - 26s - loss: 3.9459 - acc: 0.5000 - val_loss: 0.0180 - val_acc: 1.0000Epoch 8/5016/16 [==============================] - 26s - loss: 3.8744 - acc: 0.5000 - val_loss: 0.0489 - val_acc: 1.0000Epoch 9/5016/16 [==============================] - 27s - loss: 3.8914 - acc: 0.5000 - val_loss: 0.1100 - val_acc: 1.0000Epoch 10/5016/16 [==============================] - 26s - loss: 4.0585 - acc: 0.5000 - val_loss: 0.2092 - val_acc: 0.7500Epoch 11/5016/16 [==============================] - 27s - loss: 4.0232 - acc: 0.5000 - val_loss: 0.3425 - val_acc: 0.7500Epoch 12/5016/16 [==============================] - 25s - loss: 3.9073 - acc: 0.5000 - val_loss: 0.4566 - val_acc: 0.7500Epoch 13/5016/16 [==============================] - 27s - loss: 4.1036 - acc: 0.5000 - val_loss: 0.5454 - val_acc: 0.7500Epoch 14/5016/16 [==============================] - 26s - loss: 3.7854 - acc: 0.5000 - val_loss: 0.6213 - val_acc: 0.7500Epoch 15/5016/16 [==============================] - 27s - loss: 3.7907 - acc: 0.5000 - val_loss: 0.7120 - val_acc: 0.7500Epoch 16/5016/16 [==============================] - 27s - loss: 4.0540 - acc: 0.5000 - val_loss: 0.7226 - val_acc: 0.7500Epoch 17/5016/16 [==============================] - 26s - loss: 3.8669 - acc: 0.5000 - val_loss: 0.8032 - val_acc: 0.7500Epoch 18/5016/16 [==============================] - 28s - loss: 3.9834 - acc: 0.5000 - val_loss: 0.9523 - val_acc: 0.7500Epoch 19/5016/16 [==============================] - 27s - loss: 3.9495 - acc: 0.5000 - val_loss: 2.5764 - val_acc: 0.6250Epoch 20/5016/16 [==============================] - 25s - loss: 3.7534 - acc: 0.5000 - val_loss: 3.0939 - val_acc: 0.6250Epoch 21/5016/16 [==============================] - 29s - loss: 3.8447 - acc: 0.5000 - val_loss: 3.0467 - val_acc: 0.6250Epoch 22/5016/16 [==============================] - 28s - loss: 4.0613 - acc: 0.5000 - val_loss: 3.2160 - val_acc: 0.6250Epoch 23/5016/16 [==============================] - 28s - loss: 4.1428 - acc: 0.5000 - val_loss: 3.8793 - val_acc: 0.6250Epoch 24/5016/16 [==============================] - 27s - loss: 3.7868 - acc: 0.5000 - val_loss: 4.1935 - val_acc: 0.6250Epoch 25/5016/16 [==============================] - 28s - loss: 3.8437 - acc: 0.5000 - val_loss: 4.5031 - val_acc: 0.6250Epoch 26/5016/16 [==============================] - 28s - loss: 3.9798 - acc: 0.5000 - val_loss: 4.5121 - val_acc: 0.6250Epoch 27/5016/16 [==============================] - 28s - loss: 3.8727 - acc: 0.5000 - val_loss: 4.5341 - val_acc: 0.6250Epoch 28/5016/16 [==============================] - 28s - loss: 3.8343 - acc: 0.5000 - val_loss: 4.5198 - val_acc: 0.6250Epoch 29/5016/16 [==============================] - 28s - loss: 4.2144 - acc: 0.5000 - val_loss: 4.5341 - val_acc: 0.6250Epoch 30/5016/16 [==============================] - 28s - loss: 3.8348 - acc: 0.5000 - val_loss: 4.5684 - val_acc: 0.6250
这是我使用的代码:
from keras import backend as Kimport inception_v4import numpy as npimport cv2import osimport refrom keras import optimizersfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers import Convolution2D, MaxPooling2D, ZeroPadding2Dfrom keras.layers import Activation, Dropout, Flatten, Dense, Inputfrom keras.models import Modelos.environ['CUDA_VISIBLE_DEVICES'] = '' v4 = inception_v4.create_model(weights='imagenet')#v4.summary()my_batch_size=1train_data_dir ='//shared_directory/projects/try_CDFxx/data/train/'validation_data_dir ='//shared_directory/projects/try_CDFxx/data/validation/'top_model_weights_path= 'bottleneck_fc_model.h5'class_num=2img_width, img_height = 299, 299nbr_train_samples=16nbr_validation_samples=8num_classes=2nb_epoch=50main_input= v4.layers[1].inputmain_output=v4.layers[-1].outputflatten_output= v4.layers[-2].outputBN_model = Model(input=[main_input], output=[main_output, flatten_output])### DEFtrain_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.1, zoom_range=0.1, rotation_range=10., width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True)val_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size = (img_width, img_height), batch_size = my_batch_size, shuffle = True, class_mode = 'categorical')validation_generator = val_datagen.flow_from_directory( validation_data_dir, target_size=(img_width, img_height), batch_size=my_batch_size, shuffle = True, class_mode = 'categorical') # sparse###def save_BN(BN_model): # but we will need to get the get_processed_image into it!!!!# datagen = ImageDataGenerator(rescale=1./255) # here!# generator = datagen.flow_from_directory( train_data_dir, target_size=(img_width, img_height), batch_size=my_batch_size, class_mode='categorical', shuffle=False) nb_train_samples = generator.classes.size bottleneck_features_train = BN_model.predict_generator(generator, nb_train_samples)# np.save(open('bottleneck_flat_features_train.npy', 'wb'), bottleneck_features_train[1]) np.save(open('bottleneck_train_labels.npy', 'wb'), generator.classes) # generator is probably a tuple - and the second thing in it is a label! OKAY, its not :( generator = datagen.flow_from_directory( validation_data_dir, target_size=(img_width, img_height), batch_size=my_batch_size, class_mode='categorical', shuffle=False) nb_validation_samples = generator.classes.size bottleneck_features_validation = BN_model.predict_generator(generator, nb_validation_samples) #bottleneck_features_validation = model.train_generator(generator, nb_validation_samples)# np.save(open('bottleneck_flat_features_validation.npy', 'wb'), bottleneck_features_validation[1]) np.save(open('bottleneck_validation_labels.npy', 'wb'), generator.classes) def train_top_model (): train_data = np.load(open('bottleneck_flat_features_train.npy')) train_labels = np.load(open('bottleneck_train_labels.npy'))# validation_data = np.load(open('bottleneck_flat_features_validation.npy')) validation_labels = np.load(open('bottleneck_validation_labels.npy')) # top_m = Sequential() top_m.add(Dense(class_num,input_shape=train_data.shape[1:], activation='softmax', name='top_dense1')) top_m.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['accuracy'])# top_m.fit(train_data, train_labels, nb_epoch=nb_epoch, batch_size=my_batch_size, validation_data=(validation_data, validation_labels))## #top_m.save_weights (top_model_weights_path)# validation_data[0]# train_data[0] Dense_layer=top_m.layers[-1] top_layer_weights=Dense_layer.get_weights() np.save(open('retrained_top_layer_weight.npy', 'wb'), top_layer_weights)def fine_tune_model (): predictions = Flatten()(v4.layers[-3].output) predictions = Dense(output_dim=num_classes, activation='softmax', name="newDense")(predictions) main_input= v4.layers[1].input main_output=predictions FT_model = Model(input=[main_input], output=[main_output]) top_layer_weights = np.load(open('retrained_top_layer_weight.npy')) Dense_layer=FT_model.layers[-1] Dense_layer.set_weights(top_layer_weights) for layer in FT_model.layers: layer.trainable = False # FT_model.layers[-1].trainable=True FT_model.compile(optimizer=optimizers.SGD(lr=1e-4, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy']) FT_model.fit_generator( train_generator, samples_per_epoch = nbr_train_samples, nb_epoch = nb_epoch, validation_data = validation_generator, nb_val_samples = nbr_validation_samples) ######################################################## ###########save_BN(BN_model)train_top_model()fine_tune_model()
谢谢。
P.S.我使用的是Keras 1版本。
回答:
您使用了dropout
,因此在不同运行中度量可能会有所不同,因为不同的单元会被关闭。