Chủ Nhật, 21 tháng 4, 2019

[Khóa học tensorflow] Bài 2 – Các toán tử cơ bản trong Tensorflow

Trong bài viết ngày hôm nay, mình sẽ trình bày về các toán tử trong Tensorflow, bao gồm các nội dung sau:
  1. TensorBoard
  2. Constant, Variable, Placeholder, Operations
  3. Lazy loading
Quay lại bài học trước, đây là một đồ thị đơn giản được xây dựng bởi thư viện TF.
Khi thực hiện chạy đoạn lệnh này, bạn sẽ nhận được một Warning: 
The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
Để loại bỏ những Warning như này, bạn chỉ cần set log level sang chỉ hiện thị ERROR bằng cách thêm đoạn lệnh sau vào đầu chương trình
Như trong bài trước mình có cho các bạn xem TensorBoard trình bày đồ thị của chúng ta. Nhưng làm sao có thể làm được điều đó?
Và việc tiếp theo bạn phải làm là run đoạn code này
Sau đó truy cập vào đường dẫn http://localhost:6006/ trên trình duyệt
Và đây là cái mà bạn sẽ nhìn thấy

Constants

Trong các ví dụ ở bài trước và ngay ở ví dụ phía trên, bạn có thể đã thấy chúng ta sử dụng tf.constant để thể hiện một giá trị hằng trong TF. Và đó cũng là cách để thêm một hằng vào đồ thị.
Cú pháp đầy đủ của constant
Ví dụ:

Tạo các Tensor với các giá trị đặc biệt

  • tf.zeros(shape, dtype=tf.float32, name=None)
Tạo một tensor có kích thước là shape, và tất cả các phần tử đều có giá trị 0.
  • tf.zeros_like(input_tensor, dtype=None, name=None, optimize=True)
Tạo một tensor có kích thước và kiểu dữ liệu giống với input_tensor(trừ khi kiểu dữ liệu được chỉ định) và tất cả các phần tử đều có giá trị 0.
Tương tự như 2 hàm trên, nhưng 2 hàm dưới đây sẽ tạo ra các tensor mà mọi phần tử đều có giá trị 1
  • tf.ones(shape, dtype=tf.float32, name=None)
  • tf.ones_like(input_tensor, dtype=None, name=None, optimize=True)

Variables

Có hằng thì phải có biến đúng không nào? Vậy làm sao tạo một biến trong TF?
Bạn có 2 cách để tạo biến trong TF, cả hai đều phải cung cấp giá trị khởi tạo ban đầu.
Có 1 lưu ý nữa: Các biến này bạn đã cung cấp giá trị khởi tạo, nhưng vẫn mới chỉ là định nghĩa. Bạn cần khởi tạo chúng trước khi chạy trong session.

Placeholder

Ngoài constant và Variable, TF còn đưa ra một khái niệm là Placeholder. Tại sao lại cần thêm Placeholder?
Hãy nhớ lại rằng một chương trình TF gồm 2 quá trình: Xây dựng graph và thực thi tính toán trên graph đó. Như vậy, tại bước xây dựng graph thì chúng ta chưa cần biết.
Thí dụ:
Chúng ta cần định nghĩa một hàm f(x,y) = 2 * x + y mà không biết trước giá trị của x và y. Trong trường hợp này, x và y nên là Placeholder. Hay ví dụ sử dụng Placeholder thực tế nhất là input và nhãn của dữ liệu trong các mô hình học giám sát.
Việc sử dụng Placeholder giúp cho chúng ta có thể truyền dữ liệu khác nhau vào đồ thị khi training. Điều này giúp chúng ta có thể sử dụng linh động với nhiều mẫu dữ liệu khác nhau thay vì truyền cứng nhắc.
tf.placeholder(dtype, shape=None, name=None)
Trong ví dụ trên, do a và b là placeholder nên để có thể chạy được. ta cần truyền giá trị vào trước khi chạy. Các biến kiểu placeholder sẽ nhận giá trị thông qua tham số feed_dict là một kiểu dữ liệu dictionary trong python.

Lazy loading trong Tensorflow

Lazy loading là khái niệm mô tả việc chỉ tạo đối tượng khi cần và tạo nó ngay trong session thay vì phải định nghĩa và thêm vào graph trước khi chạy.
Một chương trình TF thông thường
Còn đây là chương trình TF sử dụng lazy loading
Cả 2 đoạn code trên đều cho cùng một output. Tuy nhiên, nếu bạn định nghĩa trước thì hàm init đối tượng đó chỉ cần chạy một lần. Nhưng nếu sử dụng lazy loading, hàm init sẽ được gọi mỗi khi bạn sử dụng nó. Nếu bạn dùng lazy loading nhiều lần, chương trình của bạn sẽ chậm và tốn chi phí để thực thi. Bạn có thể xem biểu diễn của 2 chương trình trên TensorBoard

TensorBoard của chương trình TF dùng lazy loading
TensorBoard của chương trình TF không có lazy loading

Kết luận: Hạn chế sử dụng lazy loading.
Trong bài tiếp theo mình sẽ cùng các bạn đi giải quyết một vài bài toán đơn giản sử dụng tensoflow