Daylogs/AI

DeepLearning.AI TensorFlow Developer 노트

ohgyun 2021. 2. 9. 00:25

발생일: 2020.11.25

키워드: tensorflow, coursera, 코세라

 

내용:

 

코세라의 TensorFlow Developer 강좌 노트

www.coursera.org/professional-certificates/tensorflow-in-practice

 

(간단하게 기억을 더듬는 용도로 적어둔 노트임)

 


CNN
- DNN (Densed Neural Network), CNN (Convolutional Neural Network)
- loss functions: binary_crossentropy, categorical_corssentropy
- activation functions: relu, softmax, sigmoid
- optimizer: sgd, rmsprops, adam, ...
- callbacks
    - on_epoch_end
- Convolution (Conv2D), Max Pooling
- History: history = model.fit()
- Transfer Learning: Pre Trained Model, In
    - x = keras.layers.Flatten(last_output)
    - Model(pre_trained_model.input, x)
    - lock train: model.trainable = False
- Drop Out
- ImageDataGenerator
    - rescale (normalize image size)
    - flow_from_directory
    - Image Augmentation (shear, zoom, flip, fill_mode, ..)
    - class_mode: binary, categorical

NLP
- Token, Corpus
- Dictionary (=word_index)
- Text (= Sentences) -> Sequences
- oov_token = out of vocabulary
- Padding: pad_sequences
- Word Embedding
    - 단어를 숫자로 표현하는 다른 방식 중의 하나 
    - label 에 따라 비슷한 의미지를 가진 단어를 시맨틱하게 벡터 공간에 표시
    - corpus 에서 특징 추출
- Embedding Weights = (vocab_size, embedding_dimension)
- GlobalPooling1D = 단어 수에 관계없이 pooling
- https://projector.tensorflow.org
    - 벡터(vecs.tsv), 메타데이터(meta.tsv) 를 저장해서 시각화할 수 있음
    - 강의 깃헙
- Sub-words: 단어를 n-gram 으로 토크나이징해주는 기능
    - 단어의 순서가 존재만큼 중요하다
    - oov가 없다
    - 설명링크
- RNN (Recurrent Neural Network)
- Sequence Model: RNN 같은 걸 시퀀스 모델이라고 함
- LSTM (= Long Short - Term Memory)
    - RNN의 한 종류
    - 이전 결과를 유지하면서 학습
- GRU (= Gated Recurrent Units)
    - RNN의 한 종류
- CNN을 사용해서 분류할 수도 있음
- Bidirectional(LSTM())

Sequences
- Time Series data
    - 정해진 시간 단위의 데이터
    - Univarite, Multivarite 해당 시간에 값이 1개, 여러 개
    - 이동 경로 같은 것도 해당(예: 자동차의 시간에 따른 위경도 위치)
    - 데이터 특징, Trend, Seasonaliy, Autocorellation, Noise
- 시계열 데이터의 데이터 분리
    - 시즈널한 특징을 갖는 경우, 연도나 월 단위로 쪼개는 것이 유리
    - 과거 1을 학습 데이터, 과거 2를 검증 데이터, 가장 최근을 테스트 데이터로
    - 1 + 2 를 학습데이터로, 최근을 검증데이터로 한 번 더 학습 가능
- Fixed partitioning vs. Roll-forward partitioning
    - 롤포워드는 기간을 잘게 쪼개서, 하루, 주간 단위로 테스트
    - 짧은 기간부터 시작해 늘려가면서 테스트하는 방식
- 에러 종류
    - mse = mean square error, 에러 총합이 마이너스가 되는 것 방지. 에러가 큰 경우 제곱으로 가중치가 적용됨.
    - rmse = root mse,  루트를 적용해 스케일을 원래 오류와 동일하게 할 목적
    - mae = mean absolute error, 절대값 오류의 합을 평균. 큰 에러나 작은 에러의 편차가 중요하지 않은 경우
    - mape = mean absolute percentage error, 오류의 퍼센트의 절대값으로 평균
- naive forecast
    - 단순히 이전 값으로 예측
    - 이 값을 기준값으로 설정할 수 있음
