Basic: Mô hình, kiểu dữ liệu, I/O

Mô hình hoạt động của Tensorflow:

  1. Khai báo mô hình “Graph”
  2. Chạy “graph” trên “Session”
  3. Biểu diễn dữ liệu dạng “Tensor”
  4. Trạng thái được lưu trữ trong các biến “Variables”
  5. Sử dụng “Feed” và “Fetch” để truyền dữ liệu, lấy dữ liệu

      Tensorflow biểu diễn quá trình tính toán dạng đồ thị. Các hàm tính toán (operations – ops) chính là các node. Mỗi node (hàm) sẽ sử dụng các đối số truyền vào được biểu diễn dạng “Tensor” để tính toán sau đó trả về dữ liệu dạng Tensor (có thể không trả về dữ liệu)

      Quá trình tính toán (các hàm) được mô hình hóa thành graph, sau đó để thực tế chạy, ta cần đưa graph đó vào “Session”. Tùy vào quy mô ta có thể lựa chọn việc chạy Graph trên phần cứng nào (CPU hay GPU).

Khai báo mô hình “Graph”

import tensorflow as tf
#Tạo một ma trận 1×2
#Thêm ma trận vào graph
#Giá trị của ma trận được trả về biến ‘matrix1’
matrix1 = tf.constant([[1,2]])
#Tương tự trạo ma trận 2×1
matrix2 = tf.constant([[2],[1]])
#Tạo hàm Matmul (nhân ma trận) với hai biến matrix1, matrix2 là tham số
#Giá trị của phép nhân được gán vào biến product
product = tf.matmul(matrix1, matrix2)

Truyền graph vào session

      Quá trình trên chỉ là khai báo graph chứ chương trình chưa chạy, do đó ta cần tạo ra một session cho graph chạy như sau:

# Tạo session
sess = tf.Session()
#Để lấy giá trị của phép nhân ma trận thì ta gọi hàm run(product)
#Tất cả các input của phép nhân (matrix1, matrix2) sẽ được tự động gọi chạy
result = sess.run(product)
print(result)
#==> [[ 12.]]
#Khi thực thi xong công việc, kết thúc session
sess.close()

Làm việc với block

import tensorflow as tf
#Chúng ta có thể gom tất cả quá trình trên vào trong 1 block:
with tf.Session() as sess:
#Lựa chọn chạy trên CPU hay GPU
with tf.device(“/cpu:0”):
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
result = sess.run([product])
print(result)

  1. Kết quả: [array([[ 12.]], dtype=float32)]
  2. session sẽ tự động được đóng sau khi chạy hết.

Biểu diễn dữ liệu dạng Tensor

Tất cả dữ liệu và biến chạy của Tensorflow buộc phải được biểu diễn ở kiểu Tensor. Tensor là một khái niệm chung chung bao gồm: số (scalar), vector, ma trận 2D và các kiểu ma trận lớn hơn 3D, 4D. Một tensor bất kỳ sẽ có 1 kiểu dữ liệu cố định, có rank và shape. Các bạn có thể đọc thêm ở bài này về shape, rank và type.

Khi truyền dữ liệu vào thông qua feed_dict, ta có thể sử dụng kiểu ndarray của numpy. Khi đó, tensorflow sẽ chuyển kiểu ndarray sang Tensor.

Variables

Trạng thái của model được lưu trữ trong các “Variable”. Các bạn có thể đọc bài ở đây về Variables

Cơ chế fetch

Sau khi xây dựng xong graph (model). Ta sẽ sử dụng fetch với hai chức năng chính sau để điều khiển luồng chạy của model.

  • Khai báo dữ liệu nào mình muốn lấy ra.
  • Khai báo hàm muốn chạy trong trường hợp hàm đó không trả về dữ liệu.

#Tạo place holder để dựng model, đây chính là nơi chứa dữ liệu cho model.
input=tf.placeholder(tf.float32, shape=(batch_size,input_layer))
target=tf.placeholder(tf.float32, shape=(batch_size, output_layer))

#Khai báo parameter của model
w1=tf.get_variable(“w1”, [input_layer, hidden_layer1], dtype=tf.float32)
w2=tf.get_variable(“w2”, [hidden_layer1, hidden_layer2], dtype=tf.float32)
w3=tf.get_variable(“w3”, [hidden_layer2, output_layer], dtype=tf.float32)

#Khai báo model
l1=tf.matmul(input, w1)
l2=tf.matmul(l1, w2)
l3=tf.matmul(l2, w3)
l3_sm=tf.nn.softmax(l3)

#Tính loss và train
loss = tf.nn.softmax_cross_entropy_with_logits(l3_sm, target)
optimizer=tf.train.GradientDescentOptimizer(learning_rate)
train_opt=optimizer.minimize(loss)

Với model ở bên trên, khi training, ta không cần lấy dữ liệu do đó ta chỉ cần fetch train_opt với mục đích cho model chạy hết tất cả các quá trình khai báo trong graph.

_ = sess.run([train_opt], feed_dict={input: _input , target: _target })

Tuy nhiên, trong quá trình validation, ta muốn xem tham số accuracy và muốn xem loss của quá trình train có giảm hay không mà không muốn những dữ liệu dùng cho validation thay đổi giá trị của các Variable của model. Ta sẽ chỉ khai báo fetch l3_sm và loss. Khi đó, tensorflow chỉ chạy đến hàm việc tính loss mà không chạy đến (train_opt)

_predict, _loss = sess.run([l3_sm, loss], feed_dict={input: _input , target: _target })

 

Advertisements