keras 新手上路,进行一个分类任务,然后遇到了load pre-train model时候,参数是否冻结训练的问题。已经被知乎大佬讨论过的 BN 层训练和测试时候 frozen 开关的问题:
github上大佬们都讨论出了解决补丁:
这里主要看的是base_model 中的 conv1、bn_conv1 和自己在base_model后加的那层bn层的weights是否更新了。
pre-train 中的conv1 和bn_conv1 参数值:
# coding=utf-8
import os
# os.environ["CUDA_VISIBLE_DEVICES"] = "1"
from src.model.resnet50 import ResNet50
from keras.models import Model
from keras.layers import Input,Dropout,Dense,Concatenate,BatchNormalization
import tensorflow as tf
from keras.callbacks import TensorBoard, ModelCheckpoint
from keras.optimizers import Adam,SGD
import keras
from keras import backend as K
input_tensor = Input((299,299, 3))
base_model = ResNet50(input_tensor=input_tensor,weights='imagenet',include_top=False,pooling='avg') # load pre-trained model and weight
# print(base_model.summary())
conv_1=base_model.get_layer('conv1')
print(base_model.get_weights()[2])
print('conv1:', conv_1)
print ('======')
bn_1=base_model.get_layer('bn_conv1')
print(base_model.get_weights()[3])
print('bn_conv1:', bn_1)
# [1.0913312 1.1138613 0.87221205 1.3775853 1.1671193 1.1966964
# 0.91123503 1.5656891 2.5536506 0.8813567 1.1953614 0.86340654
# 0.9432478 2.4865716 1.0368608 1.2843996 1.4514154 1.3008332
# 1.0089829 1.3758818 1.0634737 1.1025162 2.6344054 1.0763955
# 1.0826234 1.4103851 1.982566 0.744998 0.9306326 2.0845473
# 1.4146942 0.879981 0.8721337 0.5126429 1.2891649 0.90243804
# 0.8805454 1.864482 1.380977 1.01026 1.3941606 1.040888
# 1.2940407 0.5283866 0.9631836 2.6685867 1.1683974 1.1092062
# 0.8321394 1.0036737 1.4683139 1.5917623 0.55286855 1.2541881
# 1.5560241 1.069061 0.8508632 0.92903084 1.411313 0.9452564
# 0.8614338 0.9161029 1.0425918 1.01351 ]
# conv1:
# ======
# [ 1.4794971 -1.1218344 -1.064731 -1.8752855 1.3335849 2.0549939
# -1.1351001 -0.95681113 -2.653984 1.7911505 1.7329975 1.8168497
# 1.9906664 5.2453036 1.4868897 3.3816328 2.9044456 0.70707947
# 2.5584774 0.66531706 1.6608177 1.6287826 5.406512 -1.5626409
# 2.5113227 0.7170165 -1.8168149 -0.93483573 1.75065 -1.3620055
# 3.171459 -1.1747959 1.7847018 -0.39771003 2.3295436 -1.4068654
# 1.589747 -2.040728 2.4975235 2.8929026 3.1065266 -1.0337604
# 1.6070399 -0.41155133 1.6296418 6.3536353 1.354015 2.1449265
# -1.042398 1.5324403 -0.103476 3.6450117 0.10088198 1.2302585
# -1.3651855 1.7115566 -1.3113589 1.6611845 0.76037955 2.1647985
# 2.1632543 -1.026623 0.9389381 2.010768 ]
# bn_conv1:
进行pre-train部分参数冻结,并在此基础上训一个epoch:
# 模型定义
input_tensor = Input(shape