반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

순환 신경망에서 Tensor의 이해

다양한 입력과 출력

절결합 계층의 입출력 텐서

 

Rnn의 입력 텐서

순차적으로 들어온다.

입력 N x L x I 입력 텐서의 앞부분을 0으로 채우는 이유는 , 마지막 입력부터는 출력이 잘 나올 수 있다.

출력 N x L x O 출력 은 뒤부분을 0으로 채운다.

 

 

순환 신경망의 학습법

BPTT: Backpropagation through time  시간 펼침 역전파

입력 N x L x I  

배치로 나눈 학습 데이터 (B x L x I)

시간적으로 펼치면서 계산해야 하는 점을 제외하면 , 보통의 역전파와 동일한다.

배치로 피우기 힘들다. 펼침을 하나씩 더해야 하기 때문에 휠씬 메모리가 필요한다.

다중 입력, 다중 출력  => Truncated BPTT데이터 입력 쪼개서 한다.

Truncated 사이에는 역전파가 이루어지지 않는다.

 

Rnn Embedding을 사용한다. 

몇개의 word를 사용하는지 one-hot encoding사용한다.

특정단어들이 one-hot 으로 하면 안되서 실수쪽으로 가져오기 위해서 길이가 만든 feature vector를 바꿔주는 것이다.

 

 

tensorflow IMDB data load

import tensorflow as tf
imdb = tf.keras.datasets.imdb
(X_train, y_train) ,(X_test, y_test) = imdb.load_data(num_words = 10000) # 10000 개 데이터 가져오기

# 특정 길이 짤라야 하고 앞쪽에 padding을 한다.
X_train = tf.keras.preprocessing.sequence.pad_sequences(X_train, 
                                                       value = 0,
                                                       padding ='pre',
                                                       maxlen= 32)
X_test = tf.keras.preprocessing.sequence.pad_sequences(X_test, 
                                                       value = 0,
                                                       padding ='pre',
                                                       maxlen= 32)

 

Attention 기법

sequence-to-sequence model => seq2seq 번역 문제를 학습히기 위해 널리 사용되고 있는 rnn구조

encoder ->context -> decoder

 

영어 문장의 데이터화

Tokenizer와 Embedding이 필요하다.

단어 분리  , 문장주호 제거

Tokenizer:  단어들을 숫자로 바꾼다.

Embedding :  

 

한글 문장의 데이터화

형태소 분석 , 문장부호 제거 가 필요하다.

Tokenizer와 Embedding이 필요하다.

 

RNN 문제점

Gradient Vanishing기울기 소실 : 입출력 연관 관계가 멀리 떨어져 있으면 기울기 소실이 일어나 학습이 잘 되지 않는다.

멀리 떨어지면 기울기 소실 일어난다.

-> 해결법:

전에는 context하나 전달하였지만 Encoder hidden state를 모아서 Decoder로 각각 전달하면 기울기 소실을 해결할 수있다. 새로운 context뽑아서 사용가능하다. 적은 step 타고 간다.

효율적으로 하는것이 Anttention mechanism이다. 

서로 서로 연관있게 학습니다.  어디에 집중해야 하는지 집중하는것

 

Attention  신경망

Query: 질의 찾고자 하는 대상

key: 키 . 저장된 데이터를 찾고자 할 때 참조하는 값

value : 값 저장되는 데이터

Dictionary : key - value pair로 이루어진 집합 쌍으로 연결 

Query 로 해서 비교 하고 값 출력한다.

 

Attention mechanism query key-value사용 

query key비교해서 유사한지  날리고 원하는 유사도가 높은 것을 value로 묶어서 한다.

Attention 모델에선느 key와 value를 같은 값 사용

decoder에서 찾을 려고 할때 찾을 수 있는것은 encoder단이다.

encoder layer에서 필요한 key-value encoding해서 feature vector로 가지고 있는것이기 떄문에 decoder에서 는 encoder쪽을 참조로 하겠다.

전의 hidden layer가지고 사용한다.

출력은 유사도 가 되고 value를 섞어서 결과 출력 

Attention  value 를 concatenate하여 입력한다.

 

Attention 

Transformer 구조 사용

Transformer 어느 위치에 사용했는지 알아야 해서 position 을 사용

RNN으로 되여있어서 순차적으로 되여있다.

병렬적으로 일어나서 조금씩 다르다.

 

 

Word Embedding

Positional Encoding: 시간적 위치별로 고유의 Code 를 생성하여 더하는 방식

위치 에 있는 것

 

scaled Dot - Product Attention

Query , Key Value의 구조를 띄고 있음

softmax이용

 

Multi-Head Attention

Linear 연산 

head를 여러개 

h개의 Attention Layer 를 병렬적으로 사용 - 더 넓은 계층

Linear하면서 차원이 줄어들었다.

 

Masked Multi-Head Attention

Self Attention key 와 value가 같다.

 

Position-wise Feed-Forward

one-hot 

단어의 개수 

단어 하나마다 입력을 여서 출력이 나온다. 병렬적으로 사용해서 

 

Layer normalization   : 

batch영향을 받지 않는 것 

 

Attention mechanism

weighted sum을 많이 사용한다.

키와 value의 쌍이 있다.

 

Encoder입출력

encoder 출력을 key value로 넣기

입력 sequence 길이 n 

 

출력 sequence 길이 m -> 언어가 달라질 수 있어서 따로 변수로 한다.

Positional Encoding 시간적 위치별로 고유의 Code를 생성하여 더하는 방식

상대적 이치가 달라진다.

동시에 계산할수 있다는 것이 병렬 연산 transformer network에 중요한 역할

 

konlpy -> korean nature 

pip install konlpy

Okt -> 트위트에서 만든 페키지 형태소 분석

okt.morphs()->형태소 분석

Tokenizer() -> 몇개까지 fitting을 해준다.

각 단어들을 숫자로

ground truth -> test의 정답

 

과적합의 해결

overfitting 너무 과하게 fitting 

학습 데이터에 너무 fitting되여 있어서 test데이터에 성능이 떨어진다.

 

dataset

train data : 모델 학습 

validation data : 학습이 잘 되는지 검증

test data : 학습이 끝난후 모델 평가 -> 공정하게 하는 것 

1. early stopping: 감소하지 않으면 중단한다.

2. droup out : fully connect에서 몇개 제거하는 방법

3. Batch Normalization 

 

정규화 기법 Regularization:

알고리즘의 일반화 Generalization 를 개선하려는 모든 기법

정규화 기법을 도입하면서 loss값이 감소하는 것을 기대하면 안된다. => loss값을 증가하는 추세가 보인다.

loss training 에서 감소하지 않아도 validation에서 감소하는 목적을 하기 위하여 

흔히 최적화에 추가적인 손실 함수를 추가하는 것을 정규화 기법이라 부른다.

 

Weight Decay

 Weight의 l-2 Norm 을 최소화하는 정규화 기법, Weight가 지나치게 커지는 것을 막는다.

영상 복원문제 

VGG Loss : Vgg 16의 Feature만 사용

SSIM 화질 평가 기법 Structural Similarity Index

 

 

반응형

'교육동영상 > 01. 딥러닝인공지능' 카테고리의 다른 글

10. 합성곱 신경망 구현  (0) 2020.12.04
09. 딥러닝 기초-2  (0) 2020.12.04
08. 딥러닝 기초  (0) 2020.12.02
07. 이미지 분석 pytorch  (0) 2020.12.01
06. 이미지 분석 tensorflow 2.0  (0) 2020.11.25
반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

 

 

WARNING:

