실전 머신러닝 적용 4주차

kinghong97·2022년 1월 11일
0
post-custom-banner

convolutional neural networks 합성곱 신경망

이미지 처리에 많이 사용

대충 작게 나누고 나누다가 차원 줄이고 1차원으로 바꿔서 계산해서 출력한다

cnn활용

물체 인식(Object Detection)
이미지 분할(Segmentation)
자율주행 물체인식
자세 인식(Pose Detection)
화질개선(Super Resolution)
Style Transfer 화장이나 그림으로 바꾸기 화풍으로 바꾸기
사진 색 복원(Colorization)

AlexNet

의미있는 성능을 낸 첫 번째 합성곱 신경망
딥러닝에 많은 기여

VGGNet

큰 특징은 없는데 엄청 Deep한 모델
딥러닝 엔지니어들이 처음 모델을 설계할 때 전이 학습 등을 통해서 가장 먼저 테스트하는 모델
간단한 방법론으로 좋은 성적을 낸다

GoogLeNet(=Inception V3)

한 가지의 필터를 적용한 합성곱 계층을 단순히 깊게 쌓는 방법도 있지만, 하나의 계층에서도 다양한 종류의 필터, 풀링을 도입함으로써 개별 계층를 두텁게 확장한 모델
인셉션 모듈에서 주의깊게 보아야할 점은 차원(채널) 축소를 위한 1x1 합성곱 계층 아이디어입니다. 또한 여러 계층을 사용하여 분할하고 합치는 아이디어는, 갈림길이 생김으로써 조금 더 다양한 특성을 모델이 찾을 수 있게하고, 인공지능이 사람이 보는 것과 비슷한 구조로 볼 수 있게 합니다. 이러한 구조로 인해 VGGNet 보다 신경망이 깊어졌음에도, 사용된 파라미터는 절반 이하로 줄었습니다.

ResNet

레이어를 늘렸더니 학습이 안되고 에러가 나면
레이어를 줄여보거나 레스넷을 사용해 보자

전이 학습 transfer learning

인간이 학습하는 방법을 모사한 방법

학습 속도가 빠르고 (빠른 수렴), 더 정확하고, 상대적으로 적은
데이터셋으로 좋은 결과를 낼 수 있다

모델을 만들기 전에 먼저 기존의 모델들을 써보고
더 잘 맞는 모델을 튜닝하는 방식을 사용하면 좋다

recurrent neural networks RNN 순환 신경망

자연어 처리나 c계열 데이터 처리에 쓰인다

번역모델을 만들때 좋음

다양하고 유연하게 구조를 만들 수 있는게 장점

사진설명 붙이기, 감정분석, 번역, 주식이나 암호화폐의 시세를 예측한다던지, 사람과 대화하는 챗봇을 만드는 등의 다양한 모델을 만들 수 있다

입력과 출력이
하나를 넣고 여러개가 나오는것
많이 넣어서 하나가 나오는것
많이 넣어서 많이 나오는것

이렇게 쓰인다

generative adversarial network GAN 생성적 적대 신경망

생성 모델과 판별 모델을 동시에 사용하는 기술

두 모델이 경쟁하면서 더 좋은 결과가 나오게 된다

서로 발전의 관계가 되어 원본과 구별이 어려운 가짜 이미지가 만들어진다

gan 예시

CycleGAN 풍경 계절 바꾸기

StarGAN 헤어 스타일 바꾸기

CartoonGAN 사진 만화 그림체로 바꾸기

DeepFake

BeautyGAN 화장 메이크업

Toonify Yourself 사진 디즈니 그림체로 바꾸기

실습

-q 압축 풀린거 출력 안 나오게 하기
!unzip -q fruits.zip

레이어

Conv2D

convolution 연산을 위해

MaxPooling2D

서브샘플링할때 맥스 풀링

Flatten

2차원을 1차원으로 펴줄 때

Dropout

전처리

train_df = train_df.astype(np.float32)
x_train = train_df.drop(columns=['label'], axis=1).values
3차원으로 바꿔주는 부분 cnn쓸 때 다른 부분 -1은 데이터셋 크기 28은 이미지 크기 뒤에 1은 그레이 스케일 이미지라 그런다
x_train = x_train.reshape((-1, 28, 28, 1))
y_train = train_df[['label']].values

