티스토리 뷰

https://codetorial.net/tensorflow/fashion_mnist_classification.html

 

바쁜 현대인을 위한 세줄코드

 

import tensorflow_datasets as tfds # 코랩 외에서는 설치 필요 (tensorflow와 다른 모듈임)

bldr = tfds.builder('fashion_mnist')
bldr._info().features['label'].names
['T-shirt/top',
 'Trouser',
 'Pullover',
 'Dress',
 'Coat',
 'Sandal',
 'Shirt',
 'Sneaker',
 'Bag',
 'Ankle boot']

 


 

일러두기

본 글의 코드는 에서 보실 수 있습니다.

 

본 글은 패션 MNIST의 레이블명(“T-shirt/top”, “Pullover” )이 데이터셋 안에 들어있지 않을까 하는 궁금증에서 출발했습니다. 궁금증 해결에 도움 주신 파이썬 처음처럼의 쭈굴 님께 감사 말씀 드립니다.

 


 

핵심요약

딥러닝 공부할 때 많이 사용하는 데이터셋 중 MNIST라는 것이 있습니다. 10가지 패션잡화 이미지 70,000장이고, 각 이미지는 28 x 28입니다.

 

https://www.tensorflow.org/datasets/catalog/fashion_mnist?hl=en

 

데이터셋은 아래와 같이 불러올 수 있습니다.

 

 

한 가지 아쉬운 점이라면, 타겟에는 레이블에 해당되는 숫자만 들어있습니다.

 

 

실제로 fashion_mnist 문서를 들어가보면 메서드가 load_data() 딱 하나밖에 없습니다. load_data()는 이미지와 타겟(dtype=np.uint8)을 불러오는 기능밖에 없습니다. 그래서 예제들을 보면 레이블명을 별도의 변수로 만들어서 사용하는 듯합니다. 에서도 그렇게 하네요.

 

 

그런데 사실, 이 레이블명은 데이터셋에 들어있습니다. 대신 tf.keras가 아닌 tensorflow_datasets라는 모듈을 사용해야 합니다. tensorflow와 다른 별도의 모듈이므로 설치가 필요합니다. 사용법은 간단합니다.

 

 

참 쉽죠?

 


 

Under the hood: 딱히 몰라도 상관없는 이야기 (=삽질의 기록)

에 보면 아래와 같이 써있습니다.

 

“Each image is mapped to a single label. Since the class names are not included with the dataset, store them here to use later when plotting the images:”

 

튜토리얼이 fashion_mnist.load_data()로 데이터를 가져온 것으로 보아, load_data()로는 불가능하다는 뜻인 것 같습니다. 하지만 tfds를 이용하면 가능합니다.

 

우선 tfds.load()fashion_mnist 데이터셋을 불러올 수 있습니다. 첫 번째 인자는 데이터셋 이름입니다.

 

https://www.tensorflow.org/datasets/api_docs/python/tfds/load

 

split 파라미터로 훈련/테스트 세트를 나눌 수 있습니다. with_info=True로 두면 데이터셋의 정보도 받아올 수 있습니다. 아래 코드에서 ds_info에 데이터셋의 정보가 들어갑니다.

 

 

tfds.load()로 가져올 수 있는 데이터셋의 목록은 tfds.list_builders()로 볼 수 있습니다. 2022 9 3일 기준 1108개입니다.

 

 

load한 데이터셋의 내용은 tdfs.visualization.show_examples()로 확인할 수 있습니다. 패션 MNIST는 이미지를 몇 개 보여줍니다.

 

 

데이터프레임으로도 볼 수 있습니다. tfds.as_dataframe()을 사용합니다.

 

 

바로 이 show_examples()as_dataframe()을 보고, 레이블명을 직접 입력하지 않고 데이터셋에서 가져올 수 있겠다고 생각했습니다. 데이터셋에서 가져올 수 있는데 제가 또 직접 입력하는 것은 일을 두 번 하는 느낌이었달까요? 그런데 사실 데이터셋 없이 레이블명만 불러오고 싶을 때에는 tfds.load()는 효율적인 방법이 아닙니다. 자세한 건 뒤에서 설명하겠습니다. tfds.load()로 불러온 ds_info에는 데이터셋의 정보가 들어있습니다. 그리고 ds_info에도 레이블명이 들어있습니다. 이걸 찾아내는 데 꽤 고생을 했습니다. ds_info에 어떤 프로퍼티와 메서드가 있는지 한땀한땀 dir()로 확인하면서, 공식문서를 같이 띄워놓고 연구를 좀 했습니다. 우선 ds_info는 아래처럼 생겼습니다. 자료형은 tfds.core.DatasetInfo입니다.

 

 

DatasetInfo의 프로퍼티 중 featurestfds.features.FeaturesDict이고, 여기에 키 ‘label’의 값으로 ClassLabel이 들어있습니다.

 

 

바로 이 ClassLabel에 우리가 찾던 레이블명이 들어있습니다. names 프로퍼티를 보면 됩니다.

 

 

그런데 이 방법은 단점이 있습니다. ds_info를 가져오려면 tfds.load()를 실행해야 합니다. tfds.load()는 기본적으로 데이터셋을 가져오는 메서드이므로, 데이터셋을 가져오지 않고 정보만 가져오는 방법은 (적어도 제가 알기로는) 없습니다. tfds.load()의 파라미터 중 download: bool이 있기는 한데, 이것은 데이터셋을 받지 않겠다는 게 아니고 이미 받아둔 게 있으니 또 받지 않아도 된다는 뜻입니다.

 

이때 쓸 수 있는 것이 tfds.builder입니다. tfds.builder가 가져오는 건 tfds.core.DatasetBuilder인데, 이것은 데이터셋의 몇 가지 정보만 가지고 있는 추상 클래스입니다. 그리고 이 추상 클래스의 자료형을 보면

 

 

tfds.image_classification.mnist.FashionMNIST라고 나옵니다. 이 클래스의 코드가 고스란히 에 올라와 있습니다. 해당 링크는 MNIST 에서 타고 들어갔습니다. 공시 문서를 사랑합시다.

 

 

T-shirt/top으로 시작하는 저 부분! 우리가 찾던 레이블명들입니다. 거의 다 왔습니다. _info() 메서드는 DatasetInfo를 반환합니다. 앞에서 봤던 바로 그것, tfds.load()가 반환하는 ds_info입니다.

 

 

FashionMNIST 코드를 보면 DatasetInfo에 뭐가 어떻게 들어가 있는지 볼 수 있습니다. 우리가 볼 것은 features입니다.

 

 

featuresFeaturesDict 자료형이고, “label”의 값이 ClassLabel이고, names라는 프로퍼티에 패션 MNIST의 레이블명이 들어있습니다.

 

 

여기까지 찾아오느라 텐서플로 홈페이지를 엄청 파헤치고 다녔는데, 나름 재밌었습니다. 여러분도 궁금한 게 있으면 집착합시다(?).

 

 

게으른 파이썬

 

 

See Also: 테디노트

댓글