tensorflow:Layer mymodel_2 is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2. The layer has dtype float32 because its dtype defaults to floatx. If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2. To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.

해결방법:

X_train= X_train[..., tf.newaxis].astype(np.float32)
X_test= X_test[..., tf.newaxis].astype(np.float32)

 

 

Residual Unit 개발 주의 할점

Pre-Active

batch normalization  ->relu -> conv

채널 개수 같아야 한다.

학습 할때는 training = True

test할 떄는 training = False

 

 

DenseNet 개발 주의 할점

concatenate

concatenate([input, batch normalization ->relu -> conv ])

growth rate

학습 할때는 training = True

test할 떄는 training = False

 

순차 데이터의 이해

순서가 의미가 있으며, 순서가 달라질 경우 의미가 손상되는 데이터를 순차 데이터라고 한다.

 

Resampling  : 일정한 간격으로 다시 samping해주면

 

심층 신경망과 순차 데이터

 

 

다중 입력, 단일 출력

다중 입력, 다중 출력

단일 입력, 다중 출력

 

 

 

 

Memory System => 그 전의 내용을 기억해야 한다.

Memoryless System 무기억 시스템 :

  shallow neural network 이전 입력에 영향을 받지 않는다. 출력에도 영향을 받지 않는다.

 

 

vanilla Recurrent Network: 기본적인 순환 신경망 

얕은 신경망 구조에 '순환'이 추가된 것으로 

이전의 모든 입력에 영향을 받는다.

기울기 소실 문제 때문에 잘 사용하지 않는다.

 

multi-layer RNN: 다중 계층 순환 신경망

권장되는 구조는 아니다. 학습이 잘 되지 않는다.

 

LSTM LONG Short-Term Memory

필요한 시간 만큼 기억한다.

Cell State가 추가 됬다. -> 오래동안 기억을 잘 하기 위해서  덧셈

Hidden State -> 출력 

Forget Gate -> sigmoid로  얼만큼 잊을 지 결정

 0 이 곱해진것은 잊어버리고 1곱한것은 남는다.

Input Gate  -> sigmoid 새롭게 추출한 특징을 얼만큼 사용할 지 결정

  얼마큼 기억할 것인지

Output Gate -> sigmoid Cell 로부터 출력을 얼마나 내보낼지 결정 

 

GRU Gated Recurrent Unit

 LSTM을 간소화한 버전 

Cell state가 없고, hidden state만 존재

Forget Gate와 Input Gate합쳐졌다.  -> Forget Gate를 사용 

 잊은것을 채워주는  기억을 어떻게 할것인지

Reset Gate sigmoid 곱해진다. 새로운 Feature를 뽑기전에 기억을 얼마나 죽여줄지 

 

 

순환 신경망은 기본 역전파 학습법으로는 학습할 수없다.

순차 데이터셋의 구조

순차 데이터 -> 순환 신경망

순방향 추론  : 입력을 여러번 해주면 마지막 출력이 나온다.

 

시간 펼침 역전파 Back Propagation Through Time

사이의 미분을 다 알아야 한다.

시간적으로 펼쳐진 변수들은 동일한 변수라는 점에 유의해야 한다.

All -Zero 입력

 

 

LSTM LONG Short-Term Memory

Cell state, hidden state, forget gate, input gate, output gate , hidden state
forget gate input gate Cell state output gate hidden state

forget gate 기억을 '잊고자 하는 정도'를 나타낸다. 

simoid activation 이므로 값의 범위는 0~1이다.

특징별로 기억할지 말지를 결정할 수 있다.

input gate : 새로운 입력을 받고자 하는 정도를 나타낸다. sigmoid activation 이므로 값의 범위는 0~ 1이다.

특징은 여러 차원으로 되어있으므로 , 특징별로 받아들일지 말지를 결정할 수 있다.

Cell state '기억'을 총괄하는 메모리 역할을한다. 여러 차원으로 되어있어 , 각차원은 특정 정보를 기억한다.

hadamard연산자의 특성으로 인해 , 특징 별로 기억하고 , 잊고 ,새로이 정보를 받을 수 있다.

output gate 는 cell state중 어떤 특징을 출력할지 결정하는 역할을 한다. sigmoid

hidden state Cell state에 tanh activation을 적용한 후, output gate로 선별하여 출력한다.

tanh -1~1로 bound되게 하기 위함이다.

 

GRU수식

Reset gate  forget gate hidden state

Reset gate :  hidden state중 어떤 특징을 reset할지 결정한다.

forget처럼 바로 잊어버리는것이 아니고 

기억을 해야 하지만 큰 맥락에서는 feature를 뽑는 방해가 되는것이 있을 수 있다.

forget gate: 이전 time 의 hidden state를 잊어버린다 . 1- 에서 빼준다.

hidden state: 이전 reset gate,forget gate를 모두 적용하여 hidden state를 계산한다. 

제어가 된만큼 넘어오고 입력과 이전 time의 reset gate를 정의해서 reset gate에의해서전에것

잊어버리고 다시 한다.

계속 누적해서가 아니고 이전의 잊어버린 만큼만 하기 때문에 tanh가 필요없다.

반응형

'교육동영상 > 01. 딥러닝인공지능' 카테고리의 다른 글

11 . 순환 신경망  (0) 2020.12.07
09. 딥러닝 기초-2  (0) 2020.12.04
08. 딥러닝 기초  (0) 2020.12.02
07. 이미지 분석 pytorch  (0) 2020.12.01
06. 이미지 분석 tensorflow 2.0  (0) 2020.11.25
반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

 

의존성이 있는 함수의 계산:

서로 서로 계산에 관계가 있다.

단점은 : 중복되는 연산이 있을 수 있다.

 

동적 계획법 : Dynamic Programming -> 알고리즘

첫 계산시 값을 저장하므로 중복 계산이 발생하지 않는다. 

나중에 사용할 것을 미리 저장하고 나중에 사용한다.

피보나치 계산 등 동벅 계획법을 사용하였다.

Recursion(재귀)  

 

연쇄 법칙 Chain Rule:

연속된 두 함수의 미분은, 각 함수의 미분을 연쇄적으로 곱한 것과 같다. 

 

심층 신경망의 미분: 연쇄 법칙을 이용하려면 손실 함수의 미분이 필요하다.

저장해 두었다가 중복 연산을 피할 수 있다.

 

앞쪽으로 미분을 계산하는 것이 역전파 학습 법 : Back-Propagation

 

블랙박스 모델의 학습:

학습 목표 : 손실 함수를 최소화 하는 매개변수를 찾는다.

수치적 기울기:  각 스칼라 변수를 각각 조금씩 바꾸어 대입해 보면서 수치적 기울기를 구한다.

 

fully connect layer:

sigmoid 함수의 미분: 

역전파 알고리즘: BP

 

 

수치미분

 

 

 

 

 

 

python 환경설정

anaconda 로 설치 -window

www.anaconda.com/products/individual#windows

 

Anaconda | Individual Edition

Anaconda's open-source Individual Edition is the easiest way to perform Python/R data science and machine learning on a single machine.

www.anaconda.com

 

 

설치 

 

 

jupyter notebook Launch 한다.

New => Python로 해서 새로운 파일 생성한다.

 

파일이 녹색으로 되여있으면 실행중 이다.

 

 

합성공 연산과 이미지 필터

아날로그 신호처리

LTI 시스템은 선형적이고 시간의 영향을 받지 않는다.

사람은 LTI시스템이 아니다.

 

 

Dirac 델타 함수 

 

 

