Tự học Tensorflow [P2] - Session, Feeding

Tự học Tensorflow [P2] - Session, Feeding

2019, Feb 26    

Tiếp tục series Tự học Tensorflow [P1] - Tensor, Graph, TensorBoard , hôm nay mình xin chia sẻ tiếp về quá trình học tập của mình. Nếu có gì không đúng mọi người comment ở cuối bài viết nhé :D

Các thành phần chính của Tensorflow

Trong phạm vi bài viết này, mình sẽ đề cập tới những nội dung nằm trong những phần cơ bản của Tensorflow như:

  • tf.Session
  • Feeding

Session

Như đã chia sẻ ở phần Graph, khi print một Tensor sẽ không trả về giá trị của Tensor mà chỉ trả về cấu trúc của Tensor. Việc này giống như một cỗ máy chỉ chạy khi có dòng điện chảy qua, và Session ở đây đóng vai trò như công tác đóng mở dòng điện chảy vào Graph.

Nếu coi tf.Graph như một file .py thì Session chính là lệnh thực thi python. Chúng ta khởi chạy Graph bằng việc gọi đến phương thức run của lớp Session

# total = a + b
sess = tf.Session()
print(sess.run(total))

Biến total đã được ta khởi tạo ở P1. Kết quả trả về:

7.0

Khi một Tensor được đặt bên trong phương thức run, Tensorflow sẽ truy ngược lại xuyên suốt Graph và khởi chạy tất cả các node mà cung cấp đầu vào cho node được yêu cầu. Ở trong ví dụ này khi node total được yêu cầu, Tensorflow sẽ truy ngược tới 2 node cung cấp đầu vào chính là node ab. Chúng ta cũng có thể đặt nhiều node/Tensor vào trong phương thức run bằng tupledict.

print(sess.run({'ab':(a, b), 'total':total}))

Output:

{'total': 7.0, 'ab': (3.0, 4.0)}

Chú ý: Trong suốt quá trình gọi phương trức tf.Session.run thì giá trị của một Tensor là không thay đổi

vec = tf.random_uniform(shape=(3,))
out1 = vec + 1
out2 = vec + 2
print(sess.run(vec))
print(sess.run(vec))
print(sess.run((out1, out2)))

Output:


[ 0.52917576  0.64076328  0.68353939]
[ 0.66192627  0.89126778  0.06254101]
(
  array([ 1.88408756,  1.87149239,  1.84057522], dtype=float32),
  array([ 2.88408756,  2.87149239,  2.84057522], dtype=float32)
)

Dễ thấy dù session gọi tới Tensor vec 2 lần nhưng giá trị của vec vẫn được giữ nguyên vì cả out1out2 đều được gọi đến trong cùng 1 quá trình của sess.run Một vài phương thức của Tensorflow trả lại tf.Operations thay vì tf.Tensor. Khi gọi run tới một tf.Operations sẽ trả lại None vì phương thức chỉ thực hiện việc tính toán chứ không trả về giá trị.

Feeding

Có vẻ tới đây, bạn đã cảm thấy hơi nhàm chán với tf.Graph với những giá trị bất biến. Vậy khi muốn xử lí Graph với một chuỗi giá trị đầu vào thì cần làm gì, giải pháp của chúng ta là tf.placeholder

x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
z = x + y

2 Tensor xy đóng vai trò như 2 arguments đầu vào của một phương thức. Khi gọi tới tf.Session.run chúng ta cần thêm feed_dict để truyền tham số vào cho tf.placeholder

print(sess.run(z, feed_dict={x: 3, y: 4.5}))
print(sess.run(z, feed_dict={x: [1, 3], y: [2, 4]}))

Output:

7.5
[ 3.  7.]

Điểm duy nhất khác nhau giữa tf.placeholdertf.Tensor đó là placeholder sẽ báo lỗi nếu không có giá trị nào được gán cho nó.

Trong phần tiếp theo, mình sẽ giới thiệu về các thành phần khác của Tensorflow, mọi người chú ý đón xem nhé :D

Bài viết được tham khảo và sử dụng hình ảnh từ: