Khi sử dụng thư viện TensorFlow, chúng ta cần nắm rõ một số khái niệm sau:

1) Tensor

Như đã giới thiệu khái quát trong bài Giới thiệu về TensorFlow, Tensor là một kiểu dữ liệu dạng mảng có nhiều chiều và tất cả các loại dữ liệu trong TensorFlow đều được quy về Tensor. Số chiều của Tensor được gọi là Rank còn Shape biểu thị cho độ dài của từng chiều (Shape được viết dưới dạng Array).

Ví dụ:

– Tensor = 8 có rank=0 và shape=[]

– Tensor=[2, 5, 8] có rank=1 và shape=[3]

– Tensor=[[2, 5, 8] , [3, 5, 9]] có rank=2 và shape=[2, 3]

– Tensor=[[[2, 5, 8] ], [[3, 5, 9]]] có rank=3 và shape=[2, 1, 3]

Lưu ý:

– Tensor có rank=0 được gọi là Scalar, rank=1 là Vector, rank=2 là Matrix. Nếu rank>2 thì được gọi chung là N-Tensor

– Số rank chính bằng số lần xuất hiện dấu ‘[‘ tính đến giá trị khác ‘[‘

– Để lấy giá trị Rank và Shape của một Tensor ta có thể sử dụng hàm .rank() và .shape() như sau:

2) Graph

TensorFlow chia hoạt động của các chương trình theo hai bước là Xây dựng Computational Graph (sử dụng tf.Graph) và chạy Computational Graph (sử dụng tf.Session). Như chúng ta đã biết, một Graph được hình thành bởi các Nodes và Edges (các Edges được dùng để kết nối các Nodes với nhau). Trong TensorFlow thì Nodes là các Ops(tf.Operation) còn Edges chính là các Tensors(tf.Tensor). Các Ops ở đây có thể là add, mul, log, matmul,..… (các bạn tham khảo thêm danh sách Ops tại đây). Trong Graph dưới đây, ta thấy các Node là các Ops như Mul, Add còn các Edges là các Tensors có giá trị như 5, 3, 8, 15, 23.

Dưới đây là đoạn code mô tả cách tạo Graph trên trong TensorFlow:

Chạy đoạn code trên ta được kết quả sau:

Ta thấy rằng kết quả hiển thị không giống như trong hình vẽ, do ở đây chúng ta chỉ mới xây dựng Graph mà chưa tiến hành chạy Graph này. Các Tensor ở đây (a, b, c, d, e) chỉ là các Objects đại diện cho các Ops sẽ được thực hiện và giá trị thực tế chỉ được tính toán khi chúng ta chạy chương trình bằng cách sử dụng Session.

Lưu ý: Mỗi một Op trong TensorFlow có một tên định danh riêng và không phụ thuộc vào tên của Object. Tên định danh này được đặt theo tên của Op và index của nó. Trong ví dụ trên là “Mul_1:0”, “Add_2:0”,..

3) Session

Như đã mô tả ở phần trên, sau khi định nghĩa xong một Graph chúng ta phải tiến hành tạo một phiên làm việc để thực thị các Ops và tính toán giá trị của các Tensor. Công việc này được thực hiện bởi tf.Session và sử dụng sess.run() như sau:

Chạy đoạn code trên, ta được kết quả sau:

Lưu ý: các bạn có thể sử dụng TensorBoard để mô hình hóa Graph trong TensorFlow (tham khảo cách sử dụng TensorBoard với Google Colab tại đây)

4) Một số loại Tensors thông dụng

TensorFlow cung cấp các dạng Tensor khác nhau. Tuy nhiên, chúng ta thường sử dụng 3 loại Tensor chính là:

a) Constant Tensor

Constant Tensor là một Tensor có giá trị là một hằng số, được tạo ra bằng cách sử dụng tf.constant với cú pháp sau:

b) Variable

Khác với Constant Tensor ở trên, Variables là các Tensor mà giá trị của nó có thể bị thay đổi khi tiến hành chạy các Ops. Thông thường có hai cách để tạo Variables là sử dụng tf.Variable() hoặc sử dụng tf.get_variable() (TensorFlow khuyến cáo người dùng nên sử dụng cách thứ hai) và trong cả hai cách này chúng ta đều cần phải cung cấp giá trị khởi tạo ban đầu như sau:

Lưu ý: Ở trên, chúng ta mới tiến hành định nghĩa các variables. Để có thể sử dụng các variables này, chúng ta cần phải khởi chạy chúng trong session sử dụng tf.global_variables_initializer() hoặc khởi chạy từng variable như sau: (đối với High level APIs như Keras, tf.contrib.slim, tf.estimator.Estimator,.. thì các variables sẽ được tự động khởi chạy trước khi tiến hành quá trình huấn luyện):

c) Placeholder

Trong trường hợp chúng ta không biết giá trị cũng như shape của dữ liệu ban đầu thì chúng ta có thể sử dụng Placeholder để tạo một Tensor và truyền dữ liệu vào sau bằng cách sử dụng tham số feed_dict trong sess.run().

tf.placeholder có cú pháp như sau:

Ở đây chúng ta phải truyền tham số đầu vào dtype, và do đó chúng ta không thể thay đổi định dạng dữ liệu của một Placeholder Tensor. Tuy nhiên tham số shape là optional, do đó ngoài việc thay đổi giá trị của Placeholder Tensor, chúng ta còn có thể thay đổi cả shape của dữ liệu.

Đoạn code sau mô tả việc định nghĩa và sử dụng Placeholder:

Như vậy, trong bài tutorial này, chúng ta đã cùng tìm hiểu một số khái niệm cơ bản trong TensorFlow và thực hành viết chương trình định nghĩa một Graph và tiến hành chạy Graph này với tf.Session. Các bạn có thể tham khảo Notebook của tutorial này tại đây.

Tháng Ba 22, 2019
ITechSeeker