임펄스 응답 : -> filter

 

Convolution  

함수 두개를 합성해서 곱한다.

두 함수의 곱을 적분하여 계산

겹치는 부분에 적분을 한다.

 

잡음 제거 필터

 

2차원 신호 

흑백 영상은 각 픽셀이 0~1 사이의 실수로 된 2-D 신호로 표현할 수 있다.

컬러 영상은 RGB 3채널로 구성된 2-D 신호로 표현할 수있다.

 

합성곱 계산

양상과 겹치는 부분을 곱한다.

 

 

잡음 제거 필터 :

가우시안 

미분 필터 

 

뉴런: Nureon

input 

weight

bias 

 

Convolutional layer

의미: '특징' 이 나타나는 위치를 찾아내는 것이 다.

특정 위치의 값을 크게 해주는 것이다.

 

 

pooling layer: 영상의 크기가 줄어들고 , 정보가 종합된다.

average, max

flatten  : 아무런 연산도 안일어난다고 생각하면 된다.

fully connected layer: 추출한 특징을 얕은 신경망을 사용하는 것과 동일하다.

 

Receptive Field: input 영상이 있을 경우 얼마만큼 차지하는 범위

 

 

LeNet - 5 : 98년도 

VGG-16: 2014년도 

 

 

Convolutional layer

Feature map

 

padding

zero-padding

 

stride 하나씩 거너뛰여서 한다. 출력의 크기가 줄어든다.

pooling

 

 

배치 정규화 

vanilla gradient descent 

 

stochastic gradient descent SGD: 

gradeint 를 한번 업데이트 하기 위해 일부의 데이터만을 사용한다.

 

 

mini batch 학습법

학습데이터 전체를 한번 학습하는 것을 epoch

한번 gradient를 구하는 단위를 batch라고 한다.

 

Internal Covariate shift

 

 

Batch Normalization : 정규분포 

 

Training Phase:

학습 단계에서 들어갔을 경우 , 정규화를 한다. 

각 배치별로 계산 

 

Batch Normalization -> Relu하면 0아래 다 날라서  그래서 결정 해주는 것이 있다. 

Batch Normalization로 인해 , 모든 계층의 Feature 가 동일한 Scale이 되어 학습를 경쟁에 유리하다.

 

 

추론 단계 Inference Phase:

 

training 으로 아니면 test로 하는지 

 

합성공 신경망 역사 

 

GoogLeNet(Inception) -> 복잡하다.

Inception 모듈

 다양한 feature를 나누어서 학습한다.

 Bolleneck구조 : 연산량을 줄이기 위해 1x1 합성곱 계층. 이러한 구조  줄어든 개수의 영역 

   연산량을 줄인다.

 Receptive field를 유지하면서 파라미터의 수와 연산량을 줄였다.

파라미터 수 줄이는것은 연산량을 줄이는 것과 같다.

추가적으로 분류기 달아서 기울기 소실 문제 해결한다.

 

Residual Network

Facebook에서 딥러닝 네트워크

152 layer

skip-connectin :  Feature 를 추출하기 전후 더한다.

Identity Mapping: 

Pre-activation

 

Densely Connected ConvNets DenseNet

중간중간에 Dense를 하나 추가한다.

ResNet의 아이디어를 계승하여 

Dense Block 

Growth Rate  = 4 => 4만큼의 feature를 만든다.

Bottleneck구조 :  급격하기 증가하는 것을 막기 이해 , 연산량을 줄인다.

 

 

반응형

'교육동영상 > 01. 딥러닝인공지능' 카테고리의 다른 글

11 . 순환 신경망  (0) 2020.12.07
10. 합성곱 신경망 구현  (0) 2020.12.04
08. 딥러닝 기초  (0) 2020.12.02
07. 이미지 분석 pytorch  (0) 2020.12.01
06. 이미지 분석 tensorflow 2.0  (0) 2020.11.25
반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

 

 

딥러닝 관련 개념

인공지능: 기계가 사람의 행동을 모방하게 하는 기술

기계학습: 기계가 일일이 코드로 명시하지 않은 동작을 데이터로부터 학습 하여 실행할 수 있도록 하는 알고리즘을 개발하는 연구 분야

딥러닝: 기계학습의 한 분야인 인공 신경망에 기반하여 , 많은 양의 데이터를 학습해 뛰어난 성능을 이끌어내는 연구 분야  => 인공신경망

 

 

빅데이터 : 인공지능, 기계학습 , 딥러닝 걸쳐 있다. 

 

 

딥러닝:

특징 추출 Feature Extraction

특징 백터

 

Classification

Regression

Object Detection

Image Segmentation

Image Super Resolution

Reinforcement Learning

 

기울기 소실 문제 로 두번째 AI Winter

깊이 깊을 수록 기울기 소실 문제 가 생긴다.

 

 

DBN : Deep Belief Network

 

 

신경망

신경 세포 : 

shallow Neural Network

 

인공신경망  : 뉴런이 모여 서로 연결된 형태

 

fully - connected  layer -> Dense Layer

 

얕은 신경망 : 입력, 은닉, 출력의 3가지 계층으로 

 

 

회귀 : 잡음이 있는 학습 샘플로부터 규칙을 찾아 연속된 값을 찾아가는 것 

분류 : 특정 범주로 구분하는 작업

 

 

 

 

입력 계층은 아무런 연산도 일어나지 않는다.

계층의 크기 = Node의 개수 = 입력 Scalar의 수 = 입력 Vector의 길이

 

 

단순 선형 회귀: Linear regression:

데이터를 가장 잘 표현하는 선형식을 찾는 동작

 

 

평균 제곱 오차 : Mean Squared Error

y = [10.5, 3.6]

y= [8.3, 4.6]

 => E = (10.5 - 8.3 ) ^2 + (3.6 - 3.8) ^

 = 5.8

 

 

이진 분류 문제

잘 끝는 선이 Decision Boundary

 

 

 

sigmoid function => 이진 분류 문제 , 확률

값이 작을 수록 0 , 커질 수록 1에 수렴

모든 실수 입력 값에 대해 출력이 정의됨

모든 점에서 미분 가능

입력 값이 0에 가까울 수록 출력이 빠르게 변함

확률 표현

 

 

  

 

 

교차 엔트로피 오차 Cross entropy error : CEE

틀릴 수록 오차가 무한히 증가하는 특징이다.

 

 

 

Multi-class Classification:

어떤 문제인지 표현

one-hot Encoding: 한개의 값만 1이고, 나머지 값은 0으로 표현한느 기법

index elementery가 의미가 있다.

 

 

 

sigmoid vs. softmax

sigmoid는 2가지 클래스를 구분하기 위해 1개의 입력을 받는다.

softmax는 여러개 분류

 

교차 엔트로피 오차

오차를 내는 과정에서는 정답 클래스만 비교하지만, 다중 클래스 분류의 활성화함수인 softmax로 인해 다른 클래스에 대한 학습에도 영향을 준다.

 

 

sigmoid:

def sigmoid(x):
    return 1 / (1 +np.exp(-x))

 

softmax:

def sofmax(x):
    e_x = np.exp(x)
    return e_x / np.sum(e_x)

 

지고 학습: 라벨이 되여있다.

 

학습 매개변수 : 학습 과정에서 값이 변화하는 매개변수 , 이 값이 변화하면 알고리즘 출력이 변화

 

손실함수: 알고리즘이 얼마나 잘못하고 있는지를 표현하는 지표

 

경사하강 학습법 :

최적화

손실함수를 최소로 하는 입력값(최적값)을 찾아내는 연구 

 

