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

Các toán tử cơ bản trong Tensorflow
Các toán tử cơ bản trong Tensorflow
Bài số 3 trong 6 bài của series Thư viện Tensorflow

Chào tất cả các bạn, trong bài viết này Nguyễn Văn Hiếu Blog tiếp tục trình bày series về khóa học Tensorflow. Nếu bạn chưa nắm được thông tin tutorial này, bạn hãy xem bài viết giới thiệu trước tiên nhé. Bài đầu tiên sẽ mô tả chi tiết thông tin về khóa học này, các yêu cầu với người học, cài đặt môi trường và danh sách các bài học từ đầu đến cuối.

Bài học trước: Tổng quan về thư viện 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

Biểu diễn graph trên TensorBoard
Biểu diễn graph trên TensorBoard

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 dùng lazy loading
TensorBoard của chương trình TF không có 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

Bài tiếp theo: Xây dựng linear regression model sử dụng Tensorflow

Các bài viết trong SeriesBài trước: [Khóa học tensorflow] Bài 1 – Tổng quan về thư viện TensorflowBài sau: [Khóa học tensorflow] Bài 3 – Xây dựng mô hình linear regression
avatar
  Subscribe  
newest oldest most voted
Notify of
Huynh Hoang Huy
Guest
Huynh Hoang Huy

Chào anh, sao em không thể tạo được 2 cái tensorboard giống 2 hình cuối của anh vậy ạ? (nó chỉ ra x và y, không ra operator “add” và mũi tên chĩa ra init ạ)

Macro Phượng
Member
Macro Phượng

Cho mình hỏi bạn đang sử dụng tensor và python phiên bản nào thế. Mình chạy code của bạn ra lỗi như sau:
RuntimeError: The Session graph is empty. Add operations to the graph before calling run().