화요일!
오늘은 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 전이학습 |