Brute-Force: 무차별 대입법

가능한 모든 수를 대입해 보는 방법

 

경사는 기울기(미분, Gradient)를 이용해 계산한다.

 

볼록 함수 Convex Function: 어디서 시작하더라도 경사 하강법으로 최적 값에 도달 할 수 있다.

 

 

분석적 방법: 함수의 모든 구간을 수식으로 알 때 사용하는 수식적인 해석 방법

수치적 방법: 함수의 형태와 수식을 알지 못할 때 사용하는 계산적인 해석 방법

 

 

기울기는 스칼라를 백터로 미분한 것이며 , 벡터의 각 요소로 미분하면 된다.

비볼록 함수 : Non-convex Function

 

안전점 saddle point은 기울기가 0이 되지만 극값이 아닌 지점을 말한다.

 

관성 momentum:  local minimum과 잡음에 대처할 수있다.

이전 기울기에 영향을 받도록 하는 방법

속도를 기억하면서 관성 계수를 곱해서 다음에 영향을 준다.

이동 vecotr를 추가로 기억해야 해서 메모리 2배 

 

AdaGrad: 변수별로 학습률ㄹ이 달라지게 조절하는 알고리즘

계속 누적해서 커져서 학습이 오래 진행되면 더 이상 학습이 이루어지지 않는 단점이 있다.

한번 커지면 줄어지지 않는다. 

그래서 RMSProp : AdaGrad의 문제점을 개선한 방법으로 , 합 대신 지수 평균을 사용

Adam: Adaptive moment estimation: RMSProp 과 Momentum 의 장점을 결합한 알고리즘

Adam최적화 방법은 sota 이며 , 딥러닝에서 가장 많이 사용된다.

 

shallow Neural Network:

가장 단순하고 얕은 (은닉 계층이 하나) 인 구조

Deep Nerual Network:

보통 layer가 5개 이상 

 

은닉 계층 추가 = 특징의 비선형 변환 추가

입력을 추가하면서 점점 linear하게 생긴다.

