티스토리 뷰
발생일: 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 로 예측