Tensorflow에서 Value Error: Unknown Layer: Functional 문제

이미지 출처 - https://bugloss-chestnut.tistory.com/entry/Tensorflow-keras-h5-pb-tflite-%EB%B3%80%ED%99%98-%EC%98%A4%EB%A5%98python

문제 원인 및 발생 경위

Tensorflow 로 구현된 사전학습 모델을 사용하게 되면 심심치 않게 해당 오류를 발견할 수 있다. 이것은 로컬 혹은 컨테이너 환경에서의 Tensorflow 버전이 사전학습 모델의 Tensorflow 버전과 일치하지 않아서 생기는 문제이다.

왜냐하면 Tensorflow 2.3 버전에서 model을 저장할 때의 json 구조가 달라졌기 때문이다.

기존의 (Tensorflow 2.2 버전 이전) 모델 저장 구조

1
2
{"class_name": "Model", "config": {"name": "model_1", "layers": [{"name": "input_1", "class_name": "InputLayer" ...

변경 이후 (Tensorflow 2.3 버전 이후) 모델 저장 구조

1
2
{"class_name": "Functional", "config": {"name": "functional_1", "layers": [{"class_name": "InputLayer" ...

- 참고 smecsm.tistory.com/180

필자는 Tensorflow 2.3 버전이 Release 되기 전에 학습되어 공개된 사전학습 모델들을 사용하거나 새로 학습을 시킨 모델을 load하려는 상황에서 Value Error: Unknown Layer: Functional 에러를 자주 보았는데, 이것을 해결하기 위해 상당히 많은 시행착오를 겪었다.

해결 방안

1. 로컬 혹은 컨테이너의 tensorflow 버전을 2.3.0 이상으로 upgrade 한다.

주로 구글링 하면 쉽게 보이는 해답들은 pip 를 사용하여 호환이 되는 버전으로 upgrade 를 하라고 나와있다.

1
pip install --upgrade tensorflow==2.3.0

하지만 Raspberry Pi와 용량 혹은 CPU 버전이 낮은 컨테이너에서는 아무리 위의 명령을 실행시켜보아도 어떤 이유에선지 Tensorflow 버전이 2.0.0 이상으로 Upgrade 되지 않는 문제가 있어서 다른 해결방법을 찾아보아야 했다.

2. Tensorflow 버전을 downgrade 하여 재학습 시킨다.

1번 방안으로 해결되지 않을 경우 tensorflow 버전을 downgrade 하여 재학습시키는 방법밖에는 없다. Google의 Colab 에서는 손쉽게 tensorflow 버전을 조절할 수 있다. (현재 colab의 default tensorflow version 은 2.4.1 이다.)

1.xx 버전으로 다운그레이드 할 경우

1
%tensorflow 1.x

2.x 버전 중에서 2.3.0 이하 버전들을 사용해야 하는 경우

1
2
!pip install --upgrade tensorflow==2.0.0
!pip install --upgrade tensorflow-gpu==2.0.0

Colab이 아니어도 로컬 혹은 컨테이너 환경에서 마찬가지로 pip install —upgrade tensorflow==VERSION 명령을 통해 tensorflow 버전을 조절할 수 있다.

보통 사전학습 모델을 공유하는 github의 repo들을 보면 train 코드까지 첨부하는 경우가 많다. 학습하려는 데이터의 규모가 크지 않거나 학습에 필요한 시간을 소비할 수 있는 분들은 해당 저장소를 clone 한 다음 제시되어 있는 dataset으로 똑같이 train 시키는 것이 가장 마음 편할 것이다.

하지만 학습에 시간을 투자할 수 없다면…? 마지막 방법은 하나밖에 없다.

3. Tensorflow 를 사용하지 않는다.

규모가 크거나 성능이 좋거나 혹은 SOTA 사전학습 모델들을 보면 보통 pytorch로 이루어진 모델들도 함께 공유가 되어있다. pytorch를 사용하도록 하자..

만약에 pytorch나 keras로 된 모델도 없을 경우에는 tensorflow를 downgrade 하여 학습에 시간을 투자하는 것 말고는 방도가 없는 것 같다.

(만약 다른 방안이 있다면 공유 부탁드리겠습니다.)

끝.

Tensorflow에서 Value Error: Unknown Layer: Functional 문제

https://l-yohai.github.io/Tensorflow-Value-Error-Unknown-Layer-Functional-problem/

Author

Yohan Lee

Posted on

2021-04-12

Updated on

2021-08-22

Licensed under

댓글