Part4-49. 순환 신경망(RNN) - 07. (STEP 2) 순환 신경망에서과 Tensor의 이해
전결합계층의 입출력 텐서

NXI의 형태로 입력하고 NXO형태로 출력
RNN의 입력텐서

NXLXI 형태로 입력 (순차데이터의 길이가 추가됨)
순차데이터의 길이(L)은 길이가 동일하지 않을 수도 있음
따라서 길이가 L보다 짧은 경우 0을 체워줌 (free padding)
앞부분을 0으로 체워야 마지막입력에서 출력을 내기 때문
RNN의 출력텐서
NXLXO의 형태
출력의 뒷부분을 0으로 체우는 이유는 출력이 나오는 시점이 고정되기 때문
Part4-50. 순환 신경망(RNN) - 08. (STEP 2) 순환 신경망의 학습법
BPTT(Backpropagation though time) 데이터입력

NXLXI이 전체데이터일때
BXLXI배치만큼으로 나눔
BPTT의 배치학습법

시간에 대해서 펼쳐있을때
배치로도 펼쳐있어야 한다. 즉 배치만큼 곱해져서 있어야함
시간적으로 펼칠때 메모리가 사용되고, 배치를 펼칠때 메모리가 또 필요
BPTT의 문제점
순차데이터의 길이 L이 클경우 시간펼침이 늘어나면서 필요메모리가 L배 증가함
B개의 샘플을 동시에 계산하기 때문에 얕은 신경망에 비해 더 큰 메모리 필요
다중입력, 다중출력
Truncated BPTT를 이용하면 메모리문제 해결이 가능
L길이를 다 쓰지 않고 T길이만큼만 사용
순차데이터(L)을 일정한 T길이로 잘라서 한번에 계산 하는 크기를 줄임
Truncated BPTT

길이 L의 입력을 길이 T로 쪼개서 순서대로 학습
한번에 역전파가 이뤄지지 않기 때문에 메모리 사용을 줄일 수 있음
Truncated BPTT의 역전파 흐름

문제점. 길이가 T로 쪼개진 Truncation 사이에서는 기울기 역전파가 이뤄지지 않음
T를 넘어갈때 hidden state와 cell state를 전달할 수는 있으나
backpropagation이 이뤄지지 않음
Part4-51. 순환 신경망(RNN) - 09. (STEP 3) 순환 신경망 구현 및 학습
LSTM으로 변경하려면 RNN을 변경해주기만해도 됨
모델정의
EPOCHS = 10
NUM_WORDS = 10000 #만개의 단어만 사용하겠다는 의미
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
#Embedding : 길이가 10000인 one-hot 벡터를 길이가 16인벡터로 바꿔줌
self.emb = tf.keras.layers.Embedding(NUM_WORDS, 16)
self.rnn = tf.keras.layers.LSTM(32)
self.dense = tf.keras.layers.Dense(2, activation='softmax') #IMDB는 영화 감상에 대한 긍/부정 결과가 출력
def call(self, x, training=None, mask=None):
x = self.emb(x)
x = self.rnn(x)
return self.dense(x)
학습, 테스트 루프 정의
# Implement training loop
@tf.function
def train_step(model, inputs, labels, loss_object, optimizer, train_loss, train_accuracy):
with tf.GradientTape() as tape:
predictions = model(inputs, training=True)
loss = loss_object(labels, predictions)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
train_loss(loss)
train_accuracy(labels, predictions)
# Implement algorithm test
@tf.function
def test_step(model, images, labels, loss_object, test_loss, test_accuracy):
predictions = model(images, training=False)
t_loss = loss_object(labels, predictions)
test_loss(t_loss)
test_accuracy(labels, predictions)
데이터셋 준비(IMDB)
imdb = tf.keras.datasets.imdb
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=NUM_WORDS)
x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train,
value=0,
padding='pre',
maxlen=32)
x_test = tf.keras.preprocessing.sequence.pad_sequences(x_test,
value=0,
padding='pre',
maxlen=32)
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)
학습환경정의
# Create model
model = MyModel()
# Define loss and optimizer
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adam()
# Define performance metrics
train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')
test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')
학습루프 동작
for epoch in range(EPOCHS):
for seqs, labels in train_ds:
train_step(model, seqs, labels, loss_object, optimizer, train_loss, train_accuracy)
for test_seqs, test_labels in test_ds:
test_step(model, test_seqs, test_labels, loss_object, test_loss, test_accuracy)
template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
print(template.format(epoch + 1,
train_loss.result(),
train_accuracy.result() * 100,
test_loss.result(),
test_accuracy.result() * 100))
train_loss.reset_states()
train_accuracy.reset_states()
test_loss.reset_states()
test_accuracy.reset_states()
'책&강의 학습 > 올인원 패키지 :딥러닝&인공지능' 카테고리의 다른 글
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 46회차 미션 (0) | 2020.08.13 |
|---|---|
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 45회차 미션 (0) | 2020.08.12 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 43회차 미션 (0) | 2020.08.10 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 42회차 미션 (0) | 2020.08.09 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 41회차 미션 (0) | 2020.08.08 |
댓글