我冻结了所有Keras层,但在使用fit_generator时模型仍会发生变化

我尝试使用微调方法重新训练模型。为了进行健全性检查,我首先冻结了所有层,然后尝试重新训练。我期望模型不会发生变化;然而,我惊讶地看到了以下结果:

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,因此在不同运行中度量可能会有所不同,因为不同的单元会被关闭。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注