AutoEncoder 에서 뽑은 Z vector

Tensorboard 에서 보기



"numpy와 Tensorflow를 통해 Tensorboard로 불러오기."






최근에 AutoEncoder를 Keras로 코딩하던 중 내 모델이 feature를 얼마나 잘 뽑아내는지 알아볼 필요가 생겼다. 


Keras에서 callback 중 하나인  keras.callbacks.Tensorboard()  를 사용하면 Tensorboard에서 loss 및 acc 등을 확인할 수 있는 데이터를 함수 내 인자로 지정해준 경로에 생성한다. 문제는 이 callback 함수가 Tensorboard에서 loss 및 acc 그래프 정도는 잘 보여주지만, 자동으로 Keras model이 가지고 있는 다양한 정보를 한 번에 볼 수 없다는 것이었다. 


특히 나는 각 z vector 값 간의 interpolation이 자연스러운지를 확인해야 했는데, 기존에 확인하던 방법은 Test set에서 랜덤으로 두 이미지를 선택해 z vector 값 사이를 움직이도록 했었다. 다양한 이미지 간의 interpolation을 확인할 수 있었지만, 그 이미지 간의 z vector 의 차이, 즉 유사도를 확인할 수 없다는 것과 그 점 때문에 내 모델이 학습한 z vector가 이미지의 feature를 잘 뽑아냈는지를 확인할 수 없었다. 


따라서 Tensorboard에 있는 embedding 기능을 이용하기로 했다. embedding에 대해 검색해보면 자세히 알 수 있지만, 간단히 이야기해서 현재 64 차원인 z vector의 좌표 및 거리 등 정보를 2차원 혹은 3차원과 같은 저차원으로 낮추어 데이터의 cluster나 분포를 확인할 수 있게 하는 것이 목적이다. embedding은 다양한 방법으로 가능한데, Tensorboard에서 지원하는 방법은  t-SNE   PCA  라는 방법이다. 설명하기엔 나도 모르는 것이 많아 궁금한 사람은 직접 검색해 보는 것을 추천한다. 


사실 위에 언급한 callback 함수에서 인자로  embedding_freq  와  embedding_layer_name  을 설정하면 Tensorboard에서 embedding space를 바로 확인할 수 있다고 하지만, 내 모델의 구조 상 embedding_layer_name에서 내가 원하는 layer를 가져오지 못했다. 따라서 다른 방법을 찾아봐야 했다. 


인터넷에 Keras model에서 구한 vector를 Tensorboard에 embedding하는 방법을 찾던 중, 다음 글을 발견했다. 글에 나와 있는 방법을 간단하게 설명하자면, Keras model 내의 Keras tensor를 구한 뒤, Tensorflow를 이용해 데이터를 저장하고 Tensorboard에서 그 정보를 읽는 것이다. 다행히 Tensorboard에서는  tensorflow.train.Saver()  로 저장한 Tensor를 불러오는 기능이 있다. 위 글 역시 이 기능을 사용했으며, Keras의 backend로 Tensorflow가 쓰일 수 있기 때문에 backend 에서 session을 얻어와 동작하게 하는 식으로 프로그래밍했다. 


위 예제는 Tensorflow 1.5 버전부터 사용할 수 없는데, 중간에 사용된  tensorflow.train.SummaryWriter()  함수가 사라지고 그 기능이 다른 곳으로 refactoring 되었기 때문이다. 물론 기능은 남아있기 때문에 다른 방법으로 구현할 수 있었다.  tensorflow.summary.FileWriter()  함수가 그 기능을 대신하기 때문에, 위 함수로 해당 부분을 대체하면 된다. 


또한 Keras backend에서 session을 가져오는 것에서 약간의 내부적 순서 문제가 있었는지, 선언과 함수 실행부들을 이리저리 바꿔봐도 계속 오류가 났다. 여러 번의 삽질 끝에 찾은 방법은, 아예 다른 파일에 Tensorflow를 불러오고, Tensorflow의 session을 열어 session 내에서 해당 작업을 전부 수행하는 것이다. 


코드는 길지 않은데 아래와 같다. 


import
tensorflow as tf import numpy as np with tf.Session() as sess: fw = tf.summary.FileWriter('emb') # 위에서 말한 함수를 대체한 부분 z_list = np.load('z_vector.npy') # 따로 저장해 둔 z vector의 numpy array를 저장해둔 파일을 읽어왔다. init = tf.constant_initializer(z_list) z = tf.get_variable('z_tf', shape=[len(z_list), 64], initializer=init) # 불러온 z vector의 shape에 맞는 tensor를 만든다. z.initializer.run() saver = tf.train.Saver()

# configuration file을 만드는 부분

from tensorboard.plugins.projector.projector_config_pb2 import ProjectorConfig cfg = ProjectorConfig() embed = cfg.embeddings.add() embed.tensor_name = 'z_tf'

# embedding vector를 보여주기 위해 visualize 하는 부분

from tensorboard.plugins.projector import visualize_embeddings visualize_embeddings(fw, cfg)


saver.save(sess, 'emb/model.ckpt') # 임의의 경로에 .ckpt 파일을 저장한다


이런 방식으로 저장한 .ckpt 파일의 경로를 Tensorboard 명령어에 log_dir 로 넣어주면, 비로소 Tensorboard의  Projector  탭에 embedding space가 보여지게 된다. Tensorboard 의 사용법은 검색하면 바로 찾을 수 있으니 따로 적지는 않는다. 





[NUXLEAR]

+ Recent posts