스터디노트 (Tensorflow 6)

zoe·2023년 7월 13일
0

tf.data

import os
from glob import glob

import tensorflow as tf
import numpy as np
from PIL import Image

import matplotlib.pyplot as plt
%matplotlib inline

np.random.seed(7777)
tf.random.set_seed(7777)

Read a file

  • 로컬 환경에 저장되어 있는 파일을 읽어 보겠습니다.
  • cifar 데이터를 load하지 않고 로컬에서 읽어 온다.
os.listdir('../../datasets/cifar/train/')
train_img = glob('../../datasets/cifar/train/*.png')

TensorFlow 명령어로 Image 읽기

path = train_img[0]
path
raw = tf.io.read_file(path)
img = tf.io.decode_image(raw)
img
img.shape, img.dtype
plt.imshow(img)
plt.show()

def read_image(path):
    raw = tf.io.read_file(path)
    img = tf.io.decode_image(raw)
    return img

tf.data API!

  • 미리 이미지 데이터를 모두 불러오는게 아니라 그 때 그 떄 처리를 하는 것
    속도도 더 빨라요!
dataset = tf.data.Dataset.from_tensor_slices(train_img)
# train 이미지 설정하는 기본 포맷?...

AUTOTUNE = tf.data.experimental.AUTOTUNE
dataset = dataset.map(read_image, num_parallel_calls=AUTOTUNE)
# map : 하나하나당 내가 지정한 함수를 실행한다는 것..
# num_parallel_calls : 몇개의 cpu, gpu를 이용해서 실행할 것인가....

dataset = dataset.batch(32)

# prefetch : tsnsorflow에서 병렬적으로 다음 batch를 읽음..
dataset = dataset.prefetch(AUTOTUNE)

dataset = dataset.shuffle(buffer_size=1)

dataset = dataset.repeat()

next(iter(dataset))
dataset = dataset.batch(32)
# prefetch : tsnsorflow에서 병렬적으로 다음 batch를 읽음..

dataset = dataset.prefetch(AUTOTUNE)
dataset = dataset.shuffle(buffer_size=1)
dataset = dataset.repeat()
next(iter(dataset))

Label도 같이 넘겨주기

train_img[0].split('/')[-1].split('.')[0].split('_')[-1]
tf.io.read_file('../../datasets/cifar/labels.txt').numpy().decode('ascii').strip().split('\n')
label_names = tf.io.read_file('../../datasets/cifar/labels.txt').numpy().decode('ascii').strip().split('\n')
label_names
label_names.index('deer')

one hot encoding

def parse_label(path):
    name = path.split('/')[-1].split('.')[0].split('_')[-1]
    return np.array(name == np.array(label_names), dtype=np.float32)
parse_label(train_img[0])
train_y = np.array([parse_label(x) for x in train_img])
train_y[0]
def read_image(path):
    raw = tf.io.read_file(path)
    img = tf.io.decode_image(raw)
    return img
def read_data(path, label):
    img = read_image(path)
    return img, label
dataset = tf.data.Dataset.from_tensor_slices((train_img, train_y)) # tensorflow 데이터 형태여야 함...
# train 이미지 설정하는 기본 포맷?...

AUTOTUNE = tf.data.experimental.AUTOTUNE
dataset = dataset.map(read_data, num_parallel_calls=AUTOTUNE)
# map : 하나하나당 내가 지정한 함수를 실행한다는 것..
# num_parallel_calls : 몇개의 cpu, gpu를 이용해서 실행할 것인가....

dataset = dataset.batch(32)

# prefetch : tsnsorflow에서 병렬적으로 다음 batch를 읽음..
dataset = dataset.prefetch(AUTOTUNE)

dataset = dataset.shuffle(buffer_size=1)

dataset = dataset.repeat()
next(iter(dataset))

Label parsing 하는 것도 map 함수로 처리

os.listdir('../../datasets/cifar/train/')
train_img = glob('../../datasets/cifar/train/*.png')
path = train_img[0]

path
f_name = tf.strings.split(path, '_')[-1]
label_name = tf.strings.regex_replace(f_name, '.png', '')
label_name
tf.cast(label_name == label_names, tf.float32)
def get_label(path):
    f_name = tf.strings.split(path, '_')[-1]
    lbl_name = tf.strings.regex_replace(f_name, '.png', '')
    onehot = tf.cast(lbl_name == label_names, tf.float32)
    return onehot
def load_image_label(path):
    gfile = tf.io.read_file(path)
    image = tf.io.decode_image(gfile)
    label = get_label(path)
    return image, label
dataset = tf.data.Dataset.from_tensor_slices((train_img))
# train 이미지 설정하는 기본 포맷?...

AUTOTUNE = tf.data.experimental.AUTOTUNE
dataset = dataset.map(load_image_label, num_parallel_calls=AUTOTUNE)
# map : 하나하나당 내가 지정한 함수를 실행한다는 것..
# num_parallel_calls : 몇개의 cpu, gpu를 이용해서 실행할 것인가....

dataset = dataset.batch(32)

# prefetch : tsnsorflow에서 병렬적으로 다음 batch를 읽음..
dataset = dataset.prefetch(AUTOTUNE)

dataset = dataset.shuffle(buffer_size=1)

dataset = dataset.repeat()
next(iter(dataset))

학습

from tensorflow.keras.layers import Input, Conv2D, MaxPool2D, Flatten, Dense, Add

def build_resnet(input_shape):
    inputs = Input(input_shape)

    net = Conv2D(32, kernel_size=3, strides=2,
                 padding='same', activation='relu')(inputs)
    net = MaxPool2D()(net)
    
    net1 = Conv2D(64, kernel_size=1, padding='same', activation='relu')(net)
    net2 = Conv2D(64, kernel_size=3, padding='same', activation='relu')(net1)
    net3 = Conv2D(64, kernel_size=1, padding='same', activation='relu')(net2)
    
    net1_1 = Conv2D(64, kernel_size=1, padding='same')(net)
    net = Add()([net1_1, net3])
    
    net1 = Conv2D(64, kernel_size=1, padding='same', activation='relu')(net)
    net2 = Conv2D(64, kernel_size=3, padding='same', activation='relu')(net1)
    net3 = Conv2D(64, kernel_size=1, padding='same', activation='relu')(net2)
    
    net = Add()([net, net3])
    
    net = MaxPool2D()(net)
    
    net = Flatten()(net)
    net = Dense(10, activation="softmax")(net)

    model = tf.keras.Model(inputs=inputs, outputs=net, name='resnet')
    
    return model

model = build_resnet((32, 32, 3))
model.summary()
learning_rate = 0.03
opt = tf.keras.optimizers.Adam(learning_rate)
loss = tf.keras.losses.categorical_crossentropy

model.compile(optimizer=opt, loss=loss, metrics=["accuracy"])
len(train_img) / 32
model.fit(dataset, epochs = 1, steps_per_epoch=len(train_img) / 32)

어렵다...
💻 출처 : 제로베이스 데이터 취업 스쿨

profile
#데이터분석 #퍼포먼스마케팅 #데이터 #디지털마케팅

0개의 댓글