- Moving Average (이동평균)
    - 단순하지만 노이즈를 줄일 수 있는 방법
    - 트렌드나 주기를 예측하진 않음
    - naive forecast 보다 정확도 낮음
- Moving Average of Differencing (기간 차의 이동평균을 활용)
    - 예를 들어, 1년 전의 값의 차이를 계산하고, Vdiff = (Vt - V(t-365))
    - Vdiff 의 이동평균을 계산 (Vt_diff_average)
    - 이전 날짜에 Vdiff를 이동평균한 값을 더해 다음 값을 예측: V(t-365) + Vt_diff_average
    - Forecasts = moving averaged differenced series + series(t - 365)
    - 이래도 노이즈는 남아있는데, 이럴 때 V(t-365) 대신 과거값을 이동평균한 값으로 사용하면 부드러워짐
    - 즉, forecasts = Vmoving_agerage(t-365) + Vt_diff_average
    - Forecasts = trailing moving average of differenced series + centered moving average of past series(t-365)
    - 과거 값에 centered 이동 평균을 사용했고 (예: 시간 + 5와, 시간 - 5 사이의 평균) 이게 더 정확함. 현재값에 적용할 땐 trailing 이동 평균을 적용했는데, 이건 미래의 값을 알 수 없기 때문
- Deep Learning for Time Series
    - 특정 윈도우 사이즈에 해당하는 시간  x 의 y 값이 input, 다음 시간의 y 값이 label
    - tf.data.Dataset: range, flat_map, map, batch, shuffle...
    - Sequence bias: 시퀀스에서의 순서 편향이 있을 수 있다. 예를 들어, 첫 번째 나온 게 더 익숙하게 느껴질 수 있다. 훈련 데이터는 섞어서(shuffle) 쓰는 게 좋다.
    - callbacks.LearningRateScheduler 를 콜백으로 해서, 적합한 러닝 레이트를 찾을 수 있다.
        - 근데 그냥 adam 으로 설정한 게 더 나은 것 같다?
    - numpy array를 새로 생성할 때: np_array[np.newaxis] 로 생성할 수 있음
- RNN for Time Series
    - RNN에서 텐서플로우의 기본 유닛 개수는 3개 (해서, 배치사이즈 x 유닛 개수의 행렬이 셀의 아웃풋이 됨)
    - 셀의 중간 아웃풋을 생략하고 최종만 가져가는 걸 sequence to vector RNN 이라고 하는데, 이게 기본 동작임
        - 전체 시쿼스를 전달하려면 (sequence to sequence RNN), return_sequences = True 옵션을 쓰면 됨
    - RNN의 input 은 3 dimension
        - batch_size: 정해지지 않은 경우 None 으로 설정하면 됨
        - number_of_timestamp: None 으로 설정하면 길이에 무관하게 처리할 수 있음
        - 변수 개수: univariable 인 경우 1, 여러 개인 경우 숫자만큼
    - RNN의 기본 activation function 은 tan H 임
        - -1 ~ 1 값임
        - 예제에선 실제 학습 데이터가 0~100 사이라서, 람다 레이어에서 결과 값은 100배 해서 스케일을 비슷하게 맞췄음
- Lambda Layer
    - keras.layers.Lambda: 전처리/후처리를 한 플로우 안에서 처리할 수 있음
- Humber loss function
    - 아웃라이어에 덜 민감한 로스 함수
    - MAE 보다는 민감하고, MSE 보다는 덜 민감한 듯
- SimpleRNN vs LSTM
    - SimpleRNN 은 상태값이 다음 셀에만 적용이 돼서 시간이 지날수록(다음 단계로 갈수록) 처음 값의 영향이 작아짐
    - LSTM 은 셀의 상태(Cell State)를 정해진 기간동안 유지할 수 있고, 양방향으로도 처리할 수 있음. 즉 처음 값의 영향이 시간이 지나도 유지됨
- 실습 과제
    - Conv1D + 2 LSTM + 3 Dense layer 로 예측

 

반응형