학습 매개변수의 수가 계층 크기의 제곱에 빌{

sigmoid활성 함수 동작이 원할하지 않음 =>ReLU 도입 필요

 

반응형

'교육동영상 > 01. 딥러닝인공지능' 카테고리의 다른 글

10. 합성곱 신경망 구현  (0) 2020.12.04
09. 딥러닝 기초-2  (0) 2020.12.04
07. 이미지 분석 pytorch  (0) 2020.12.01
06. 이미지 분석 tensorflow 2.0  (0) 2020.11.25
05. Tensorflow 2.0 Pytorch  (0) 2020.11.24
반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

 

pytorch seed

torch.manual_seed(seed)

 

 

tensorflow

(28,28,1)

pytorch

(1,28,28)

 

np.argmax() => 최대로 보여주기

 

전처리 함수

torchvision으로 전처리 한다.

image = Image.open(path)

np.array(image).shape

 

 

 

pytorch image preprocessing

중간으로 짜르기

torchvision.transforms.CenterCrop(size = (300,300))(image)

ColorJitter

FiveCrop  => 5개 모양으로 바꿔진다. list형태로 

Grayscale =>grayscale로 바꾸기

Pad( ) =>padding추가 가능

RandomApply() => 비율로 한다.

RandomChoice() => 위의 것을 random하게 선택

RandomCrop() =>자동으로 crop한다.

RandomGrayscale() => random하게 가져온다.

RandomHorizontalFlip() =>random으로 한다.

Resize() => resize해준다.  처음 부터 다르면 input안되서 resize해주고 하는것이 좋다.

RandomErasing() =>없에기

 

transpose(1,2,0) => plt사용할 경우

 

반응형

'교육동영상 > 01. 딥러닝인공지능' 카테고리의 다른 글

09. 딥러닝 기초-2  (0) 2020.12.04
08. 딥러닝 기초  (0) 2020.12.02
06. 이미지 분석 tensorflow 2.0  (0) 2020.11.25
05. Tensorflow 2.0 Pytorch  (0) 2020.11.24
04. 인공지능에 대한 개념과 준비  (0) 2020.11.23
반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

 

 

이미지 전처리

augmentation

 

 

python glob # 경로 너주면 한번에 읽어오기 

os.lisdir() 과 glob차이 :

os.listdir() => 하위에 있는 파일 다 읽어 온다.  파일 명만 가져온다.

glob.glob() => 필요한 파일 가져올 수 있다.

 

 

데이터 분석

 

 

 

How to download MNIST images as PNGs?

import gzip
f = gzip.open('./dataset/MNIST/raw/train-images-idx3-ubyte.gz','r')

image_size = 28
num_images = 5

import numpy as np
import matplotlib.pyplot as plt

f.read(16)
buf = f.read(image_size * image_size * num_images)
data = np.frombuffer(buf, dtype=np.uint8).astype(np.float32)
data = data.reshape(num_images, image_size, image_size, 1)
image = np.asarray(data[2]).squeeze()
plt.imshow(image)

 

 

stackoverflow.com/questions/55049511/how-to-download-mnist-images-as-pngs

 

How to download MNIST images as PNGs

I want to download the MNIST images to my computer as PNG files. I found this page: http://yann.lecun.com/exdb/mnist/ After I pressed: train-images-idx3-ubyte.gz: training set images (9912422 bytes)

stackoverflow.com

github.com/myleott/mnist_png/blob/master/convert_mnist_to_png.py

 

myleott/mnist_png

MNIST converted to PNG format. Contribute to myleott/mnist_png development by creating an account on GitHub.

github.com

 

import os
import struct
import sys

from array import array
from os import path

import png

# source: http://abel.ee.ucla.edu/cvxopt/_downloads/mnist.py
def read(dataset = "training", path = "."):
    if dataset is "training":
        fname_img = os.path.join(path, 'train-images-idx3-ubyte')
        fname_lbl = os.path.join(path, 'train-labels-idx1-ubyte')
    elif dataset is "testing":
        fname_img = os.path.join(path, 't10k-images-idx3-ubyte')
        fname_lbl = os.path.join(path, 't10k-labels-idx1-ubyte')
    else:
        raise ValueError("dataset must be 'testing' or 'training'")

    flbl = open(fname_lbl, 'rb')
    magic_nr, size = struct.unpack(">II", flbl.read(8))
    lbl = array("b", flbl.read())
    flbl.close()

    fimg = open(fname_img, 'rb')
    magic_nr, size, rows, cols = struct.unpack(">IIII", fimg.read(16))
    img = array("B", fimg.read())
    fimg.close()

    return lbl, img, size, rows, cols

def write_dataset(labels, data, size, rows, cols, output_dir):
    # create output directories
    output_dirs = [
        path.join(output_dir, str(i))
        for i in range(10)
    ]
    for dir in output_dirs:
        if not path.exists(dir):
            os.makedirs(dir)

    # write data
    for (i, label) in enumerate(labels):
        output_filename = path.join(output_dirs[label], str(i) + ".png")
        print("writing " + output_filename)
        with open(output_filename, "wb") as h:
            w = png.Writer(cols, rows, greyscale=True)
            data_i = [
                data[ (i*rows*cols + j*cols) : (i*rows*cols + (j+1)*cols) ]
                for j in range(rows)
            ]
            w.write(h, data_i)

input_path = './dataset/MNIST/raw/'
output_path = './dataset/MNIST/pngFile/'

for dataset in ["training", "testing"]:
    labels, data, size, rows, cols = read(dataset, input_path)
    write_dataset(labels, data, size, rows, cols,
                    path.join(output_path, dataset))

 

 

label 가져오기

def get_label(path):
    class_name = path.split('/')[-2]
    label = int(class_name)
    return label

get_label(path)

 

h, w = image.shape

 from tqdm import tqdm_notebook => 어디 까지 진행했는지 알 수 있다.

for path in tqdm_notebook(data_paths):  => 사용법

 

 

plt평균값 보여주기

plt.axvline(np.mean(heights), color='r', linestyle='dashed' , linewidth = 2)

 

unique 한 값 찾기

np.unique(heights)

 

 

메모리 문제 때문에 batch size만큼 짤라서 번갈아가면서 넣어준다.

 

4차원(batch, height, width, channel)

 

 

ImageDataGenerator

width_shift_range => 좌우로 변동 0.2 라면 0.2 range만큼 랜덤으로 바꾼다.

zoom_range  => 위아래 좌우 늘리기 좌우 늘리기

rescale => data normalization

 

ImageDataGenerator를 할 때는 fit_generator() -> 로 학습한다.

 

 

unique 한 개수 도 출력

np.unique(class_names,return_counts = True )

 

DataFrame 

pd.DataFrame() => 데이터 생성

 

 

h,w,c = image.shape

 

tensorflow 함수로 label얻기

tf.strings.split(path, '_')[-1]

 

 

tensorflow image labeling

cls_name = tf.strings.regex_replace(fname, '.png', '') 
cls_name

one_hot_encoding = tf.cast(class_names == cls_name, tf.unit8)

 

 

 

tqdm_notebook을 사용하면 진행도를 수 있다.

예:

tqdm_notebook 사용법

from tqdm import tqdm_notebook

for path in tqdm_notebook(data_paths):
    img_pil = Image.open(path)
    image = np.array (img_pil)
    
    h, w = image.shape
    heights.append(h)
    widths.append(w)

 

 

tensorflow unique 

classes = tf.unique(class_names).y.numpy()
classes

 

 

python current time

datetime.now()

 

history.params => history 파라미터 확인

 

 

tensorboard로 하면 속도가 늦어 질 수 있다.

history 로 볼수 있는데 실시간으로 는 볼수 가 없다.

 

tensorflow Checkpoint

tf.keras.callbacks.ModelCheckpoint(save_path, monitor='val_loss')

 

 

save model

model.save()

model = tf.keras.models.load_model('')

 

 

transfor-leraning을 위해서 

weights저장 가능

model.save_weights('**.h5')

model.load_weights()

 

json으로 저장도 가능

with open('**.json','w') as f:

  f.write(model.to_json())

 

 

h5모델 들여다보기

import h5py

model_file = h5py.File('**.h5','r+')

model_file.keys()

model_file['*.h5'].keys()

 

 

 

 

 

반응형

'교육동영상 > 01. 딥러닝인공지능' 카테고리의 다른 글

08. 딥러닝 기초  (0) 2020.12.02
07. 이미지 분석 pytorch  (0) 2020.12.01
05. Tensorflow 2.0 Pytorch  (0) 2020.11.24
04. 인공지능에 대한 개념과 준비  (0) 2020.11.23
03. python 함수  (0) 2020.11.19
반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

 

tensorflow 2.0 and Pytorch

 

tensorflow 

  • 1.x 에 비해 정말 쉬워졌다. 
  • keras 인수
  • Numpy Array와 호환이 쉬움
  • TensorBoard, TFLite, TPU(구글)
  • 많이 사용하지만 , 하지만 그 전에 많은 모델이 tensorflow 1.X에서 돌아간다.

예를 들어 : GAN 

GPU를 먼저 할당하고 사용한다.

TFLite : 안드로이드 

 

 

pytorch

  • Dynamic Graph & Define by Run
  • 쉽고 빠르면 파이써닉하다. 
  • 어마어마한 성장률

pytorch  기준이 있다. 

pytorch는 공부하는 목적에서 더 쉽다. 

코드 간결하다.

현재 많은 데서 사용한다.

최근 trend에서는 논문에서  거의 pytorch를 사용한다.

파이써닉 파이썬 스러운 코드 

 

tensorflow 

numpy -> Tensor

np.array() 

 

 

tensor

import tensorflow as tf
tensor = tf.constant([1,2,3] , dtype = tf.float32)
tensor

numpy array  type 변경

import numpy as np
arr = np.array([1,2,3] , dtype = np.float32)
arr

arr.astype(np.uint8)

 

tensorflow type 변경

tensorflow 는 unit8로 바꾸기

tf.cast(tensor, dtype=tf.uint8)

tensor to numpy

tensor.numpy()

np.array(tensor)

 

python 난수 생성

np.random.randn()

 

tensorflow 

normal 

uniform 불규칙하게 생성

mnist

(60000, 28, 28) => 60000만개 데이터

print(X_train.shape)

image = X_train[0]
plt.imshow(image,'gray')
plt.show()

3이 없으면 grayscale이라고 한다.

 

차원수 늘리기

1. np.expand_dims(X_train, -1) => 잴 마지막에 차원 늘린다.

reshape도 가능하다.

-1: 마지막에 

0: 잴 앞에 

차원 수 늘리고 싶으면 np.expand_dims(np.expand_dims(X_train, -1) ,0)

 

2. tensorflow tf.expand_dims

new_train_x = tf.expand_dims(X_train, -1)
print(new_train_x.shape)

3. reshape

4. tf.newaxis

display 할때는 두개 있어야 한다.

shape를 줄이는 방식 

np.squeeze() -> np.squeeze(new_train_x[0])

 

 

one-hot Encoding : 컴퓨터가 이해할 수 있게끔 형태로 변환해서 label을 준다.

from tensorflow.keras.utils import to_categorical
to_categorical(5, 10)

 

tensorflow layer 

shape를 확인 먼저 하기 

이미지 개수 , channel 등 

[배치사이즈, height, width, channel]

 

feature extraction : 이미지가 가지는 것을 알아간다.

분류가 되는 것이아니고 

convolution에서는 이미지가 들어간다. weigtht를 쌓으면서 한다.

filters: filter 개수만큼 channel 수가 생긴다. 지금은 채널을 한개 받았다. 몇개 채널이 나오게 되는지 

  weights, filters, channels

kernel_size : 

strides: 몇번 겉이냐 strides 1이면 이미지 전체 사이즈에 변화가 없지만 2이면 절반 줄어들고 한다.

padding : SAME으로 하면 CONVOLUTION을 걸쳐도 이미지 사이즈에 변화가 없다. ZERO PADDING

             VALID ZERO PADDING 없이 사이즈에 영향을 준다. 

activation function  : 없으면 none으로 생각한다.

tf.keras.layers.Conv2D(filters = 3, kernel_size=(3,3), strides=(1,1) , padding = 'SAME' , activation='relu')
tf.keras.layers.Conv2D(3, 3, 1 , padding = 'SAME' , activation='relu')

dtype = tf.float32로 해야 한다. int일 경우 오류가 난다.

 

from tensorflow.keras import datasets
(X_train, y_train),(X_test, y_test) = datasets.mnist.load_data()
image = X_train[0]
image = image[tf.newaxis, ... , tf.newaxis]
print(image.shape)

image = tf.cast(image,dtype = tf.float32)
layer = tf.keras.layers.Conv2D(3, 3, 1 , padding = 'same')
output = layer(image)
output

image가 int일 경우 오류가 나서

image = tf.cast(image,dtype = tf.float32) 

바꾸고 해야 한다.

 

layer weight 가져오기

weight = layer.get_weights()
weight

weight = layer.get_weights()

print(weight[0].shape) #weight

print(weight[1].shape) #bias

 

 

activation

act_layer = tf.keras.layers.ReLU()

act_outpout = act_layer(output)

act_outpout

#shape가 그대로 유지되였다.

np.min(act_outpout), np.max(act_outpout)

 

relu는 0이하이면 0으로 된다.

 

pooling

이미지를 반으로 쪼개서 압축하는 것만 

압축해서 강조 되게 한다.

 

fully connected

하나하나씩 연결한다. 

 

flatten() -> 사이즈는 그데로  유지하면서 쭉 펼쳐진다.

y = wx+b

TensorShape(1,100)

1: 배치 사이즈 

위에 까지 펼쳐졌다. 

 

Dense()

하나씩 연결하겠다는 것이다.

units 개수를 말한다.

몇개 노드를 만들 것인가 

 

Droupout() -> 연결을 끊게 한다.

overfitting되여서 자동으로 끊어준다.

비율을 주면서 한다.

학습이 안되는 것은 골고루 학습하게 한다.

학습 할때는 dropout로 되지만 evaluation할때는 원 상태로 한다. 

학습할때만 잠간 끊어주는 것이다.

 

build model:

input_shape, num_classes 먼저 지정해주는 것이 좋다.

 

loss = 'binary_crossentropy'

loss = 'categorical_crossentropy'

 

tf.losses.sparse_categorical_crossentropy 

tf.losses.categorical_crossentropy #one-hot encoding 줬을 때 

tf.losses.binary_crossentropy

 

metrics 

accuracy를  측정

 

rescaping

X_train = X_train/255 => 0~ 1사이

 

학습할 때 shuffle = True하는게 좋다.

아니면 overfitting 나올 가능성이 있다.

 

 

tensorflow 데이터 활용

import tensorflow as tf
train_ds = tf.data.Dataset.from_tensor_slices((X_train,y_train))
# train_ds iteration 하면 하나하나 나온다.
train_ds = train_ds.shuffle(1000) # buffer size
train_ds = train_ds.batch(32)

test_ds = tf.data.Dataset.from_tensor_slices((X_test,y_test))
test_ds = test_ds.batch(32)

train_ds.take(2) => 2개 가져온다.

 

 

Cannot convert '' to EagerTensor of dtype uint8

 

import matplotlib.pyplot as plt
for image, label in train_ds.take(2):
  plt.title(str(label[0]))
  plt.imshow(image[0,:,:,0],'gray')
  plt.show()

 

tensorflow 2.0에서는 @tf.function을 사용하면 속도가 빨라진다.

 

evaluation & prediction

np.argmax() => 잴 큰 값 

 

pytorch 기초

import torch
nums = torch.arange(9)
nums

numpy() 로 변환이 가능하고 

reshape도 가능하다.

 

 

 

view가 reshape로 변ㅎ하고 있다.

 

AutoGrad 기울기를 준다.

기울기를 줘서 학습한다.

requires_grad = True =>기울기 구한다.

backward() => 역전파

 

with torch.no_grad() => 기울기를 구하지 않는다. test할 때 

 

 

torchvision 으로 

 

tensorflow (batch_size, height, width , channel)

pytorch (batch_size , channel, height, width)

torch.squeeze(image[0]) => 잴 처음에것 없에준다.

 

layer = nn.Conv2d(in_channels = 1, out_channels = 20, kernel_size = 5, stride = 1)

layer.weight

 

nn는 안에 weight가 있고 

function 은 안에 weight가 없다.

nn.Linear()

 

pytorch parameters확인

params= list(model.parameters())

for i in range(8):

  print(params[i].size)

 

optimizer.zero_grad() =>optimizer clear해준다.

모델 안에 데이터 여주고 예측 한다.

 

loss 함수 

F.nll_loss()

 

기울기 계산

loss.backward()

 

optimizer update

optimizer.step()

 

학습 할때 train 모델로 바꿔야 한다.

model.train()

 

 

evaluation

model.eval()

 

 

test 모델일 경우에는

with torch.no_grad():

   

 

tensorflow 와 pytorch code 차이

tensorflow

import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import datasets
from tensorflow.keras.layers import Input, Conv2D, Activation, MaxPooling2D,Dropout , Flatten, Dense
from tensorflow.keras import Model
from tensorflow.keras.optimizers import Adam


(X_train , y_train),(X_test, y_test ) = datasets.mnist.load_data()
X_train = X_train[..., tf.newaxis]
X_test = X_test[..., tf.newaxis]

X_train = X_train/ 255.
X_test = X_test/255.

print(X_train.shape)

input_shape = (28,28,1)
classes = 10
lr_rate = 0.001

inputs = Input(input_shape)
outputs  =  Conv2D(32, (3,3) , padding = 'SAME')(inputs)
outputs = Activation('relu')(outputs)
outputs =  Conv2D(32, (3,3) , padding = 'SAME')(outputs)
outputs = Activation('relu')(outputs)
outputs = MaxPooling2D(pool_size =(2,2))(outputs)
outputs = Dropout(0.5)(outputs)

outputs  =  Conv2D(64, (3,3) , padding = 'SAME')(outputs)
outputs = Activation('relu')(outputs)
outputs =  Conv2D(64, (3,3) , padding = 'SAME')(outputs)
outputs = Activation('relu')(outputs)
outputs = MaxPooling2D(pool_size =(2,2))(outputs)
outputs = Dropout(0.5)(outputs)

outputs = Flatten()(outputs)
outputs = Dense(512)(outputs)
outputs = Activation('relu')(outputs)
outputs = Dropout(0.2)(outputs)
outputs = Dense(classes)(outputs)
outputs = Activation('softmax')(outputs)

model = Model(inputs = inputs, outputs = outputs )
model.compile(optimizer = Adam(lr_rate) , loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])


