keras 冻结操作的避坑记录和 冻结 抽取等方法的总结

错误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

 

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值