2025.04.19
Part.11 텐서플로
Chapter 07. Data 다루기
- 05_ImageDataGenerator(1)
- 06_ImageDataGenerator(2)
- 07_ImageDataGenerator(3)
ImageDataGenerator
flow( ) 함수
ImageDataGenerator 기능이란, 데이터를 불러오는 동시에 여러 가지 전처리를 쉽게 구현할 수 있는 tf.keras의 기능.
기본적으로 데이터를 모두 메모리에 저장하고 진행하는 기능.
## ImageDataGenerator
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range = 20,
width_shift_range = 0.2,
height_shift_range = 0.2,
horizontal_flip = True
)
ImageDataGenerator 객체생성 후, flow( ) 메서드를 이용해서 다룰 수 있다. 이는 데이터 증강의 한 가지 방법이다. (Data Augmentaion)
기본적으로 이미지 데이터의 수가 많지 않거나, Overfitting 방지하기 위해서 사용한다.
flow( ) 는 데이터를 모두 메모리에 불러두고 사용한다.
데이터는 Cifar10 데이터셋을 사용하고, 이전에 Class로 만들어두었던 파일을 .py 확장자 변경해서 바로 import 한다.
# 이전시간에 만들어두었던 class 바로 import (.py 파일로 변환)
from Cifar10DataLoader import Cifar10DataLoader
cifar10_loader = Cifar10DataLoader()
train_x, train_y = cifar10_loader.get_train_dataset()
불러와진 데이터셋에 아까 만들었던 ImageDataGenerator를 적용해보면...
next(iter(datagen.flow((train_x, train_y))))
이렇게 불러와지는 것을 알 수 있다. (train_x, train_y) 전체를 넣었지만, 결과는 32개만 나온 것을 알 수 있는데, 기본적으로 flow( ) 는 배치를 생성하고 아무 지정이 없을 때는 batch_size 32를 디폴트 값으로 한다.
이제 증강된 사진들과 원본 사진을 확인해 보면아래와 같다. ( flow( ) 에서는 shuffle=True가 디폴트값이기에, False를 지정해 줘야 순서가 변경되지 않는다 )
# 증강된 사진
for i in range(6):
plt.subplot(2, 3, i+1)
plt.imshow(x[i])
plt.axis('off')
plt.tight_layout()
plt.show()
# 원본
for i in range(6):
plt.subplot(2, 3, i+1)
plt.imshow(train_x[i])
plt.axis('off')
plt.tight_layout()
plt.show()
flow_from_directory( )
데이터가 너무 커서 메모리에 한 번에 모두 올릴 수 없을 때 사용한다.
디렉터리 경로만 지정해 주면, ImageDataGenerator가 이미지를 순차적으로 불러오면서 학습을 진행한다.
다만, 전제조건이 아래와 같다
- 최상위 디렉터리 안에 클래스별로 서브 폴더가 있어야 한다.
- 각 서브 폴더 이름이 클래스 이름 또는 라벨 인덱스여야 한다.
- 서브 폴더 안에는 해당 클래스에 해당하는 이미지들이 저장되어 있어야 한다.
해당 디렉터리를 기반으로 ImageDataGenerator를 진행하면.. 아래와 같이 실행된다.
input_shape = (28, 28, 1)
batch_size = 32
gen = datagen.flow_from_directory(
mnnist_train_dir,
target_size = input_shape[:2],
batch_size = batch_size,
color_mode = 'grayscale', #1채널, 흑백
shuffle = False
)
# shuffle은 True하는게 맞지만, 원본데이터와 증강데이터를 비교하기 위해서 False처리
잘 진행되었는지 아래처럼 조회할 수 있다.
flow_from_DataFrame( )
데이터 로드부터 다시 시작한다. 폴더의 path를 지정하는 것은 위와 동일하지만 이번에는 pandas로 확인한다.
cifar 데이터의 csv파일에는 각 사진데이터에 대한 경로데이터와 클래스에 대한 데이터가 저장되어 있다.
# 경로 설정
datasets_path = "G:\Zerobase_data_1(24)\class\zerobase_datasciences_school__class__part__11__15__230120
\Part11__tensorflow_and_Part12__pytorch\deeplearning_frameworks_zerobaseDSS
\datasets/"
# 폴더 내 파일, 폴더 리스트 조회
import os
os.listdir(datasets_path + '/cifar')
>> ['labels.txt', 'test', 'test_dataset.csv', 'train', 'train_dataset.csv']
# pd.read_csv 적용
import pandas as pd
train_dataset_raw = datasets_path + '/cifar/train_dataset.csv'
train_dataset_pd = pd.read_csv(train_dataset_raw)
train_dataset_pd.head()
동일하게 ImageDataGenerator를 설정한다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range = 20,
width_shift_range = 0.2,
height_shift_range = 0.2,
horizontal_flip = True
)
gen = datagen.flow_from_dataframe(
train_dataset_pd,
x_col = 'path',
y_col = 'class_name',
target_size = (32, 32),
color_mode = 'rgb',
class_model = 'categorical',
batch_size = 32
)
잘 들어와 졌는지 확인해 보면.... 아래와 같이 shape을 통해 확인할 수 있다. 클래스도 10개 자동으로 분류되었다.
x, y = next(iter(gen))
x.shape, y.shape
>> ((32, 32, 32, 3), (32, 10))
확인하였으면 아래와 같이 학습 진행 할 수 있다.
## 모델 학습
hist = model.fit(gen, epochs=2, steps_per_epoch=len(gen))
'Bootcamp_zerobase > Tensorflow' 카테고리의 다른 글
Tensorflow : data 다루기 #2 (0) | 2025.04.19 |
---|---|
Tensorflow : data 다루기 #1 (2) | 2025.04.19 |
Evaluation : Tensorboard 및 모델의 Save, Load (0) | 2025.04.16 |
Model 학습 : 텐서플로 모델학습 (fit( ) vs Training Logic) (0) | 2025.04.13 |
SubClass 모델링 : SubClass 및 모델구현 (0) | 2025.04.07 |