epochs= 1
batch_size = 32
model.fit(X_train, y_train, batch_size = batch_size, shuffle = True, verbose = 1)

model.evaluate(X_test, y_test, batch_size = batch_size)

 

pytorch

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms

seed = 1
lr_rate = 0.001
momentum = 0.5

batch_size = 32
test_batch_size = 32

epochs =1
log_interval = 100

no_cuda= False

class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.conv1 = nn.Conv2d(1,20,5,1)
        self.conv2 = nn.Conv2d(20, 50, 5, 1)
        self.fc1 = nn.Linear(4*4*50, 500)
        self.fc2 = nn.Linear(500, 10)
        
    def forward(self, x):
        output = F.relu(self.conv1(x))
        output = F.max_pool2d(output,2,2)
        output = F.relu(self.conv2(output))
        output = F.max_pool2d(output,2,2)
        output = output.view(-1, 4*4*50)
        output = F.relu(self.fc1(output))
        output = self.fc2(output)
        return F.log_softmax(output, dim=1)
        
train_set = datasets.MNIST('./dataset' , train = True, download = True, 
              transform = transforms.Compose([transforms.ToTensor(),
                                            transforms.Normalize((0.1307,),(0.3801,))]))

test_set = datasets.MNIST('./dataset' , train = False, 
              transform = transforms.Compose([transforms.ToTensor(),
                                            transforms.Normalize((0.1307,),(0.3801,))]))

torch.manual_seed(seed)

use_cuda = not no_cuda  and torch.cuda.is_available() 
device = torch.device("cuda" if use_cuda else "cpu") 

kwargs = {"num_workers" :1, "pin_memory" : True} if use_cuda else{}

