본문 바로가기

멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차/DL

4/19 화

728x90

화요일!

 

오늘은 AWS(클라우드 시스템) 사용법에 대해 알아보고, AI 프로젝트 조편성 전 강사님과 면담이 있다.

 

부득이하게 서버 혹은 작업한 내용이 날아갈 수 있으므로, GitHub나 로컬에 매일 백업해놓자!

사용법은 멀캠에서 준 첨부파일들을 참고하자~

 

* 서버 사용 가능한 시간 : 평일 9:00 ~ 18:30. GPU 1개

 

1. AWS 사용자 정보로 접속 → 리전을 도쿄로 변경 → 서비스 창에서 EC2(클라우드의 가상 서버) 검색 후 클릭 → 배정받은 서버(인스턴스) 정보 확인 후 팀별로 할당된 서버 선택 → 팀원 한 명이 매일 아침 서버 동작(인스턴스 상태) 확인 후 서버 실행(인스턴스 시작)

https://multicampus-aws.signin.aws.amazon.com/console

 

2. 암호화 키(원격 서버 접속용. 확장자 pem, ppk)를 로컬에 저장 → PuTTY 사이트에서 PuTTY(64bit, 원격 콘솔 프로그램) 설치 ↓ → PuTTY 실행 → 사용자별로 부여받은 서버 IP와 Saved Sessions 입력 및 암호화 키 업로드(SSH_Auth에 ppk 업로드 → Session 돌아가 저장) → Open 버튼 클릭 후 최초 접속 시 예(Y) 클릭

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

 

3. Terminal(PuTTY) 접속 ID 입력 후 enter → 아나콘다 가상 환경 목록 검색 후 새로 만들어 실행 : conda info --envs, conda create -n [가상환경 이름] python=3.8 openssl → 새로운 가상환경에 필요한 라이브러리들 설치 ↓ → 주피터 노트북 환경설정 파일 생성 → vi editor로 환경설정 파일 수정(경로 입력) → 주피터 노트북 사용을 위한 명령어 입력

conda create -n machine_TF2_'출석번호' python=3.8 openssl
conda activate machine_TF2_'출석번호'
conda install numpy pandas matplotlib nb_conda tensorflow
pip install sklearn
pwd # 경로 확인
jupyter notebook --generate-config # 환경설정 파일 생성
mkdir jupyter_home # 폴더 생성
ls # 파일들 확인
cd .jupyter # 경로 진입
vi jupyter_notebook_config.py # 환경설정 파일 수정
:/notebook_dir # notebook_dir 검색
i # 키보드, 입력(insert) 활성화
'/home/lab18/jupyter_home' # 앞에 공백과 주석 지우고 <- '~' 입력
Esc # 키보드, 입력 비활성화
:wq # 저장하고 나가기
jupyter notebook --ip=0.0.0.0 --no-browser --port=포트번호 # 포트번호 입력하여 주피터 보트북 사용
# (jupyter notebook --ip=0.0.0.0 --no-browser --port=8918)

 

4. PuTTY 종료하고 크롬에 서버 접속 IP:포트 입력 후 접속 → 원격 서버로 파일 전송하기 위해 FileZilla Client 설치 ↓ 및 실행 → 좌측 상단의 사이트 관리자 열기 → New site 만들고 프로토콜 : SFTP · 호스트 입력 · 로그온 유형 : 키 파일 · 사용자 : PuTTY 접속 ID · 키 파일 : .ppk 선택/입력 후 확인 → 사이트 관리자 열어서 만든 서버 연결 → 로컬 주피터 노트북에 있는 데이터셋을 원격 저장소에 드래그 앤 드롭으로 전송

https://filezilla-project.org/download.php?platform=win64 

 

5. AWS 가상환경에서 Notebook 열고 폴더 구조 만드는 코드(Linux 버전) 실행 → ImageDataGenerator 생성 → model 생성 · compile · 학습

# 폴더구조 생성 및 고양이, 멍멍이 이미지 각 폴더로 복사
import os, shutil

original_dataset_dir = './data/cat_dog/train'

base_dir = 'data/cat_dog_full'
os.mkdir(base_dir)

train_dir = os.path.join(base_dir,'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir,'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir,'test')
os.mkdir(test_dir)


train_cats_dir = os.path.join(train_dir,'cats')
os.mkdir(train_cats_dir)
train_dogs_dir = os.path.join(train_dir,'dogs')
os.mkdir(train_dogs_dir)

validation_cats_dir = os.path.join(validation_dir,'cats')
os.mkdir(validation_cats_dir)
validation_dogs_dir = os.path.join(validation_dir,'dogs')
os.mkdir(validation_dogs_dir)

