Open njs03332 opened 1 year ago
assign roles -s 0331 -c 13.1.3~4 13.1.5 13.1.6
0 | 1 | 2 | |
---|---|---|---|
member | 김유리 | 주선미 | 한단비 |
chapter | 13.1.3~4 | 13.1.5 | 13.1.6 |
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은 레이블이 없음 (있어도 케라스가 무시함)
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))
@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))
prefetch(1)을 호출하면 데이터셋은 항상 한 배치가 미리 준비되도록 최선을 다함
이는 훈련 알고리즘이 한 배치로 작업을 하는 동안 이 데이터셋이 동시에 다음 배치를 준비
성능을 크게 향상 (프리페치와 멀티스레드로 데이터를 적재하고 전처리하면 GPU를 거의 100% 활용 가능)
데이터셋이 메모리에 모두 들어갈 정도로 작다면 RAM에 모두 캐싱할 수 있는 cache() 메서드를 사용하여 훈련 속도를 크게 높일 수 있음
일반적으로 데이터를 적재하고 전처리한 후 셔플링, 반복, 배치, 프리페치 전에 캐싱 수행
많이 사용하는 데이터셋 메서드
concatenate() # 선택한 축(axis)의 방향으로 배열을 연결해주는 메서드
zip() # 동일 개수로 이루어진 자료형을 묶어 주는 함수
window() # 그룹 된 행들을 대상으로 작업을 수행헤 각 그룹된 행들에 대한 하나의 값을 반환
reduce() # 여러 개의 데이터를 대상으로 주로 누적 집계를 내기 위해서 사용
flat_map() # dataset에 함수를 apply해주고, 결과를 flatten하게 펼쳐줌
padded_batch() # 입력데이터의 크기가 가변 일때 같은 크기로 읽을 수 있게 변환해 주는 함수
# 클래스 메서드
from_generator() # 한번에 데이터를 메모리에 다 로딩하는 것이 아니고, 필요할 때만 generator를 통해서 데이터를 가져올 수 있음
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)>)
def csv_reader_dataset(filepaths, repeat=1, n_readers=5,
n_read_threads=None, shuffle_buffer_size=10000,
n_parse_threads=5, batch_size=32):
dataset = tf.data.Dataset.list_files(filepaths).repeat(repeat)
dataset = dataset.interleave(
lambda filepath: tf.data.TextLineDataset(filepath).skip(1),
cycle_length=n_readers, num_parallel_calls=n_read_threads)
dataset = dataset.shuffle(shuffle_buffer_size)
dataset = dataset.map(preprocess, num_parallel_calls=n_parse_threads)
dataset = dataset.batch(batch_size)
return dataset.prefetch(1)