ImageAiCon PP진행중Unreal의 ImageAI공부하기알고리즘 관련 강의 학습사전지식더보기https://inradestrt.tistory.com/680 경사도 사라짐 문제(Vanishing Gradient Problem) & LSTM & GRU경사도 사라짐 문제(Vanishing Gradient Problem)정의경사도 사라짐 문제는 딥러닝 모델을 훈련할 때, 역전파 과정에서 아웃풋 레이어의 에러값이 이전 레이어로 전달될 때기울기(Gradient)가 점점 작inradestrt.tistory.comhttps://inradestrt.tistory.com/681 임베딩 & Char-RNN임베딩 (Embedding)개념 임베딩은 머신러닝, 특히 자연어 처리 문제에서 데이터를 효율적으로 표현하기 위해 사..
파라미터 저장tf.train.Chackpoint 클래스의 인자값으로 저장하고자 하는 tf.kears.Model 인스턴스와 전역 반복횟수를 지정해서 선언한다.ckpt = tf.train.Checkpoint(step=.tf.Variable(0), model=CNN_model) tf.train.ChackpointManager에 인자값으로 선언한 tf.train.Chackpoint 인스턴스와 중간 파라미터를 저장할 경로를 설정한다.ckpt_manager=tf.train.CheckpointManager(ckpt, directory=SAVER_DIR, max_to_keep=5) 파라미터를 저장하고자 하는 시점에 해당 시점의 전역 반복횟수를 인자값으로 선언한tf.train.ChackpointManager의 save ..
임베딩 (Embedding)개념 임베딩은 머신러닝, 특히 자연어 처리 문제에서 데이터를 효율적으로 표현하기 위해 사용되는 기법이다.이는 고차원의 희소 벡터를 저차원의 밀집 벡터로 변환하여 단어 간의 유사성을 반영할 수 있도록한다. 임베딩은 One-Hot Encoding 을 보완하기 위해 생성된 것 이기 때문에,임베딩에 대해 알려면 One-Hot Encoding의 문제점 에 대해 알아야 한다.One-Hot Encoding 의 문제점 머신러닝에서 데이터를 표현하는 일반적인 방법 중 하나는 One-Hot Encoding이다. 그러나, 이 방법에는 몇 가지 문제가 있다. 데이터 표현형태가 Sparse하다.데이터 표현 형태가 희박(Sparse)하다는 문제점인데예를들어 10,000개의 단어사전에 있는 단어들 중 단..
경사도 사라짐 문제(Vanishing Gradient Problem)정의경사도 사라짐 문제는 딥러닝 모델을 훈련할 때, 역전파 과정에서 아웃풋 레이어의 에러값이 이전 레이어로 전달될 때기울기(Gradient)가 점점 작아져서 거의 사라지는 현상을 말한다. 이는 특히 깊은 신경망이나 RNN(순환 신경망) 에서 두드러진다.RNN에서의 경사도 사라짐 문제RNN은 시간 축을 따라 시계열 데이터를 처리하는데,시간이 지남에 따라 초기 데이터의 영향력이 감소하여 장기적인 패턴을 학습하는 데 어려움을 겪는다. 이는 RNN이 장기 기억을 유지하지 못하고, 현재 시간과 가까운 데이터만을 고려하게 만들어 모델 성능을 저하시킨다.LSTM ( Long Short-Term Memory Networks )정의 및 목적LSTM은 R..
ImageAiCon PP진행중Unreal의 ImageAI공부하기알고리즘 관련 강의 학습사전지식더보기https://inradestrt.tistory.com/669 인공신경망(Artificial Neural Networks[ANN])퍼셉트론이전에 인공신경망의 개념을 제안하였지만, 개념적인 시도로써 공학적인 구현을 최초로 제안한 개념무려 1958년에 나온 논문이다. 퍼셉트론 은 생물학적 뉴런을 공학적인 구조로 변형inradestrt.tistory.comhttps://inradestrt.tistory.com/671 오토인코더(Autoencoder)오토인코더 는 대표적인 비지도 학습을 위한 인공신경망 구조 중 하나이다.비지도 학습은 어떤값을 예측하거나 분류하는 목적인 지도학습 과 는 다르게 데이터의 숨겨진 구조를..
max_to_keep : 가장 최근 저장값에서부터 몃번째까지 저장할 것 인지. 5임으로 5개의 모델데이터만 저장
스텝마다 저장
# 10000 Step만큼 최적화를 수행합니다.
while int(ckpt.step) < (10000 + 1):
# 50개씩 MNIST 데이터를 불러옵니다.
batch_x, batch_y = next(train_data_iter)
# 100 Step마다 training 데이터셋에 대한 정확도를 출력하고 tf.train.CheckpointManager를 이용해서 파라미터를 저장합니다.
if ckpt.step % 100 == 0:
ckpt_manager.save(checkpoint_number=ckpt.step)
train_accuracy = compute_accuracy(CNN_model(batch_x)[0], batch_y)
print("반복(Epoch): %d, 트레이닝 데이터 정확도: %f" % (ckpt.step, train_accuracy))
# 옵티마이저를 실행해 파라미터를 한스텝 업데이트합니다.
train_step(CNN_model, batch_x, batch_y)
ckpt.step.assign_add(1)
ckpt_manager.save() : 해당되는 checkpoint에 대한 이름과 경로로 학습데이터 저장
불러오기
# 만약 저장된 모델과 파라미터가 있으면 이를 불러오고 (Restore)
# Restored 모델을 이용해서 테스트 데이터에 대한 정확도를 출력하고 프로그램을 종료합니다.
if latest_ckpt:
ckpt.restore(latest_ckpt)
print("테스트 데이터 정확도 (Restored) : %f" % compute_accuracy(CNN_model(x_test)[0], y_test))
exit()
# 최적화를 위한 function을 정의합니다.
@tf.function
def train_step(model, input, target):
with tf.GradientTape() as tape:
logits = model(input)
loss = sparse_cross_entropy_loss(target, logits)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
return loss
train_step : 훈련 단계를 정의.
model : 훈련할 모델.
input : 입력 데이터.
target : 목표 데이터.
tape : 그래디언트 계산을 위한 테이프.
grads : 계산된 그래디언트.
5. 텍스트 생성 함수
def generate_text(model, start_string):
num_sampling = 4000 # 생성할 글자(Character)의 개수를 지정합니다.
# start_sting을 integer 형태로 변환합니다.
input_eval = [char2idx[s] for s in start_string]
input_eval = tf.expand_dims(input_eval, 0)
# 샘플링 결과로 생성된 string을 저장할 배열을 초기화합니다.
text_generated = []
# 낮은 temperature 값은 더욱 정확한 텍스트를 생성합니다.
# 높은 temperature 값은 더욱 다양한 텍스트를 생성합니다.
temperature = 1.0
# 여기서 batch size = 1 입니다.
model.reset_states()
for i in range(num_sampling):
predictions = model(input_eval)
# 불필요한 batch dimension을 삭제합니다.
predictions = tf.squeeze(predictions, 0)
# 모델의 예측결과에 기반해서 랜덤 샘플링을 하기위해 categorical distribution을 사용합니다.
predictions = predictions / temperature
predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()
# 예측된 character를 다음 input으로 사용합니다.
input_eval = tf.expand_dims([predicted_id], 0)
# 샘플링 결과를 text_generated 배열에 추가합니다.
text_generated.append(idx2char[predicted_id])
return (start_string + ''.join(text_generated))
generate_text : 텍스트를 생성하는 함수.
num_sampling : 생성할 글자의 개수.
input_eval : 시작 문자열을 정수로 변환한 값.
text_generated : 생성된 텍스트를 저장할 리스트.
temperature : 텍스트 생성의 다양성을 조절하는 파라미터.
predicted_id : 예측된 다음 문자.
6. 메인 함수
def main(_):
# Recurrent Neural Networks(RNN) 모델을 선언합니다.
RNN_model = RNN(batch_size=batch_size)
# 데이터 구조 파악을 위해서 예제로 임의의 하나의 배치 데이터 에측하고, 예측결과를 출력합니다.
for input_example_batch, target_example_batch in dataset.take(1):
example_batch_predictions = RNN_model(input_example_batch)
print(example_batch_predictions.shape, "# (batch_size, sequence_length, vocab_size)")
# 모델 정보를 출력합니다.
RNN_model.summary()
# checkpoint 데이터를 저장할 경로를 지정합니다.
checkpoint_dir = './training_checkpoints'
checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")
for epoch in range(num_epochs):
start = time.time()
# 매 반복마다 hidden state를 초기화합니다. (최초의 hidden 값은 None입니다.)
hidden = RNN_model.reset_states()
for (batch_n, (input, target)) in enumerate(dataset):
loss = train_step(RNN_model, input, target)
if batch_n % 100 == 0:
template = 'Epoch {} Batch {} Loss {}'
print(template.format(epoch+1, batch_n, loss))
# 5회 반복마다 파라미터를 checkpoint로 저장합니다.
if (epoch + 1) % 5 == 0:
RNN_model.save_weights(checkpoint_prefix.format(epoch=epoch))
print ('Epoch {} Loss {:.4f}'.format(epoch+1, loss))
print ('Time taken for 1 epoch {} sec\n'.format(time.time() - start))
RNN_model.save_weights(checkpoint_prefix.format(epoch=epoch))
print("트레이닝이 끝났습니다!")
sampling_RNN_model = RNN(batch_size=1)
sampling_RNN_model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))
sampling_RNN_model.build(tf.TensorShape([1, None]))
sampling_RNN_model.summary()
# 샘플링을 시작합니다.
print("샘플링을 시작합니다!")
print(generate_text(sampling_RNN_model, start_string=u' '))
if __name__ == '__main__':
# main 함수를 호출합니다.
app.run(main)