- 起因:我是个小白,想在自己的图片数据集上使用efficientnetv2,就先运行了GitHub上的示例代码(需要指定其中的路径,这个等下再细说):
python main.py --mode=train --model_name=efficientnetv2-s --dataset_cfg=cifar10Ft --model_dir=$DIR --hparam_str="train.ft_init_ckpt=$PRETRAIN_CKPT_PATH"
但是会出现在ckpt文件里找不到head_1/dense/bias或者head_1/dense/kernel的问题,在这之前还出现过类似的找不到。
-
失败尝试:
-
修改命令里的路径:在GitHub上下载了好几个ckpt压缩包,拿里面的ckpt和model文件来运行,但无论哪个压缩包都不对
-
检查代码:输出下载的ckpt的变量名,想看看究竟有没有,结果是,有head的,没有head_1的。偶然看到一篇博客说如果多次载入一张graph,就会出现由于一个变量名已经存在了,于是会创建一个新的变量,类似于已经有weight,就会在第二次读取graph的时候命名为weight_1,如果要避免,在每次读完graph之后就添加一句ops.reset_default_graph()。于是我拼命找,找"with"、找"session",每个函数都看过去,到底哪里多次载入了?我找不准,添加的这句要么是没有报错,但是找不到变量的错误仍然在,要么就是说不可以中途打断nested graph,建议我新建一张graph。我再输出代码里面与ckpt里变量有关的trainable variable,发现head_1是本应该有的,不是多次载入graph的结果,因为列表里dense/bias和dense/kernel就只有
<tf.Variable 'efficientnetv2-s/head_1/dense/kernel:0' shape=(1280, 1000) dtype=float32>, <tf.Variable 'efficientnetv2-s/head_1/dense/bias:0' shape=(1000,) dtype=float32>
这两个变量,如果多读的话,是应该至少有四个的,也就是efficientnetv2-s/head/dense/kernel、efficientnetv2-s/head/dense/bias、efficientnetv2-s/head_1/dense/kernel、efficientnetv2-s/head_1/dense/bias这样。但是没有,所以不是多次载入的问题。
-
-
成功的转机:服务器连不上了,重启了一次,重新连上之后有些包找不到了,为了兼容就给好些包都换了版本,之后再运行发现代码跑通了!!出现了类似下面这样的刷屏信息:
INFO:tensorflow:global_step/sec: 11.9026 I0327 20:51:49.209239 139832147883200 tpu_estimator.py:2391] global_step/sec: 11.9026 INFO:tensorflow:examples/sec: 6094.11 I0327 20:51:49.209511 139832147883200 tpu_estimator.py:2392] examples/sec
EfficientNetV2 Finetune on CIFAR10出现head_1/dense/bias is not found in ckpt
于 2024-03-27 21:44:13 首次发布