test_df = test_df.astype(np.float32)
x_test = test_df.drop(columns=['label'], axis=1).values
3차원으로 바꿔주는 부분 cnn쓸 때 다른 부분
x_test = x_test.reshape((-1, 28, 28, 1))
y_test = test_df[['label']].values

원핫 인코딩

일반화

train_image_datagen = ImageDataGenerator(
rescale=1./255, # 일반화
)

train_datagen = train_image_datagen.flow(
x=x_train,
y=y_train,
batch_size=256, #256씩 나눠서 학습 한다 배치
shuffle=True # 순서를 섞어 랜덤성을 준다 성능 약간 향상 있음
)

이미지 증강 기법

train_datagen = ImageDataGenerator(
rescale=1./255, # 일반화
rotation_range=10, # 랜덤하게 이미지를 회전 (단위: 도, 0-180)
zoom_range=0.1, # 랜덤하게 이미지 확대 (%)
width_shift_range=0.1, # 랜덤하게 이미지를 수평으로 이동 (%)
height_shift_range=0.1, # 랜덤하게 이미지를 수직으로 이동 (%)
horizontal_flip=True # 랜덤하게 이미지를 수평으로 뒤집기
)

폴더 안에 라벨 별로 이미지 파일을 넣으면 flow_from_directory에서 알아서 분류를 클래스 별로 해준다
train_gen = train_datagen.flow_from_directory(
'fruits-360_dataset/fruits-360/Training',
target_size=(224, 224), # (height, width)
batch_size=32,
랜덤 시드을 어떻게 섞을 것인가
seed=2021,
라벨이 여러개일 때 categorical 라벨이 하나나 이진 분류일 때 binary
class_mode='categorical',
shuffle=True
)

네트워크 구성

input = Input(shape=(28, 28, 1))

필터의 개수 32 필터의 크기는 3*3 줄여서 3 필터는 한칸씩 옮겨가고 패딩은 same 패딩을 줘서 인풋과 아웃풋의 featuremap의 크기를 똑같이
hidden = Conv2D(filters=32, kernel_size=3, strides=1, padding='same', activation='relu')(input)
Conv2D는 풀링단계를 거쳐야한다 풀사이즈 2 스트라이드 2 차원을 반으로 줄여준다
hidden = MaxPooling2D(pool_size=2, strides=2)(hidden)
필터 개수가 약간 다른데 이건 튜닝을 해가면서 맞춰가야한다
hidden = Conv2D(filters=64, kernel_size=3, strides=1, padding='same', activation='relu')(hidden)
hidden = MaxPooling2D(pool_size=2, strides=2)(hidden)

hidden = Conv2D(filters=32, kernel_size=3, strides=1, padding='same', activation='relu')(hidden)
hidden = MaxPooling2D(pool_size=2, strides=2)(hidden)
1차원으로 펼쳐준다
hidden = Flatten()(hidden)

hidden = Dense(512, activation='relu')(hidden)
오버피팅을 피하기 위해서 드랍아웃 30퍼센트의 노드를 랜덤으로 탈락시킨다
hidden = Dropout(rate=0.3)(hidden)

output = Dense(24, activation='softmax')(hidden)

model = Model(inputs=input, outputs=output)

model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['acc'])

model.summary()

전이 학습

input = Input(shape=(224, 224, 3))
출력레이어 빼기 include_top False
imagenet weights를 쓴다고 해서 weight와 bias 쓰는데 그대로 쓰는건아니고 fit을 하면 weight와 bias가 바뀐다
base_model = InceptionV3(weights='imagenet', include_top=False, input_tensor=input, pooling='max')

학습

모델을 저장했다가 다시 로드하게 콜백
from tensorflow.keras.callbacks import ModelCheckpoint

history = model.fit(
train_gen,
validation_data=test_gen, # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
epochs=20, # epochs 복수형으로 쓰기!
callbacks=[
ModelCheckpoint('model.h5', monitor='val_acc', verbose=1, save_best_only=True)
]
)
model.h5 파일명으로 모델의 웨이트랑 네트워크 구조를 저장
val_acc가 가장 높은거 하나를 저장
save_best_only 저장했다고 출력

post-custom-banner

0개의 댓글