njs03332 / ml_study

3 stars 0 forks source link

2023/03/31 ~ 2023/04/13 #64

Open njs03332 opened 1 year ago

njs03332 commented 1 year ago
njs03332 commented 1 year ago

assign roles -s 0331 -c 13.1.3~4 13.1.5 13.1.6

njs03332 commented 1 year ago
0 1 2
member 김유리 주선미 한단비
chapter 13.1.3~4 13.1.5 13.1.6
danbi5228 commented 1 year ago

13.1.6 tf.keras와 데이터셋 사용하기

파이프라인 생성하기

앞서 정의한 csv_reader_dataset 함수로 훈련/검증/테스트 세트 데이터셋 생성

train_set = csv_reader_dataset(train_filepaths) valid_set = csv_reader_dataset(valid_filepaths) test_set = csv_reader_dataset(test_filepaths)

model = keras.models.Sequential([ keras.layers.Dense(30, activation="relu", input_shape=X_train.shape[1:]), keras.layers.Dense(1), ])

model.compile(loss="mse", optimizer=keras.optimizers.SGD(learning_rate=1e-3)) model.fit(train_set, epochs=10,validation_data=valid_set) model.evaluate(test_set) new_set = test_set.take(3).map(lambda X, y: X) # 새로운 샘플이 3개 있다고 가정 model.predict(new_set) # new_set은 레이블이 없음 (있어도 케라스가 무시함)

case1. 자신만의 훈련 반복 수행; 경사 하강법 수행 가정

for X_batch, y_batch in train_set: global_step += 1 print("\rGlobal step {}/{}".format(global_step, total_steps), end="") with tf.GradientTape() as tape: y_pred = model(X_batch) main_loss = tf.reduce_mean(loss_fn(y_batch, y_pred)) loss = tf.add_n([main_loss] + model.losses) gradients = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables))

case2. 전체 훈련 반복을 수행하는 텐서플로 함수 생성

@tf.function def train(model, n_epochs, batch_size=32, n_readers=5, n_read_threads=5, shuffle_buffer_size=10000, n_parse_threads=5): train_set = csv_reader_dataset(train_filepaths, repeat=n_epochs, n_readers=n_readers, n_read_threads=n_read_threads, shuffle_buffer_size=shuffle_buffer_size, n_parse_threads=n_parse_threads, batch_size=batch_size) for X_batch, y_batch in train_set: with tf.GradientTape() as tape: y_pred = model(X_batch) main_loss = tf.reduce_mean(loss_fn(y_batch, y_pred)) loss = tf.add_n([main_loss] + model.losses) gradients = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables))

givitallugot commented 1 year ago

13.1.5 프리페치

concatenate() # 선택한 축(axis)의 방향으로 배열을 연결해주는 메서드
zip() # 동일 개수로 이루어진 자료형을 묶어 주는 함수
window() # 그룹 된 행들을 대상으로 작업을 수행헤 각 그룹된 행들에 대한 하나의 값을 반환
reduce() # 여러 개의 데이터를 대상으로 주로 누적 집계를 내기 위해서 사용
flat_map() # dataset에 함수를 apply해주고, 결과를 flatten하게 펼쳐줌
padded_batch() # 입력데이터의 크기가 가변 일때 같은 크기로 읽을 수 있게 변환해 주는 함수

# 클래스 메서드
from_generator() # 한번에 데이터를 메모리에 다 로딩하는 것이 아니고, 필요할 때만 generator를 통해서 데이터를 가져올 수 있음
njs03332 commented 1 year ago

13.1.3 데이터 전처리

X_mean, X_std = [...]  # 훈련 세트에 있는 각 특성의 평균과 표준편차
n_inputs = 8

def preprocess(line):
    defs = [0.] * n_inputs + [tf.constant([], dtype=tf.float32)]
    fields = tf.io.decode_csv(line, record_defaults = defs)
    x = tf.stack(fields[:-1])
    y = tf.stack(fields[-1:])
    return (x - X_mean) / X_std, y
>>> preprocess(b'4.2083,44.0,5.3232,0.9171,846.0,2.3370,37.47,-122.2,2.782')
(<tf.Tensor: shape=(8,), dtype=float32, numpy=
 array([ 0.16579159,  1.216324  , -0.05204564, -0.39215982, -0.5277444 ,
        -0.2633488 ,  0.8543046 , -1.3072058 ], dtype=float32)>,
 <tf.Tensor: shape=(1,), dtype=float32, numpy=array([2.782], dtype=float32)>)