tensorpack 예제를 사용하다보니깐 (B, C, W, H)- channel_first 형태를 (B, W, H, C)- channel_last 형태로 바꿔야 하는 과정이 필요로했습니다. 그래서 여러 자료를 찾다가 적절한 방법을 발견했습니다. 바로 tf.transepose라는 함수를 사용하면 됩니다.
대부분 neural network를 구축할 때 scope/name이 충돌나지 않게 구축합니다. 하지만 저같은 tensorflow 초짜들은 그런 거 없이 무조건 구현에 신경을 써서 나중에 Imagenet으로 pre-train한 weight를 쓰고 싶어도 충돌이 일어나 사용하기 힘든 경우가 있었습니다. 저같은 경우에는 먼저 tensorpack의 FasterRCNN 예제에 맞는 network를 구축하고 나아아중에 tensorflow/slim에서 Imagenet을 구축했습니다. 여기서 두 경우가 시간상 멀리 떨어져있어 tensor들의 이름이 대부분 달라서 애를 먹었습니다.
그렇지만 역시 이런 경우를 생각하고 소스코드를 구축한 분들이 있습니다. 밑의 깃허브 주소를 들어가면 소스코드가 존재합니다.
=> 입력되는 것은 없지만 이 파라미터를 넣을 경우 실질적으로 바뀌지는 않습니다. 즉, 어떻게 바뀌는지 확인만 하는 것입니다.
ex)
python change.py --checkpoin_dir=model.ckpt --replace_from weights --replace_to W --dry_run
※ 저만 그런지는 모르겠지만 'tf.train.get_checkpoint_state' 가 되지 않았습니다. 그래서 저게 많이 쓰이질 않아서 line 34에서 checkpoint.model_checkpoint_path 부분을 저장하고 싶은 위치에 파일이름을 적었습니다. ex) change.ckpt
여러 tensor 이름들을 변경해야할 경우 저는 shell script를 만들어서 실행했습니다.
마지막으로, 바뀌거나 바꾸는 중이거나 처음 상태에서 tensor들의 이름을 알고 싶을 때 손쉽게 볼 수 있는 함수가 존재합니다.
밑의 코드는그것을 이용한 소스코드 입니다.
import tensorflow as tf
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--load', help='load a model for evaluation.', required=True)
args = parser.parse_args()
variables = tf.contrib.framework.list_variables(args.load) # Tensorflow Model Zoo 에서 제공하는 ckeckpoint file
for i, v in enumerate(variables):
print("{}. name : {} \n shape : {}".format(i, v[0], v[1]))