Ví dụ 01: Train một phép cộng

Bài này mình sẽ giới thiệu với các bạn một ví dụ đơn giản để làm quen với tensorflow.

Input: hai số thực

Output: tổnghaisốthực

Mục tiêu: Train để model có thể thực hiện cộng hai số thực.

Mô hình của model:

capture-1

Source code

import tensorflow as tf
import numpy as np

batch_size = 1
input_layer = 2
hidden_layer = 5
output_layer = 1
learning_rate = 0.01

#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_layer], dtype=tf.float32)
w2=tf.get_variable(“w2”, [hidden_layer, output_layer], dtype=tf.float32)

#Khai báo model
l1=tf.matmul(input, w1)
l2=tf.matmul(l1, w2)

#Tính loss và train
loss=tf.reduce_mean(0.5*tf.square(target – l2))
optimizer=tf.train.GradientDescentOptimizer(learning_rate)
train_opt=optimizer.minimize(loss)

#Tạo một session
with tf.Session() as sess:
#Khởi tạo giá trị của các parameters (w1, w2)
tf.initialize_all_variables().run()
for i in range(10000):
#Random giá trị cho input và target

x=np.random.random_sample((batch_size, input_layer))
y=np.array([[np.sum(x)]])

#train
#Lấy ra giá trị predict của model (l2) và train model(train_opt)
#Truyền vào giá trị input và target
_output, _ = sess.run([l2, train_opt], feed_dict={input: x , target:y })
if i % 100==0:
print(x, y, _output)

Kết quả

0 [[ 0.36704104 0.71434379]] [[ 1.08138483]] [[ 0.72435409]] 0.0637355
1000 [[ 0.63112473 0.76400415]] [[ 1.39512887]] [[ 1.39563251]] 1.26836e-07
2000 [[ 0.98767198 0.63501923]] [[ 1.62269121]] [[ 1.62257838]] 6.35876e-09
3000 [[ 0.38165326 0.04241553]] [[ 0.42406878]] [[ 0.42406371]] 1.28342e-11
4000 [[ 0.14268065 0.23031255]] [[ 0.37299319]] [[ 0.37299329]] 3.9968e-15
5000 [[ 0.90865944 0.54084765]] [[ 1.44950709]] [[ 1.44950533]] 1.59872e-11
6000 [[ 0.66731106 0.24386042]] [[ 0.91117149]] [[ 0.91116989]] 1.29496e-12
7000 [[ 0.82374591 0.74712057]] [[ 1.57086648]] [[ 1.57086515]] 8.59757e-13
8000 [[ 0.70094555 0.64503272]] [[ 1.34597827]] [[ 1.34597707]] 7.10543e-13
9000 [[ 0.06899652 0.39773195]] [[ 0.46672847]] [[ 0.46672854]] 1.77636e-15

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 })

 

Cài đặt Tensorflow

Hiện tại Tensorflow (v0.9) chỉ hỗ trợ cài đặt trên Linux và MacOS nhưng chưa hỗ trợ trên Windows.
Do đó, phần cài đặt này sẽ hướng dẫn cài đặt trên Ubuntu.

Yêu cầu

  • Phần cứng: RAM ít nhất 4GB (cho laptop),bình thường 8-16GB là ổn. Model càng lớn thì càng cần nhiều RAM
  • GPU rời nếu có NVIDIA 7xx trở lên
  • OS: Ubuntu 14.04 64 bit (Không nên sử dụng 32 bit vì nhiều module chạy yêu cầu RAM >4 GB)
  • Python: 2.7 hoặc 3.4 hoặc 3.5. Trong hướng dẫn này mình sẽ sử dụng python 2.7.
  • Package Manager: pip (cho python)
  • Git (tùy chọn nhưng nên cài)

Cài đặt

sudo apt-get install python-pip python-dev
sudo pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

Test

python
import tensorflow as tf
a=tf.constant(10)
b=tf.constant(32)
sess=tf.Session()
print(sess.run(a+b))

Editor
Các bạn có thể sử dụng Editor như Eclipse (cùng plugin pydev) hoặc PyCharm.
PyCharm hỗ trợ remote Interpreter cho phép mình code trên môi trường Window nhưng chạy trên máy remote (cấu hình cao, chạy Linux). Do đó sẽ thuận tiện cho các bạn hơn.

Ref: https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html

#tensorflow

First blog post

This is your very first post. Click the Edit link to modify or delete it, or start a new post. If you like, use this post to tell readers why you started this blog and what you plan to do with it.