Kiểu dữ liệu

Giống như Python, TensorFlow cũng trang bị cho mình một tập hợp các kiểu dữ liệu dùng cho các mục đích khác nhau. Bảng dưới đây trình bày các kiểu dữ liệu trong TensorFlow:

Các kiểu dữ liệu được thiết kế trong TensorFlowNumpy sao cho có thể trao đổi với nhau một cách dễ dàng nhất, ví dụ tf.int32np.int32 là tương đương nhau. Tuy nhiên, có một số chú ý quan trọng sau trong quá trình sử dụng các kiểu dữ liệu qua lại giữa TensorFlow, Numpy và các kiểu chung trong Python:

  • Liên quan tới kiểu chuỗi, trong TensorFlow có kiểu string nhưng trong Numpy không có kiểu dữ liệu tương đương.
  • NumpyTensorFlow đều là các thư viện thao tác với các đối tượng là các mảng n chiều (ndarray). Tuy nhiên, Numpy không hỗ trợ các phương thức để tạo các hàm tensor và tính toán các dẫn xuất một cách tự động cũng như không hỗ trợ GPU. Điều này trong TensorFlow là rất ổn.
  • Các kiểu dữ liệu trong TensorFlow được thể hiện một cách cụ thể hơn so với các kiểu dữ liệu trong Python. Ví dụ kiểu số nguyên trong Python là int hay long nhưng trong TensorFlow được thể hiện một cách rõ ràng hơn là tf.int8, tf.int16, tf.int32, v.v.

Chiếc bẫy của Lazy Loading

Lazy Loading là kĩ thuật phổ biến trong lập trình dùng để trì hoãn (defer) khai báo hay khởi tạo một đối tượng cho đến khi đối tượng được sử dụng. Xem xét đoạn mã sau khi chưa sử dụng Lazy Loading:


import tensorflow as tf

x = tf.Variable(10, name='x')

y = tf.Variable(20, name='y')

# tạo toán tử add trước khi dùng

z = tf.add(x, y)

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    writer = tf.summary.FileWriter("normalloading",sess.graph)

    for _ in range(10):

       sess.run(z)

     writer.close()

Xem kết quả thực thi trên TensorBoard (xem lại bài https://ngocminhtran.com/2019/03/01/truc-quan-hoa-du-lieu-dung-tensorboard/ )

Bây giờ chúng ta sẽ thay đổi đoạn mã trên dùng Lazy Loading:


import tensorflow as tf


x = tf.Variable(10, name='x')

y = tf.Variable(20, name='y')

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    writer = tf.summary.FileWriter("lazyloading",sess.graph)

    for _ in range(10):

        sess.run(tf.add(x, y))# tạo toán tử add chỉ khi cần dùng

    writer.close()

Kết quả từ TensorBoard:

Chúng ta nhận thấy sự khác biệt từ hai cách. Khi dùng Lazy Loading sẽ không có nút Add vì chúng ta thêm nút Add sau khi đã viết graph đến FileWriter. Điều này gây khó khăn cho việc đọc graph nhưng là một bất tiện không đáng kể. Vậy đâu là nguy hiểm lớn nhất từ Lazy Loading? Để hiểu điều này chúng ta viết lại đoạn mã khi chưa dùng Lazy Loading:


import tensorflow as tf

x = tf.Variable(10, name='x')

y = tf.Variable(20, name='y')

z = tf.add(x, y)

with tf.Session() as sess:

   sess.run(tf.global_variables_initializer())

   for _ in range(10):

        sess.run(z)

   print (sess.run(tf.get_default_graph().as_graph_def()))

Ở đây chúng ta dùng tf.get_default_graph().as_graph_def()) để in ra màn hình định nghĩa graph thay vì dùng TensorBoard. Kết quả nút Add chỉ in ra màn hình một lần:


...

node {

   name: "Add"

   op: "Add"

   input: "x/read"

   input: "y/read"

   attr {

     key: "T"

     value {

        type: DT_INT32

     }

   }

}

Áp dụng cách thức tương tự cho đoạn mã dùng Lazy Loading:


import tensorflow as tf

x = tf.Variable(10, name='x')

y = tf.Variable(20, name='y')

with tf.Session() as sess:

     sess.run(tf.global_variables_initializer())

     for _ in range(10):

     sess.run(tf.add(x, y))

     print (sess.run(tf.get_default_graph().as_graph_def()))

Kết quả:


...

node {

   name: "Add_8"

   op: "Add"

   input: "x/read"

   input: "y/read"

   attr {

     key: "T"

     value {

        type: DT_INT32

     }

   }

}

node {

  name: "Add_9"

  op: "Add"

  input: "x/read"

  input: "y/read"

  attr {

     key: "T"

     value {

        type: DT_INT32

     }

   }

}

Với Lazy Loading nút Add được thêm 10 lần. Hãy tưởng tượng trong trường hợp chúng ta phải thực thi toán tử add hàng trăm đến hàng ngàn lần thì nút Add được thêm hàng trăm hay hàng ngàn lần và điều này làm cho graph của chúng ta trở nên cồng kềnh, tải chậm chạp và hao tổn tài nguyên.

Học TensorFlow >