test_cats_dir = os.path.join(test_dir,'cats')
os.mkdir(test_cats_dir)
test_dogs_dir = os.path.join(test_dir,'dogs')
os.mkdir(test_dogs_dir)

## file 복사 ##
## 고양이와 멍멍이가 각각 12,500개
## train : 7,000 
## validation : 3,000
## test : 2,500 

fnames = ['cat.{}.jpg'.format(i) for i in range(7000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(train_cats_dir, fname)
    shutil.copyfile(src,dst)

fnames = ['cat.{}.jpg'.format(i) for i in range(7000,10000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(validation_cats_dir, fname)
    shutil.copyfile(src,dst)

fnames = ['cat.{}.jpg'.format(i) for i in range(10000,12500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(test_cats_dir, fname)
    shutil.copyfile(src,dst)
    
fnames = ['dog.{}.jpg'.format(i) for i in range(7000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(train_dogs_dir, fname)
    shutil.copyfile(src,dst)

fnames = ['dog.{}.jpg'.format(i) for i in range(7000,10000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(validation_dogs_dir, fname)
    shutil.copyfile(src,dst)

fnames = ['dog.{}.jpg'.format(i) for i in range(10000,12500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname)
    dst = os.path.join(test_dogs_dir, fname)
    shutil.copyfile(src,dst)

 

# keras가 제공하는 ImageDataGenerator
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt

train_dir = './data/cat_dog_full/train'
valid_dir = './data/cat_dog_full/validation'

# ImageDataGenerator 생성
train_datagen = ImageDataGenerator(rescale=1/255)
validation_datagen = ImageDataGenerator(rescale=1/255)

train_generator = train_datagen.flow_from_directory(
    train_dir,               # target directory
    classes=['cats','dogs'], # [0, 1]
    target_size=(150,150),   # image resize
    batch_size=20,
    class_mode='binary'
)

validation_generator = validation_datagen.flow_from_directory(
    valid_dir,               # target directory
    classes=['cats','dogs'], # [0, 1]
    target_size=(150,150),   # image resize
    batch_size=20,
    class_mode='binary'
)

for x_data, t_data in train_generator:
    print(x_data.shape) # (20, 150, 150, 3)
    print(t_data.shape) # (20,)
    break
    
figure = plt.figure()
ax = []

for i in range(20):
    ax.append(figure.add_subplot(4,5,i+1)) # 4행 5열

for x_data, t_data in train_generator:
    print(x_data.shape) # (20, 150, 150, 3)
    print(t_data.shape) # (20,)
    
    for idx, img_data in enumerate(x_data): # enumerate : 첫번째 인자를 인덱스로, 나머지는 데이터로
        ax[idx].imshow(img_data)
    break
    
plt.tight_layout()
plt.show()

 

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam # or RMSprop
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

model = Sequential()

model.add(Conv2D(filters=32,
                 kernel_size=(3,3),
                 activation='relu',
                 input_shape=(150,150,3))) # color!
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(filters=64,
                 kernel_size=(3,3),
                 activation='relu'))
                 
model.add(Conv2D(filters=128,
                 kernel_size=(3,3),
                 activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(filters=128,
                 kernel_size=(3,3),
                 activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(units=256, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))

print(model.summary())

 

model.compile(optimizer=Adam(learning_rate=1e-4),
             loss='binary_crossentropy',
             metrics=['accuracy'])

history = model.fit(train_generator, # 이미지 14000개 / 20개씩 batch = 700번
                   steps_per_epoch=700,
                   epochs=30,
                   validation_data=validation_generator, # 이미지 6000개 / 20개씩 batch = 300번
                   validation_steps=300)

model.save('./data/cats_dogs_full_cnn_model.h5')

 

1. 4/11 월 2. 4/12 화 3. 4/13 수 4. 4/14 목 5. 4/15 금
Deep Learning
Perceptron,
Nueral Network
Deep Learning
Initialization,

ReLU,
Drop-out,
Early-Stopping
Deep Learning
Image,

CNN,
Convolution Layer,
Channel,
Filter,
Stride,
Padding,
Feature Map,
Activation Map
Deep Learning
CNN,

Feature Extraction,
Pooling
Deep Learning
CNN
6. 4/18 월 7. 4/19 화 8. 4/20 수 9. 4/21 목 10. 4/22 금
Deep Learning
Generator
Deep Learning
AWS
Deep Learning
전이학습
Deep Learning

Deep Learning

11. 4/25 월 4/26 화 ~ 5/19 목
Deep Learning

AI 프로젝트

* 프로젝트 구조 미리 생각해두자!

728x90

'멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차 > DL' 카테고리의 다른 글

4/21 목  (0) 2022.04.22
4/20 수  (0) 2022.04.20
4/18 월  (0) 2022.04.18
4/15 금  (0) 2022.04.15
4/14 목  (0) 2022.04.14