인공지능

tfds ( tensor flow data set )사용하기

쿠와와 2020. 12. 20. 16:37
# 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()