8.3. Mô Hình Ngôn Ngữ Và Tập Dữ Liệu - Đắm Mình Vào Học Sâu

8.3.4.2. Phân tách Tuần tự¶

Ngoài phép lấy mẫu ngẫu nhiên từ chuỗi gốc, chúng ta cũng có thể làm hai minibatch ngẫu nhiên liên tiếp có vị trí liền kề nhau trong chuỗi gốc.

# Saved in the d2l package for later use def seq_data_iter_consecutive(corpus, batch_size, num_steps): # Offset for the iterator over the data for uniform starts offset = random.randint(0, num_steps) # Slice out data - ignore num_steps and just wrap around num_indices = ((len(corpus) - offset - 1) // batch_size) * batch_size Xs = np.array(corpus[offset:offset+num_indices]) Ys = np.array(corpus[offset+1:offset+1+num_indices]) Xs, Ys = Xs.reshape(batch_size, -1), Ys.reshape(batch_size, -1) num_batches = Xs.shape[1] // num_steps for i in range(0, num_batches * num_steps, num_steps): X = Xs[:, i:(i+num_steps)] Y = Ys[:, i:(i+num_steps)] yield X, Y

Sử dụng các đối số như ở trên, ta sẽ in đầu vào X và nhãn Y cho mỗi minibatch sau khi phân tách tuần tự. Hai minibatch liên tiếp sẽ có vị trí trên chuỗi ban đầu liền kề nhau.

for X, Y in seq_data_iter_consecutive(my_seq, batch_size=2, num_steps=6): print('X: ', X, '\nY:', Y) X: [[ 1. 2. 3. 4. 5. 6.] [15. 16. 17. 18. 19. 20.]] Y: [[ 2. 3. 4. 5. 6. 7.] [16. 17. 18. 19. 20. 21.]] X: [[ 7. 8. 9. 10. 11. 12.] [21. 22. 23. 24. 25. 26.]] Y: [[ 8. 9. 10. 11. 12. 13.] [22. 23. 24. 25. 26. 27.]]

Hãy gộp hai hàm lấy mẫu theo hai cách trên vào một lớp để duyệt dữ liệu trong Gluon ở các phần sau.

# Saved in the d2l package for later use class SeqDataLoader: """A iterator to load sequence data.""" def __init__(self, batch_size, num_steps, use_random_iter, max_tokens): if use_random_iter: self.data_iter_fn = d2l.seq_data_iter_random else: self.data_iter_fn = d2l.seq_data_iter_consecutive self.corpus, self.vocab = d2l.load_corpus_time_machine(max_tokens) self.batch_size, self.num_steps = batch_size, num_steps def __iter__(self): return self.data_iter_fn(self.corpus, self.batch_size, self.num_steps)

Cuối cùng, ta sẽ viết hàm load_data_time_machine trả về cả iterator dữ liệu và bộ từ vựng để sử dụng như các hàm load_data khác.

# Saved in the d2l package for later use def load_data_time_machine(batch_size, num_steps, use_random_iter=False, max_tokens=10000): data_iter = SeqDataLoader( batch_size, num_steps, use_random_iter, max_tokens) return data_iter, data_iter.vocab

Từ khóa » Tách Từ N-gram