错误1:采用 model.save() 和 load_model()的方法得到的模型,在做冻结操作时候会发生权重错误。
因此,采用 [ 结构保存(model.to_json()) + 权值保存(model.save_weights) ],在做冻结操作时候就不会发生权重错误。
二、查看可训练(trainable)和不可训练(non_trainable)的权值方法:
一、抽取某层输出
文档:
https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer
二、微调模型
1 、主模型固定不训练
inputs = Input(shape=(784,)) x = Dense(100,activation='relu')(inputs) outputs = Dense(10,activation='softmax')(x) model_main = Model(input = inputs,output=outputs) model_main.load_weights('my_model_weights.h5') # ———— fine-tune模型 inputs1 = Input(shape=(100,)) # 由于取出上面model_main中的'dense_1'层输出为100维。 x = Dense(100,activation='relu')(inputs1) outputs1 = Dense(10,activation='softmax')(x) model = Model(inputs1,outputs1) model.summary() # ■■■■■■■■ [3]模型编译 ■■■■■■■■ # 定义优化器 sgd = SGD(lr=0.2) # 编译,loss function,训练过程中计算准确率 model.compile(optimizer = sgd, loss = 'mse', metrics=['accuracy'], ) # ■■■■■■■■ [4]训练模型 ■■■■■■■■ # model.fit(x_train,y_train,batch_size=64,epochs=1) # 主模型训练用这个 model.fit(x_train_Dense, y_train,batch_size=64, epochs=1) # fine-tune模型用这个 # ■■■■■■■■ [5]评估模型 ■■■■■■■■ # loss,accuracy = model.evaluate(x_test,y_test) # print('\ntest loss',loss) # print('accuracy',accuracy) # # 保存参数,载入参数 # model.save_weights('my_model_weights.h5') # model.load_weights('my_model_weights.h5') K.clear_session()
2、连同主模型一起微调
# —————— 主模型 —————— inputs = Input(shape=(784,)) x = Dense(100,activation='relu',name='dense_100')(inputs) outputs = Dense(10,activation='softmax')(x) model_main = Model(input = inputs,output=outputs) model_main.load_weights('my_model_weights.h5') # ———— (fine-tune构建)提取'dense_1'层的输出 —————— layer_name = 'dense_100' intermediate_layer_model = Model(input=inputs, output=model_main.get_layer(layer_name).output) outputs_inter = Dense(10,activation='softmax')(intermediate_layer_model.output) model_inter = Model(input=inputs, output=outputs_inter) model = model_inter