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
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=20, # 회전하는 각도를 20도 내에서 랜덤하게 회전
width_shift_range=0.2, # 가로로 이동하는데 20% 만큼 랜덤으로 생성
height_shift_range=0.2, # 높이로 이동하는데 20% 만큼 랜덤으로 생성
horizontal_flip = True # 가로축 랜덤 설정
)
datagen.flow()
Data Aumentation -> Overfitting 방지
class Cifar10DataLoader():
def __init__(self):
# data load
(self.train_x, self.train_y), \
(self.test_x, self.test_y) = tf.keras.datasets.cifar10.load_data()
self.input_shape = self.train_x.shape[1:]
def scale(self, x):
return (x / 255.0).astype(np.float32)
def preprocess_dataset(self, dataset):
(feature, target) = dataset
# scaling #
scaled_x = np.array([self.scale(x) for x in feature])
# label encoding #
ohe_y = np.array([tf.keras.utils.to_categorical(
y, num_classes=10) for y in target])
return scaled_x, ohe_y.squeeze(1)
def get_train_dataset(self):
return self.preprocess_dataset((self.train_x, self.train_y))
def get_test_dataset(self):
return self.preprocess_dataset((self.test_x, self.test_y))
cifar10_loader = Cifar10DataLoader()
train_x, train_y = cifar10_loader.get_train_dataset()
print(train_x.shape, train_x.dtype)
print(train_y.shape, train_y.dtype)
result = next(iter(datagen.flow((train_x, train_y))))
x, y = result
x.shape
y.shape
x[0].shape
plt.imshow(x[0])
plt.show()
train_dir = "../../datasets/mnist_png/training"
input_shape = (28, 28, 1)
batch_size = 32
gen = datagen.flow_from_directory(
train_dir,
target_size=input_shape[:2], # 이미지를 불러 왔을 때 어떤 크기로 줄여줄까
batch_size= batch_size,
color_mode = 'grayscale'
)
x, y = next(iter(gen))
x.shape, y.shape
import pandas as pd
os.listdir('../../datasets/cifar/train_dataset.csv')
train_data = pd.read_csv('../../datasets/cifar/train_dataset.csv')
gen = datagen.flow_from_dataframe(
train_data,
x_col='path',
y_col = 'class_name',
target_size=(32, 32),
color_mode='rgb',
class_mode='categorical',
batch_size=32
)
x, y = next(iter(gen))
x.shape
y.shape
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"])
model.fit(gen)
어렵다...
💻 출처 : 제로베이스 데이터 취업 스쿨