unlike Language model we use only last output and put it into softmax to predict what kind of language is it
we first extract ascii code and then we feed them to embedding matrix.
def str2ascii_arr(msg):
arr = [ord(c) for c in msg]
return arr, len(arr)
# pad sequences and sort the tensor
def pad_sequences(vectorized_seqs, seq_lengths):
seq_tensor = torch.zeros((len(vectorized_seqs), seq_lengths.max())).long()
for idx, (seq, seq_len) in enumerate(zip(vectorized_seqs, seq_lengths)):
seq_tensor[idx, :seq_len] = torch.LongTensor(seq)
return seq_tensor
# Create necessary variables, lengths, and target
def make_variables(names):
sequence_and_length = [str2ascii_arr(name) for name in names]
vectorized_seqs = [sl[0] for sl in sequence_and_length]
seq_lengths = torch.LongTensor([sl[1] for sl in sequence_and_length])
return pad_sequences(vectorized_seqs, seq_lengths)
if __name__ == '__main__':
names = ['adylov', 'solan', 'hard', 'san']
classifier = RNNClassifier(N_CHARS, HIDDEN_SIZE, N_CLASSES)
for name in names:
arr, _ = str2ascii_arr(name)
inp = Variable(torch.LongTensor([arr]))
out = classifier(inp)
print("in", inp.size(), "out", out.size())
inputs = make_variables(names)
out = classifier(inputs)
print("batch in", inputs.size(), "batch out", out.size())
pad_sequences is need since every char array might differ so we pad with zero.
batch in torch size is [4,6]
batch out torch size is [1,4,18] since we have 18 countires to compare.
class RNNClassifier(nn.Module):
# Our model
def __init__(self, input_size, hidden_size, output_size, n_layers=1, bidirectional=True):
super(RNNClassifier, self).__init__()
self.hidden_size = hidden_size
self.n_layers = n_layers
self.n_directions = int(bidirectional) + 1
self.embedding = nn.Embedding(input_size, hidden_size)
self.gru = nn.GRU(hidden_size, hidden_size, n_layers,
bidirectional=bidirectional)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, input, seq_lengths):
# Note: we run this all at once (over the whole input sequence)
# input shape: B x S (input size)
# transpose to make S(sequence) x B (batch)
input = input.t()
batch_size = input.size(1)
# Make a hidden
hidden = self._init_hidden(batch_size)
# Embedding S x B -> S x B x I (embedding size)
embedded = self.embedding(input)
# Pack them up nicely
gru_input = pack_padded_sequence(
embedded, seq_lengths.data.cpu().numpy())
# To compact weights again call flatten_parameters().
self.gru.flatten_parameters()
output, hidden = self.gru(gru_input, hidden)
# Use the last layer output as FC input
# No need to unpack, since we are going to use hidden
fc_output = self.fc(hidden[-1])
return fc_output
def _init_hidden(self, batch_size):
hidden = torch.zeros(self.n_layers * self.n_directions,
batch_size, self.hidden_size)
return create_variable(hidden)
'AI > Pytorch' 카테고리의 다른 글
pytorchZeroToAll) RNN1 (0) | 2021.05.06 |
---|---|
pytorchZeroToAll) CNN , Advanced CNN(inception) (0) | 2021.04.29 |
pytorchZeroToAll) Linear ,Logistic , Wide and Deep (0) | 2021.04.24 |