train_loader = torch.utils.data.DataLoader(
    train_set,
    batch_size = batch_size, shuffle = True, **kwargs

)

test_loader = torch.utils.data.DataLoader(
    test_set,
    batch_size = batch_size, shuffle = True, **kwargs

)

model = SimpleModel().to(device)
optimizer = optim.SGD(model.parameters(), lr = lr_rate, momentum = momentum)

for epoch in range(epochs):
    model.train()
    
    for batch_idx, (data,target) in enumerate(train_loader):
        data,target = data.to(device) , target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()
        
        if batch_idx % log_interval == 0:
            print("train epoch: {} [{}/{} ({:.0f}%)]\Loss{:.4f}".format(epoch+1, batch_idx * len(data), len(train_loader.dataset),
                 100. * batch_idx / len(train_loader) , loss.item()))
            
            
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data,target = data.to(device) , target.to(device)
            output = model(data)
            test_loss += F.nll_loss(output, target , reduction = 'sum').item()
            pred = output.argmax(dim = 1, keepdim = True)
            correct += pred.eq(target.view_as(pred)).sum().item()
                               
    test_loss /= len(test_loader.dataset)
                               
    print("Test epoch:average loss {:.4f} , accuracy {}/{} ({:.0f}%)\n".format(test_loss, correct, len(test_loader.dataset),
                 100. * correct / len(test_loader) , loss.item()))
         

 

 

반응형
반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

 

CNN

 

anaconda 

numpy

 

딥러닝 전체 구조도 

1. 데이터  load

2. 데이터  normalization , augmentation

3. load model  (weight, bias 등  학습하면서 feature를 찾는 것이다. ) CNN, ResNet, AlexNet 등 ..

loss, optimizer등 설정 

lr, batch 등 

4. 결과를 result 한다.

평가방법 등 

 

object와 정답을 같이 주고 예측한것과 비교해서 얼마 만큼 틀맀는지 확인 하고 에러률을 최소화 하는 것을 적용한다. 

해답과 label을 비교해서 얼마나 틀렸는지 왜 틀렸는지 본다. 

그런것들로 고쳐가면서 학습한다.

 

프로젝트에서 데이터가 재일 중요하다. 

Prediction : 몇 % 확률로 무엇이다. 확률을 가지고 있다.

loss: 얼마나 틀렸는지 계산한다. 

optimization: 은 얼마나 틀렸는지 를 최소화한다. 

 

딥러닝 용어 

Model : CNN 모델을 학습하고자 하는 것이다. 

Layer : 층

input layer

hidden layer

output layer 

layer 쌓아서 Model이 된다. 

 

layer 너무 깊이 쌓으면 overfitting 이 되기도 쉽고 성능적으로 굉장히 무겁고 오래 걸릴수도 있다.

요즘에는 효율적으로 쌓는 것을 추천한다. 

깊이 쌓아야 feature를 detail하게 할 수 도 있다. 

 

convolutional -> 특징을 뽑는 

layer : input layer hidden layer output layer

input image -> convolutional kernel(filter) 하나하나씩 곱해준다.  -> feature map

feature map : 

 

weight는 학습할려고 하는 대상 ,  데이터마다 다른 weight를 학습 시켜야 한다. data혹은 목적에 따라 weight를 학습 시켜야 한다. 

filter -> 계산을 통해서 더 좋은 성능을 만드는것 filter가 고정된 값이 아니고 바꿔가면서 featrue들을 더 잘 뽑게 할려고 하는것이다.  

kernel -> 

variable

bias 

 

pooling layer -> feature를 뽑은 후 쭐여줄려고 한다. 압축을 한다. 압축

 

optimization: 얼마나 틀렸는지 나오면 모델에 업데이트 하면서 학습을 시키고 나서 최소화로 찾아가는 것이다.

Adam, SGC, 등 

 

activation function :  앞에서 convolution 을 받고  특징을 뽑았으면 음수값이나 불필요한 것 제거한다. ReLU 많이 사용한다. 

softmax: 다중 classification 에서 사용한다. -> one hot encoding 값이 확률로 나타나는 것이다. 

 

결과가 나오면 정답을 유도해서 

얼마나 틀렸는지 계산하는 것이 loss/cost이다. cost function에서 나온 수치가 loss/cost이다. 

 

hypper parameter: 컴퓨터가 스스로 학습을 할 수 없어서 인간이 조절하는 부분이다. 

learning rate: hypper parameter중 하나이다. 

cost를 낮출려고 한다. 

learning rate 너무 작으면 너무 천천히 가서 잴 낮은 곳이 아닌데 착각할 수 있다. 

너무 크면 잴 낮은 것을 찾는 것도 지나칠 수도 있다. 

 

batch size 6만장을 다 넣을 수 가 없어서 몇장을 나누어서 조금씩 넣어준다. 몇장을 넣어 줄것인지를 정하는 것이 배치사이즈이다. 

batch size는 데이터를 나누어서 모델에서  학습한다. 몇장을 넣어주는 것을 정한것이 batch size이다.

epoch 수 만큼 전체 이미지를 반복해서 학습한다.

 

dataset  => train/validation/test 

train set/test set

train set/validataion set / test set 

마지막에 평가 할 떄는 test set으로 확인 한다. 

 

label / Ground Truth => 정답

label 정답을 준다. 

Ground Truth : 

 

cnn

featrue extraction -> 특징을 뽑는 것이다. 특징을 추출하는 것이다. 

특정을 추출하고 fully connected layer에서 결정을 내린다. 

예: 앵무새의 특징  패턴 모양을 가져오고 

딥러닝에서는 어떤 특징을 뽑는지 어렵다. 블랙박스 

점 점 더 갈수록 detail 하게 뽑는다. 

featrue extraction

convolution , pooling , activation 

 

classification

특징들을 딥러닝이 가져온다.

 

convolutional layer :  특징을 강조시킨다. 특징은 어떤 패턴을 말한다. 

pooling layer:  -> 특징을 뽑은 후 수치가 높은 것을 반으로 줄인다. 이미지 압축

  max pooling은 가장 큰 특징을 압축 한다. 

activation layer:  앞 에서 뽑은 특징에서 불필요한것 없앤다.

이 3개 layer를 통해 중요한 부분만 남는다. 

선 하나하나가 y = wx+b 

 

fully connected로 계산해서 예측 하거나 분류한다.

 

LeNet

AlexNet

vgg16

ResNet

DenseNet

어떤것 열결해주고 어떻게 쌓였는지가 중요하다. 

 

shift mouse 우측키를 눌리면 power shell 창이 나온다.

 

tensorflow 설치

pytorch 설치 

cpu 일 경우에는 None로 하면 된다.

 

python 2.7일 경우에는 pip3

python 3.x일 경우에는 pip

 

 

Jupyter notebook key

shift+enter : 실행하고 다음칸으로 넘어간다. 

ctrl+enter: 실행하고 그 자리에 멈추는 것 

Esc : 모드를 바꾼다. 

shift+m: 작업하는 것을 한번에 묶고 싶을 때 선택하고 눌리기 

shift+ctrl+-: 다시 나누어진다. 

esc command 모드에서 d를 두번 누른다. : 셀 삭제하기 

esc -> a : 위에 cell생성

esc -> b : 아래에 cell생성

esc -> m: markdown 문법으로 전환

 

 

Tensor

scalar  

vector  

matrix  

tensor

0차원 숫자가 하나 있는것 int

np.array(1)

scalar하나

 

shape는 모양을 나타나는것

ndim 차원의 개수

 

1차원

np.array([1])

