# Day_33_01_tf_datasets.py
# tensorflow-datasets 4.10 install
import tensorflow as tf
import tensorflow_datasets as tfds
import pandas as pd
import numpy as np
from sklearn import preprocessing, model_selection
def tfds_basic_1():
names = tfds.list_builders()
print(names) # ['abstract_reasoning', 'accentdb', 'aeslc'..... ]
print(len(names)) # 231
print('-' * 40)
imdb = tfds.load('imdb_reviews')
# print(type(imdb)) # <class 'dict'>
# print(imdb.keys()) # ['test', 'train', 'unsupervised']
print()
# 미리 데이터를 가져오는 것 -> I/O가 제일 느리기 때문에 미리 데이터를 가져다 놓을 것임
print(type(imdb['train'])) # <class 'tensorflow.python.data.ops.dataset_ops.PrefetchDataset'>
print(imdb['train'])
# <PrefetchDataset shapes: {label: (), text: ()}, types: {label: tf.int64, text: tf.string
# 학습 데이터 가져와 보자 2개만 현실적으로 위에꺼 쓰는 것이 맞는듯 아래꺼 기억하기 힘들다.
# tensor -> numpy 2가지 방식
for take in imdb['train'].take(2):
# print(take) # class 'dict'>
print(take['label'].numpy(), take['text'].numpy())
print('-' * 40)
for take in imdb['train'].take(2).as_numpy_iterator():
print(take)
print(take['label'], take['text'])
def tfds_basic_2():
imdb, info = tfds.load('imdb_reviews', with_info=True) # 데이터 설명도 같이 넣어줌
print(info)
print(info.splits)
# {'test': <tfds.core.SplitInfo num_examples=25000>,
# 'train': <tfds.core.SplitInfo num_examples=25000>,
# 'unsupervised': <tfds.core.SplitInfo num_examples=50000>}
print(info.splits['train'])
print(info.splits['train'].num_examples) # 25000
print('-' * 30)
# cardinality() 꼭 기억하기 -> 데이터의 설명 조금 해줌
print(imdb['train']) # <PrefetchDataset shapes: {label: (), text: ()}, types: {label: tf.int64, text: tf.string}>
print(imdb['train'].cardinality()) # tf.Tensor(25000, shape=(), dtype=int64)
print(imdb['train'].cardinality().numpy()) # 25000
print('-' * 30)
# 데이터를 분리해서 가져올 수 ㅣㅇㅆ다.
train_set, test_set = tfds.load('imdb_reviews', split=['train', 'test'])
print(type(train_set)) # <class 'tensorflow.python.data.ops.dataset_ops.PrefetchDataset'>
# split 옵션에는 존재하는 키만 전달해야 한다
# train_set, valid_set, test_set = tfds.load('imdb_reviews', split=['train', 'validation', 'test']) # error
# train_set, valid_set, test_set = tfds.load('imdb_reviews', split=['train', 'train', 'test'])
# 6:4로 나눠서 가져오는 sliding 비슷한 방식
train_set, valid_set, test_set = tfds.load('imdb_reviews', split=['train[:60%]', 'train[60%:]', 'test'])
print(train_set.cardinality().numpy()) # 15000
print(valid_set.cardinality().numpy()) # 10000
print(test_set.cardinality().numpy()) # 25000
def tfds_basic_3():
# 두개의 표현이 다름 순서가 뒤집혀져 있음 자기가 편한 것을 사용하면 됨
imdb_1 = tfds.load('imdb_reviews') # dic이 들어가 있음 정렬되어 있는 상테
print(type(imdb_1))
print(imdb_1['train']) # <PrefetchDataset shapes: {label: (), text: ()}, types: {label: tf.int64, text: tf.string}>
for take in imdb_1['train'].take(2):
print(type(take)) # <class 'dict'>
print(take['label']) # tf.Tensor(0, shape=(), dtype=int64)
print('-' * 30)
# 이게 더 꺠끗하게 사용할 수 있다.
imdb_2 = tfds.load('imdb_reviews', as_supervised=True)
print(type(imdb_2)) # data가 튜플의 상태 튜플을 가르킴
print(imdb_2['train']) # <PrefetchDataset shapes: ((), ()), types: (tf.string, tf.int64)>
for take in imdb_2['train'].take(2):
print(type(take)) # <class 'tuple'>
print(take[1]) # tf.Tensor(0, shape=(), dtype=int64)
print('-' * 30)
for xx, yy in imdb_2['train'].take(2):
print(xx.numpy()) # b'I have been known to fall asleep
print(yy.numpy()) # 0
tfds_basic_3()