Path: blob/master/site/ko/tensorboard/image_summaries.ipynb
25115 views
Copyright 2019 The TensorFlow Authors.
TensorBoard에 이미지 데이터 표시하기
개요
TensorFlow Image Summary API를 사용하면 텐서와 임의의 이미지를 쉽게 로깅하고 TensorBoard에서 볼 수 있습니다. 이는 입력 데이터를 샘플링 및 검사하거나 레이어 가중치 및 생성된 텐서를 시각화하는 데 대단히 유용할 수 있습니다. 또한, 진단 데이터를 이미지로 로깅하여 모델 개발 과정에서 도움을 받을 수 있습니다.
이 튜토리얼에서는 Image Summary API를 사용하여 텐서를 이미지로 시각화하는 방법을 알아봅니다. 또한, 임의의 이미지를 가져와서 텐서로 변환하고 TensorBoard에서 시각화하는 방법도 배웁니다. 이미지 요약을 사용하여 모델의 성능을 이해하는 데 도움을 주는 간단하지만 실용적인 예를 진행하겠습니다.
설정
Fashion-MNIST 데이터세트 다운로드하기
Fashion-MNIST 데이터세트에서 이미지를 분류하기 위한 간단한 신경망을 구성하겠습니다. 이 데이터세트는 10개 범주의 패션 제품을 나타내는 70,000개의 28x28 회색조 이미지로 구성되며 범주당 7,000개의 이미지가 있습니다.
먼저 데이터를 다운로드합니다.
단일 이미지 시각화하기
Image Summary API의 동작 방식을 이해하기 위해, 이제 간단히 TensorBoard의 훈련 세트에 첫 번째 훈련 이미지를 로깅하겠습니다.
이를 위해 훈련 데이터의 형상을 살펴봅니다.
데이터세트에 있는 각 이미지의 형상은 높이와 너비를 나타내는 랭크-2 텐서 형상(28, 28)입니다.
그러나 tf.summary.image()
는 (batch_size, height, width, channels)
를 포함하는 랭크-4 텐서를 예상합니다. 따라서 텐서의 형상을 변경해야 합니다.
하나의 이미지만 로깅하므로 batch_size
는 1입니다. 이미지는 회색조이므로 channels
를 1로 설정합니다.
이제 이 이미지를 로깅하고 TensorBoard에서 볼 준비가 되었습니다.
이제 TensorBoard를 사용하여 이미지를 검사합니다. UI가 모두 표시될 때까지 몇 초 정도 기다리세요.
"시계열" 대시보드에 방금 로깅한 이미지가 표시됩니다. 바로 "앵클 부츠"입니다.
더 쉽게 볼 수 있도록 이미지가 기본 크기로 조정됩니다. 크기가 조정되지 않은 원본 이미지를 보려면 오른쪽 '설정' 패널 하단에서 '실제 이미지 크기 표시'를 선택합니다.
밝기 및 대비 슬라이더를 사용하여 이미지 픽셀에 미치는 영향을 확인하세요.
여러 이미지 시각화하기
하나의 텐서를 로깅하는 작업은 잘 되었지만 여러 훈련 예를 로깅해야 한다면 어떨까요?
tf.summary.image()
로 데이터를 전달할 때 로깅하려는 이미지의 수를 지정하기만 하면 됩니다.
임의의 이미지 데이터 로깅하기
matplotlib에 의해 생성된 이미지와 같이 텐서가 아닌 이미지를 시각화하려면 어떻게 해야 할까요?
플롯을 텐서로 변환하려면 몇 가지 상용구 코드가 필요하지만 그 후에는 문제가 없습니다.
아래 코드에서 matplotlib의 subplot()
함수를 사용하여 처음 25개의 이미지를 보기 좋은 격자로 로깅합니다. 그러면 TensorBoard에서 격자를 볼 수 있습니다.
이미지 분류자 빌드하기
이제 모든 내용을 실제 예와 결합하겠습니다. 여기서 하려는 것은 머신러닝을 배우는 것이지 예쁜 그림을 그리려는 것은 아니니까요!
이미지 요약을 사용하여 Fashion-MNIST 데이터세트에 대해 간단한 분류자를 훈련하는 동안 모델이 얼마나 잘 동작하는지 알아보겠습니다.
먼저, 매우 간단한 모델을 만들고 컴파일하여 옵티마이저와 손실 함수를 설정합니다. 이와 함께 컴파일 단계에 분류자의 정확성을 로깅하는 내용도 지정합니다.
분류자를 훈련할 때 혼동 행렬을 확인하는 것이 유용합니다. 혼동 행렬을 통해 분류자가 테스트 데이터에서 어떤 성능을 나타내는지 자세히 알아볼 수 있습니다.
혼동 행렬을 계산하는 함수를 정의합니다. 이를 위해 편리한 Scikit-learn 함수를 사용하고 matplotlib를 사용하여 플롯합니다.
이제 분류자를 훈련하고, 동시에 혼동 행렬을 로깅할 준비가 되었습니다.
여기서 수행할 작업은 다음과 같습니다.
기본 메트릭을 로깅할 Keras TensorBoard 콜백을 만듭니다.
epoch가 끝날 때마다 혼동 행렬을 로깅할 Keras LambdaCallback을 생성합니다.
두 콜백이 모두 전달되도록 하면서 Model.fit()으로 모델을 훈련합니다.
훈련이 진행되면 아래로 스크롤하여 TensorBoard가 시작되는지 확인합니다.
정확성은 훈련 세트와 검증 세트 모두에서 상승 추세를 나타냅니다. 좋은 결과입니다. 그렇다면 데이터의 특정 하위 집합에서는 모델이 어떻게 동작할까요?
로깅된 혼동 행렬을 시각화려면 "이미지" 탭을 선택합니다. 혼동 행렬을 전체 크기로 보려면 '설정' 패널 하단의 '실제 이미지 크기 표시'를 선택합니다.
기본적으로, 대시보드에는 마지막으로 로깅된 스텝 또는 epoch에 대한 이미지 요약이 표시됩니다. 이전 혼동 행렬을 보려면 슬라이더를 사용합니다. 훈련이 진행됨에 따라 어두운 사각형이 대각선을 따라 합쳐지고 나머지 행렬이 0과 흰색을 향하는 추세를 나타내며 행렬에 큰 변화가 일어나고 있는 모습을 확인하세요. 이것은 훈련이 진행됨에 따라 분류자가 향상되고 있음을 의미합니다! 훌륭한 결과입니다!
혼동 행렬은 이 단순 모델에 몇 가지 문제가 있음을 보여줍니다. 큰 발전이 있기는 했지만 셔츠, 티셔츠, 풀오버는 서로 혼동되고 있습니다. 모델에 더 많은 작업이 필요합니다.
관심이 있다면 CNN(컨볼루셔널 네트워크)를 사용하여 이 모델을 개선해 보세요.