import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
# for reproducibility
torch.manual_seed(100)
<torch._C.Generator at 0x79192b2df150>
1 Dataset Construction
# Dictionary
sample_sentence = 'hi!hello.'
char_set = list(set(sample_sentence))
dic = {c: i for i, c in enumerate(char_set)}
# Parameters
dic_size = len(dic)
input_size = dic_size
hidden_size = dic_size
# Dataset setting
x_batch = []
y_batch = []
x_data = [dic[c] for c in sample_sentence[:-1]]
x_one_hot = [np.eye(dic_size)[x] for x in x_data]
y_data = [dic[c] for c in sample_sentence[1:]]
x_batch.append(x_one_hot)
y_batch.append(y_data)
# To torch tensors
X = torch.FloatTensor(x_batch)
Y = torch.LongTensor(y_batch)
print(X.shape)
print(Y.shape)
다음 3개의 문장을 batch data로 활용해 RNN을 학습해보자 (아래의 미완성 코드, 위 실습코드, 실행결과를 참고)
‘howareyou’
‘whats up?’
‘iamgreat.’
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
# for reproducibility
torch.manual_seed(100)
# Dictionary
sample_sentences = ['howareyou', 'whats up?', 'iamgreat.']
char_set = list(set(''.join(sample_sentences)))
dic = {c: i for i, c in enumerate(char_set)}
# Parameters
dic_size = len(dic)
input_size = dic_size
hidden_size = dic_size
# Dataset setting
input_batch = []
target_batch = []
for sentence in sample_sentences:
# To torch tensors
X = torch.FloatTensor(input_batch)
Y = torch.LongTensor(target_batch)
# Model
learning_rate = 0.05
training_epochs = 500
model = nn.RNN(input_size, hidden_size, batch_first=True)
# define cost/loss & optimizer
criterion = nn.CrossEntropyLoss() # Softmax
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# train
for epoch in range(training_epochs):
result = outputs.data.numpy().argmax(axis=2)
for sentence in result:
print(''.join([char_set[c] for c in np.squeeze(sentence)]))