0차원이 모이면 1차원이 된다. 같은 차원 사이즈는 다를 수 있지만 1차원이다. 

2차원 대괄호 2개 

np.array([[1,2]]).shape

import numpy as np

np.array([[1,2],[1,2]]).shape

 

다차원

[[[

3차원

(차원, 2,1)

 

이미지가 size에 따라서 한다.

이미지가 2차원 혹은 3차원 으로 될수도 있고 4차원 으로 될수 도 있다.

이미지 데이터 shape를 먼저 확인 하는게 좋다.

 

numpy 

zeros =>0으로 생긴다.

np.zeros()

ones =>1으로 생긴다.

np.ones()

np.ones() * 5  => 5로 변한다. 

 

array는 1차원으로 생긴다. 그래서 reshape해서 바꾼다.

 

index => numpy에서도 가능하다. 

묶여 있는게 큰것 부터 가져온다. 

slicing 이 가능하다

 

같은 효과가 나오면 좋겠다. 

print(arr[1][2]) 

print(arr[1,2])

 

boolean indexing 

data[data<=0] = 1 

True일 경우 1로 바꿔준다.

 

broadcast

#기준을 0차원으로 준다. 0차원에서 가장 큰 값을 반환한다. 

print(np.max(arr+arr_2,0)) 

1차원에서 재일 큰 값 

print(np.max(arr+arr_2,-1)) 

차원을 axis = -1 로 해도 된다.

print(np.argmax(arr)) # 몇번째의 값이 잴 큰 index 를 반환한다. 
print(np.argmin(arr)) # 몇번째의 값이 잴 작은 index를 반환한다.
print(np.unique(arr)) #unique한 값 반환

 

숫자를 넣으면 바로 int32로 잡아준다.

astype()을 사용해서 datatype을 변환가능

 

dtype   datatype을 확인하기

 

astype('float32')

astype('int8')

astype(np.int32)

 

arr = np.array([[1,2,3],[1,2,3]], dtype =np.uint8)

 

ndim을 통해서 차원수를 return 가능

len(arr.shape)

arr.shape

arr.size

reshape() -> 차원도 바꿔줄 수 있는데 size는 그대로 유지하되 모양을 바꿀수 있다.

reshape(-1) 사이즈에서 남는것 -> 차원 하나만 남긴다. 숫자도 많고 차원이 많을 때 , 마지막 차원에서 남는다. 

 

import numpy as np

arr = np.array([[1,2,3],[1,2,3]])

arr.reshape(-1).shape

 

import numpy as np
arr = np.array([[[1,2,3],[1,2,3],[1,2,2],[1,2,3]]])
print(arr.shape)
print(arr.reshape(-1).shape)

 

import numpy as np
arr = np.array([[1,2,3],[1,2,3]])
print(arr.reshape(-1).shape)

arr = np.array([[1,2,3],[1,2,3]])
print(arr.reshape(1,-1).shape)

arr = np.array([[1,2,3],[1,2,3]])
print(arr.reshape(-1,1).shape)

 

차원수 널리기

reshape사용

 

ravel() -> 1차원으로 바꾸기 -> reshape(-1) 과 같은 작용

arr = np.array([[1,2,3],[1,2,3]])
print(arr.ravel())

arr.ravel() == arr.reshape(-1)

 

np.expand_dims()

차원을 일부러 하나 널리는 경우가 있다.

(54,) -> (54,1)

arr = np.array([1,2,3])
print(arr.shape)

arr = np.expand_dims(arr,0)
print(arr.shape)

arr = np.array([1,2,3])
arr = np.expand_dims(arr,1)
print(arr.shape)

 

 

 

그래프 시각화

학습하는 과정 등을 볼 수 있다.

import matplotblib.pyplot as plt

seaborn

%matplotblib inline #이것을 해주는 것이 좋다 . 아니면 새로 생길 수 있다.

 

 

matplotlib subplot

subplot(행의 개수, 열의 개수, 그중에서 첫번째 ) -> 여기서는 그중에서 첫번쨰는 1부터 시작한다.

plt.subplot(행, 열 , 몇번 째)

 

matplotlib color:

b 파란색

g 초록색

r 빨간색

c 청록색

y 노란색

k 검은색

w 횐색

matplotlib mark:

o 원

v 역삼각형

^ 삼각형

s 네모

+ 플러스

. 점

data = np.random.randn(100)

import matplotlib.pyplot as plt

plt.plot(data , 'k^')
plt.show()

 

matplotlib size

figsize size 조절

plt.figure(figsize=(10,10))

plt.figure(figsize=(10,10))
plt.plot(data , 'k^')
plt.show()

plt.legend() 는 label 을 보여준다. 

 

title 제목

plt.title('Random graph')
plt.xlabel('x')
plt.ylabel('y')

 

그래프 저장하기

jupyter 에서 마우스로 드리그 해서 할 수 있다.

plt.savefig('이름.png')

저장된 위치는 현재 작업하고 있는 위체에 저장된다. 

 

이미지 시각화

from PIL import Image

image_pil = Image.open(path)

image = np.array(image_pil)#image가 array로 된다. 

(세로길이, 가로길이, 차원)

 

image.shape => 이미지는 2차원이지만 rgb 때문에 3차원으로 

 

np.min(image) np.max(image)=> 최대가 255까지인지 확인한다. 다른 데이터 타입을 가질 경우도 있다

 

이미지 보여주기 

plt.imshow(image) => 이미지 보여주기

plt.show()

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
image_pil = Image.open("이미지 경로")
image_wb = np.array(image_pil)
image_wb.shape

plt.imshow(image_wb)
plt.show()

image 흑백으로 열기

image_pil = Image.open(path).convert("L")

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
image_pil = Image.open("이미지 경로").convert("L")
image_wb = np.array(image_pil)
print(image_wb.shape)

plt.imshow(image_wb,'gray')
plt.show()

gray로 해야 흑백색으로 나온다.

 

RdBu => redblue

jet => 재일 흔히 많이 사용한다.

Colorbar 추가하기

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
image_pil = Image.open("이미지 경로").convert("L")
image_wb = np.array(image_pil)
print(image_wb.shape)

plt.imshow(image_wb,'jet')
plt.colorbar()
plt.show()

이미지 크기 조절 가능하다. 

plt.figure(figsize=(10,10))

 

python image size 줄이기

image_pil = Image.open("image_1경로")
image_1 = np.array(image_pil)

image_pil = Image.open("image_2경로")
image_2 = np.array(image_pil)

print(image_1.shape)
print(image_2.shape)

import cv2
image_1 = cv2.resize(image_1,(215,223))
print(image_1.shape)

image_2 = cv2.resize(image_2,(215,223))
print(image_2.shape)

 

resize할 때 tuple로 줘야 한다.

 

주의할 점: resize는 tuple로 준다.

 

plt.subplot(221) = plt.subplot(2,2,1)

 

python image 합차기 

alpha값을 조정하여 할 수 있다.

 

plt.imshow(image_1)
plt.imshow(image_2, alpha =0.5)
plt.show()

subplot을 사용 가능한다.

plt.subplot(2,2,1 ) 혹은 plt.subplot(221)

반응형

'교육동영상 > 01. 딥러닝인공지능' 카테고리의 다른 글

06. 이미지 분석 tensorflow 2.0  (0) 2020.11.25
05. Tensorflow 2.0 Pytorch  (0) 2020.11.24
03. python 함수  (0) 2020.11.19
02. python 조건문, 반복문  (0) 2020.11.19
01. Python Programming  (0) 2020.11.13

+ Recent posts