텐서플로우 공식 홈페이지에 소개되어 있는 데이터셋을 가져오는 포스팅이 많이 없기도 했고,
일반 데이터셋이랑은 다루는 방법이 많이 달라서 끄적여본다.
처음에 이런 형식의 데이터셋과 친해지는데 많이 힘들었당 ㅎ
https://www.tensorflow.org/datasets/catalog/overview
데이터세트 | TensorFlow Datasets
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trade
www.tensorflow.org
위 링크를 클릭하면 텐서플로우 데이터셋의 리스트와 설명들을 확인할 수 있다.
빅데이터분석 강의를 수강하면서 image classfication카테고리의 deep weeds라는 데이터셋의 분석을 맡게 되었다.
해당 데이터의 설명은 아래 링크에서 자세히 확인할 수 있다.
https://www.tensorflow.org/datasets/catalog/deep_weeds
깊은 잡초 | TensorFlow Datasets
DeepWeeds 데이터 세트는 인접한 식물군과 함께 호주 고유의 8가지 잡초 종을 캡처하는 17,509개의 이미지로 구성됩니다. 선택한 잡초 종은 퀸즐랜드 주 전역의 목가적인 초원에 서식합니다. 이미지
www.tensorflow.org
발표과제여서 코랩에 정리한 부분을 일부 가져와 보았다.
위와 같이 9개의 class로 구분하는 과제이다.
전체 데이터양은 별로 많지 않다.
# 필요한 라이브러리
import tensorflow as tf
import tensorflow_datasets as tfds
import os
import numpy as np
import matplotlib.pyplot as plt
먼저 필요한 라이브러리를 불러온다.
#데이터 불러오기
(raw_train, raw_validation, raw_test), metadata = tfds.load('deep_weeds',
split = ['train[:70%]', 'train[70%:80%]', 'train[80%:]'], with_info=True, as_supervised=True)
print(raw_train)
print(raw_validation)
print(raw_test)
전체 데이터에서 train 데이터를 70%, 검증용 데이터를 10%, test데이터를 20%로 배정했다.
데이터의 정보를 볼 수 있는 with_info는 True로 설정해주었고, 이는 metadata에 저장된다.
데이터 내의 label을 타겟변수로 볼 건지를 설정하는 as_supervised는 True로 설정하였다.
결과는 다음과 같이 나오는데, 위에서도 말했다시피 기존의 데이터셋과는 다른 형태이다이놈의 PrefetchDataset 때문에 정말 화딱지가 났었다.나는 분석을 하려면 무조건 numpy형식이나 dataframe형식이어야 하는줄 알았기 때문이다.
그래서!!!
많은 고민 끝에 numpy로 꾸역꾸역 바꾸는 데 성공하였다. (물론, 발표 과제에서 다른 학생분들의 방법을 참고하긴 했다. 텐서플로우 데이터셋을 이용할 때 이 방법뿐이겠거니 진행하였는데 더더더더 좋은 방법이 있었다. 이 방법에 대해서는 다음 포스팅에서 적어보겠다.)
#트레인데이터 배열화 시키기
train_X=[]
train_Y=[]
for idx, data in enumerate(raw_train):
image, label = data
image=np.array(image)
image=tf.image.resize(image, (50, 50))
train_X.append(image)
train_Y.append(label.numpy())
train_X=np.array(train_X).astype('float32')
train_Y=np.array(train_Y).astype('float32')
#테스트데이터 배열화 시키기
test_X=[]
test_Y=[]
for idx, data in enumerate(raw_test):
t_image, t_label = data
t_image=np.array(t_image)
t_image=tf.image.resize(t_image, (50, 50))
test_X.append(t_image)
test_Y.append(t_label.numpy())
test_X=np.array(test_X).astype('float32')
test_Y=np.array(test_Y).astype('float32')
원래 이미지의 사이즈는 (256, 256)으로 비교적 큰 상태였고 나는 이것을 (50, 50) 사이즈로 바꾸어 주었다.
이런식으로 인스턴스 하나씩 모두 배열로 바꾸어서 append 시켜줬다.
내 데이터가 크지 않아서 이 방법이 가능했지만 만약에 데이터 용량이 컸거나, 이미지 리사이징을 크게 했더라면 아마 코랩이 터져버렸을 것이다.(RAM용량 초과)
이 방법이 올바른 방법이 아니지만, prefetchdataset을 numpy배열로 바꾸는 방법에 대해 궁금한 사람도 있을 것이니 일단 계속 적어보겠다.
#0~1사이 숫자로
train_X=train_X/255
test_X=test_X/255
255로 나누어 표준화 시켜주었고
위와 같은 shape를 확인할 수 있다.
#이미지 예시
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for c in range(16):
plt.subplot(4,4,c+1)
plt.imshow(train_X[c])
plt.show()
print(train_Y[:16])
배열로 변환한 이미지를 몇개 확인해보자.
(50,50)으로 리사이징 하였기 때문에 화질이 다소 낮은 것을 확인할 수 있다.
밑에 숫자들은 각 그림이 어떤 분류에 속하는지 나타낸 것이다.
이렇게 변환한 데이터는
위와 같이 x와 y로 분류되어 학습을 시킬 수 있게 된다.
오늘 포스팅은 넘파이 배열로 변환시키기 위한 야매(?) 방법이었다면
다음 포스팅에서는 정석대로 데이터를 전처리하는 방법에 대해 적어보도록 하겠다.
'대학원 공부 > 텐서플로' 카테고리의 다른 글
[Tensorflow] 텐서플로우 데이터셋 불러오기 (데이터 변형 x, 전이학습) (0) | 2023.01.09 |
---|---|
[에러] AttributeError: 'Tensor' object has no attribute 'numpy' (0) | 2023.01.02 |
[에러] Please ensure this object is passed to the `custom_objects` argument. (0) | 2022.12.09 |