我冻结了所有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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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