Cannot convert a symbolic Tensor (strided_slice_1:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported
위 에러는 Numpy와 TensorFlow(Keras) 버전이 맞지 않아 생기는 문제입니다.
대부분의 경우 Numpy==1.19.5
로 다운그레이드하면 해결된다 합니다.
하지만 저처럼 TF==2.7.0/Numpy==1.20.3 에서 정상적으로 진행됐음에도 동일 환경을 구축하고 테스트하는데 안되는 경우 따로 원인을 찾아야합니다.
해결 시도 과정
tensorflow:2.8.0
버전을 이용할 때 해당 오류가 발생했고, pip install numpy==1.19.5
을 진행하였습니다.
- tensorflow 2.8.0은 numpy 1.2.0 이상을 요구하지만 일단 numpy 다운그레이드는 진행됩니다. 하지만 코드에서 tf를 사용하면 넘파이 버전 오류가 발생합니다.
- tensorflow를 2.7.0으로 다운그레이드합니다.
- numpy 버전은 1.19.5입니다.
- 여전히 같은 에러가 발생합니다.
- tensorflow를 2.4.0으로 다운그레이드합니다.
- tf.load_model에서 오류가 발생했습니다.
- 계속 tf를 다운그레이드 하는 것은 좋지 않은 방법이라 생각해서 다른 방법을 시도합니다.
- 오류가 발생하는 np.argmax를 tf.argmax로 변경합니다.
- 추후에 다시 np로 변환될 때 오류가 발생합니다.
Cannot convert a symbolic Tensor (ArgMax:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported
- Tensorflow 2.5 버전으로 시도
- tf.keras.load_model() 에러: json.decoder.JSONDecodeError:
Expecting value: line 1 column 1 (char 0)
- 원인 : TF 2.8.0-gpu에서 저장한 모델을 TF 2.5.0로 불러오면 버전 차이로 에러가 발생함.
- RL에 사용되는 DL 모델이 정규화 된 데이터 / 비정규화 된 데이터로 훈련 된 두 종류가 있는데 해당 문제인지 테스트(norm, unnorm 모델 테스트)
- numpy를 삭제하고 conda install로 재설치
- base 가상환경을 사용중인데, 굳이 base에 conda를 사용하나 싶긴하나, 일단 conda 환경이기 때문에 효과가 있지 않을까 싶었습니다.
- conda로 설치하려했으나, 그존에 base에 유지하고 있는 툴이 너무 많아 오래걸리고 진행이 막힘. 보류합니다.
pip uninstall numpy
conda install numpy=1.20.3 -c conda-forge
- 해당 코드를 컨테이너에서 실행해봅니다.
해결
- TF v1을 사용할 때 numpy 관련 이슈로 판단하였습니다.
- TF2 모델을 TF1으로 사용해야 하기 때문에 eager 설정을 추가합니다.
(다음 포스팅 참고)
- 버전 관련해서는 위에서 얘기한 것 처럼 numpy 1.19.5 버전이 다들 문제 없이 사용하는 버전 같지만, 사실 TF와 관련된 문제일 수 있습니다. 그냥 해당 TF 버전에 맞는 numpy 버전을 유지해주시면 되겠습니다.(TF 설치시 default로 설치되실겁니다)